Skip to content

Commit d665bfb

Browse files
committed
07_SpringMVC 업데이트
1 parent 9756971 commit d665bfb

File tree

1 file changed

+48
-8
lines changed

1 file changed

+48
-8
lines changed

07_SpringMVC/README.md

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# 스프링 웹 기술과 MVC
22

3-
- 스프링 서블릿/스프링 MVC는 스프링이 직접 제공하는 서블릿 기반의 MVC 프레임워크다. 애노테이션 설정과 유연한 핸들러 메소드를 지원하는 스프링 @MVC가 가장 대표적으로 사용되는 스프링 서블릿 기반의 기술이다.
3+
- `스프링 MVC`(스프링 서블릿)는 스프링이 직접 제공하는 서블릿 기반의 MVC 프레임워크다. 애노테이션 설정과 유연한 핸들러 메소드를 지원하는 스프링 @MVC가 가장 대표적으로 사용되는 스프링 서블릿 기반의 기술이다.
44

5-
- 스프링 MVC는 유연한 아키텍쳐를 가지고 장기적으로 많은 인원이 큰 규모의 시스템을 개발할 때 적합한 프레임워크다.
5+
- 스프링 MVC는 유연한 아키텍쳐를 가지고 있으며, 장기적으로 많은 인원이 큰 규모의 시스템을 개발할 때 적합한 프레임워크다.
66

77
- MVC 아키텍쳐는 보통 `프론트 컨트롤러 패턴`과 함께 사용되며, Spring MVC에서는 `DispatcherServlet`이 프론트 컨트롤러 역할을 수행한다.
88

@@ -36,8 +36,25 @@ public class HelloController{
3636
}
3737
```
3838

39-
- `DefaultAnnotationHandlerMappping``/hello` URL로 들어온 요청에 대해서는 해당 컨트롤러의 hello() 메소드를 호출해야 한다고 파악한다.
40-
- `@Controller` 방식으로 구현된 컨트롤러는 DispatcherServlet이 `AnnotationMethodHandlerAdapter`라는 어댑터에게 `HttpServletRequest`를 넘겨준다. 어댑터는 그 정보를 가공하여 `hello`라는 메소드의 인자를 채워 호출한다.
39+
- `DefaultAnnotationHandlerMappping``/hello` URL로 들어온 요청에 대해서는 해당 컨트롤러의 hello() 메소드를 호출해야 한다고 파악한다. 파악한 후에는 `HandlerMapping`에 맞는 `HandlerAdapter`를 사용하여 컨트롤러를 호출한다. 다음의 예시 코드를 보자.
40+
41+
**예시 코드**
42+
43+
```java
44+
public interface HandlerAdapter{
45+
boolean supports(Object handler);
46+
47+
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
48+
49+
long getLastModified(HttpServletRequest request, Object handler);
50+
}
51+
```
52+
53+
- `@Controller` 방식으로 구현된 컨트롤러는 DispatcherServlet이 `AnnotationMethodHandlerAdapter`라는 어댑터에게 `HttpServletRequest`를 넘겨준다.
54+
55+
- `AnnotationMethodHandlerAdapter`는 supports 메소드에 `Controller`를 대입하여 지원할 수 있는지를 파악한 후에 `handle()` 메소드를 수행한다.
56+
57+
- handle 메소드에서는 request를 Controller의 매핑 메소드가 필요로 하는 매개변수로 가공하여 호출한다.
4158

4259
<br>
4360

@@ -119,6 +136,17 @@ public interface View {
119136

120137
### ServletSimpleServletHandlerAdapter
121138

139+
```java
140+
public interface Servlet {
141+
public void init(ServletConfig config) throws ServletException;
142+
public void service(ServletRequest req, ServletResponse res)
143+
throws ServletException, IOException;
144+
public void destroy();
145+
public ServletConfig getServletConfig();
146+
public String getServletInfo();
147+
}
148+
```
149+
122150
- 첫 번째 컨트롤러 타입은 표준 서블릿이다. 즉, javax.servlet.Servlet을 구현한 서블릿 클래스를 스프링 MVC의 컨트롤러로 사용할 수 있다. 단, 서블릿이 컨트롤러 빈으로 등록되는 경우, init(), destroy()와 같은 생명주기 메소드가 호출되지 않는다는 점을 주의하자.
123151

124152
<br>
@@ -131,7 +159,7 @@ public interface HttpRequestHandler{
131159
}
132160
```
133161

134-
-객체를 구현한 클래스를 컨트롤러로 사용한다. 서블릿처럼 동작하는 컨트롤러를 만들기 위해 사용한다. 전형적인 서블릿 스펙을 준수할 필요없이 HTTP 프로토콜을 기반으로 한 전용 서비스를 만들려고 할 때 사용할 수 있다.
162+
-인터페이스를 구현한 클래스를 컨트롤러로 사용한다. **서블릿처럼 동작하는 컨트롤러를 만들기 위해 사용한다.** 전형적인 서블릿 스펙을 준수할 필요없이 HTTP 프로토콜을 기반으로 한 전용 서비스를 만들려고 할 때 사용할 수 있다.
135163

136164
- 모델과 뷰 개념이 없는 HTTP 기반의 `RMI(Remote Method Invocation: 원격 메소드 호출)`과 같은 로우레벨 서비스를 개발할 때 사용할 수 있다.
137165

@@ -155,7 +183,7 @@ public interface Controller{
155183

156184
- 스프링 MVC에서 가장 인기 있는 컨트롤러 작성 방법이다.
157185

158-
- `AnnotationMethodHandlerAdapter`는 지원하는 컨트롤러의 타입에 제한이 없다는 특징이 있다. 대신 클래스에 붙은 몇가지 애노테이션의 정보와 메소드 이름, 파라미터, 리턴 타입에 대한 규칙 등을 종하바여 컨트롤러를 선별하고 호출하는 방식을 결정한다.
186+
- `AnnotationMethodHandlerAdapter`는 지원하는 컨트롤러의 타입에 제한이 없다는 특징이 있다. 대신 클래스에 붙은 몇가지 애노테이션의 정보와 메소드 이름, 파라미터, 리턴 타입에 대한 규칙 등을 종합하여 컨트롤러를 선별하고 호출하는 방식을 결정한다.
159187

160188
- `AnnotationMethodHandlerAdapter`의 또다른 특징은 URL 매핑을 컨트롤러 단위가 아니라 `메소드 단위`로 가능하게 했다. 그래서 Adapter의 이름에도 Method가 붙어있다.
161189

@@ -218,7 +246,7 @@ public class HelloController implements Controller{ ... }
218246
219247
### SimpleUrlHandlerMapping
220248
221-
- `BeanNameUrlHandlerMapping`은 매핑 정보를 관리하기 불편하다는 단점이 있는데, 이를 극복하기 위해 매핑 정보를 한 곳에 모아놓을 수 있도록 해주는 핸들러 매핑 전략이다.
249+
- `BeanNameUrlHandlerMapping`은 매핑 정보를 관리하기 불편하다는 단점이 있는데, 이를 극복하기 위해 매핑 정보를 한 곳에 모아놓을 수 있도록 해주는 핸들러 매핑 전략이다. 컨트롤러의 개수가 많은 프로젝트에서 선호될 수 있으나, 빈의 이름을 직접 타이핑해야 하기 때문에 타입 세이프하지 않다는 단점이 있다.
222250
223251
<br>
224252
@@ -243,6 +271,8 @@ public class HelloController implements Controller{ ... }
243271
244272
- 핸들러 인터셉터는 그 적용 대상이 DispatcherServlet의 특정 핸들러 매핑으로 제한된다는 제약이 있지만, 스프링의 빈으로 등록할 수 있고, 컨트롤러 오브젝트에 접근이 가능하며, ModelAndView와 같은 컨트롤러가 리턴하는 정보를 활용할 수 있다는 장점이 있다.
245273
274+
**사용방법은 추후에 작성**
275+
246276
<br><hr>
247277
248278
## 뷰
@@ -377,7 +407,17 @@ public class HelloCon{
377407
378408
### ResponseStatusExceptionResolver
379409
380-
- 예외를 특정 HTTP 응답 상태 코드로 전환해주는 디폴트 핸들러 예외 리졸버이다.
410+
- 예외 발생 시 단순한 500에러 대신, 특정 HTTP 응답 상태 코드로 전환해주는 디폴트 핸들러 예외 리졸버이다.
411+
412+
- `ResponseStatusExceptionResolver`는 발생한 예외 클래스에 `@ResponseStatus`가 있는지 확인하고, 만약 있다면 애노테이션에 지정해둔 HTTP 응답 상태 코드와 reason을 넘겨줄 수 있다.
413+
414+
**예시 코드**
415+
416+
```java
417+
@ResponseStatus(value=HttpStatus.SERVICE_UNAVAILABLE, reason="서비스 일시 중지"
418+
public class NotInServiceException extends RuntimeException {
419+
}
420+
```
381421
382422
<br>
383423

0 commit comments

Comments
 (0)