Skip to main content

Spring Web MVC

DispatcherServlet

MVC Context Hierarchyg

Spring MVC는 DispatcherServlet이 애플리케이션의 중심에서 요청 처리를 위해 공유되는 알고리즘을 제공하고 실제 동작은 따로 설정 가능한 대리 컴퍼넌트가 하게 되는 front controller 패턴으로 설계되었다.

기본적인 요청 처리 흐름

  1. DispatcherServlet이 클라이언트로부터 요청을 전달받는다.
  2. DispatcherServletHandlerMapping 인터페이스에게 요청 처리에 적합한 Controller를 찾는 작업을 위임한다.
  3. HandlerMapping으로부터 받은 controller 정보를 바탕으로 DispatcherServletHandlerAdapter 인터페이스에게 해당 controller 클래스 내의 handler 메서드를 호출하는 작업을 위임한다.
  4. HandlerAdapter가 controller 내의 handler를 호출하여 model과 View 정보를 받아오고 이를 바탕으로 DispatcherServlet이 적합한 View 인터페이스를 찾는 작업을 ViewResolver 인터페이스에게 위임한다.
  5. ViewResolver에게 받은 View 정보를 바탕으로 DispatcherServletView에게 응답 데이터 생성(렌더링)을 위임한다.
  6. View로부터 받은 응답 데이터를 DispatcherServlet이 클라이언트로 전달한다.

References

@SpringBootApplication

Using the @SpringBootApplication Annotation

@RequestMapping

Further Reading

HTTP Headers

Custom Headers

REST Clients

HttpMessageConverter

Validation

@Valid, @Validated

  • 핸들러 메서드에서 @Valid@Validated@RequestBody와 같은 매개변수에 써서 인자로 들어오는 객체를 validation할 수 있다.
  • 메서드 매개변수에 @Positive 등 Java Bean Validation API를 사용하려면 클래스나 메서드에 @Validated를 작성해야 한다.
    • 인자로 들어오는 객체 자체를 validation하는 데에는 굳이 클래스, 메서드 단계에 @Validated를 작성할 필요없다.

References

Lombok

@Getter, @Setter, @AllArgsConstructor, @NoArgsConstructor, @Data, @ToString

MapStruct

Gradle Configuration

...
plugins {
...
id "com.diffplug.eclipse.apt" version "3.26.0" // Only for Eclipse
}

dependencies {
...
implementation "org.mapstruct:mapstruct:${mapstructVersion}"
annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"

// If you are using mapstruct in test code
testAnnotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"
}
...

Examples

References

Exception Handling

@ExceptionHandler

@RestControllerAdvice

References

Checked vs Unchecked Exceptions