Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

springstudy

Enum Converting

Enum 을 원하는 대로 적절하게 컨버팅하는 방법을 설명합니다.

  • Enum 형태는 YesNo / User.Grade 로 확인 가능합니다.
  • 정의한 Enum을 공통적으로 처리할 필요가 있는 부분이 있어(CustomEnumType/YesNoConverter/StringToEnumConverterFactory)
    BaseEnum 인터페이스를 상속하였습니다.

Converting 발생하는 부분 / 예시

Http Request -> Controller(input parameter)

ex) "Y"(String) -> Yes(Enum)

Controller(return value) -> Http Response

ex) Yes(Enum) -> "Y"(String)

JPA Entity -> DB

ex) Yes(Enum) -> "Y"(String)

DB -> JPA Entity

ex) "Y"(String) -> Yes(Enum)

Converting 설정

Http Request -> Controller(input parameter)

@RequestBody 가 선언된 parameter 의 경우 jackson converter(MappingJacson2HttpMessageConverter)가 동작합니다.
Enum 의 code 값에 @JsonValue 를 선언하여 deserializing 에 사용되도록 합니다.

Controller(return value) -> Http Response

이전의 선언(@JsonValue)으로 serializing 에도 적용되므로 따로 설정할 부분이 없습니다.

JPA Entity <-> DB

Entity 에 정의된 Enum 필드에 @Type 을 선언하여 CustomEnumType 을 통해 컨버팅될 수 있도록 합니다.(User 엔티티 참고)
YesNo 처럼 여러 Entity 에서 자주 사용될 가능성이 있는 Enum 은 자동 컨버팅 될 수 있도록 javax.persistence.AttributeConverter 를 상속하여 컨버터를(YesNoConverter) 구현하는게 편리할 수 있습니다.

추가 정보

  • @RequestParam 이 선언된 parameter 의 경우 jackson converter 가 동작하지 않고 컨테이너에 내장된 converter(Converter 혹은 ConverterFactory 구현 클래스)가 동작하므로, 우리가 정의한 Enum 에 대한 ConverterFactory 를 따로 구현하여 FormatterRegistry 에 등록해야 합니다.
    (StringToEnumConverterFactory/WebMvcConfig 소스 참고)
  • Controller 의 return value 는 항상 jackson converter 가 동작합니다. 이유는 UserController 의 @RestController 설정으로 인해 모든 메서드에 @ResponseBody 가 적용되어 있기 때문입니다.
  • 스프링 DispatcherServlet 프로세스
    1. 요청 정보를 통해 적절한 HandlerMapping 을 찾아서 HandlerExcutionChain 을 생성합니다.
      • HandlerMapping 은 HandlerExcutionChain 을 생성해주는게 주된 역할입니다.
        • 실제 주로 사용되는 HandlerMapping 인 RequestMappingHandlerMapping 은 요청의 http method 와 url 정보를 토대로 대상 Controller를 찾습니다.
      • HandlerExcutionChain 은 HandlerMethod + Interceptor 목록을 가지고 있습니다.
      • HandlerMethod 는 대상 Controller의 class/method/parameter 메타 정보 + 실행가능한 Controller Bean 을 가지고 있습니다.
    2. HandlerExcutionChain 의 HandlerMethod 를 통해 HandlerAdapter 를 선정합니다.
    3. HandlerExcutionChain 내부의 Interceptor 목록의 preHandler() 메서드를 각각 실행합니다.
    4. HandlerAdapter 를 통해 대상 Controller 실행시킵니다.
    5. HandlerExcutionChain 내부의 Interceptor 목록의 postHandler() 메서드를 각각 실행합니다.
    6. HandlerExcutionChain 내부의 Interceptor 목록의 afterCompletion() 메서드를 각각 실행합니다.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages