Back-end/Spring

어노테이션, HandlerMethodArgumentResolver, DTO

yujin0517 2023. 10. 10. 17:32

@Target


자바 어노테이션을 정의할 때 사용되는 메타어노테이션 중 하나이다. 메타어노테이션은 다른 어노테이션을 설명하거나 제한하는데 사용된다. 
1. ElementType.TYPE: 클래스, 인터페이스, 열거형 등에 적용 가능
2. ElementType.FIELD: 필드에 적용 가능
3. ElementType.METHOD: 메서드에 적용 가능
4. ElementType.PARAMETER: 메서드의 파라미터에 적용 가능
5. ElementType.CONSTRUCTOR: 생성자에 적용 가능 


@Retention


어노테이션의 수명을 설정하는데 사용되는 메타어노테이션이다. 
어노테이션이 유지(retained)되는 기간을 지정한다. 
1. RetentionPolicy.RUNTIME: 어노테이션이 런타임에도 사용 가능하다는 것을 명시한다. 
2. RetentionPolicy.SOURCE: 컴파일 시간에만 어노테이션 정보가 유지, 런타임에는 삭제된다.
3. RetentionPolicy.CLASS: 클래스 파일에 어노테이션 정보가 포함되지만, 런타임 시에는 사용할 수 없다. 


@RestController

이 어노테이션은RESTful 웹 서비스를 개발할 때 사용된다.

또한, 스프링 애플리케이션에서 RESTful API를 만들기 위한 핵심적인 요소 중 하나이다.


HandlerMethodArgumentResolver 인터페이스
스프링 프레임워크에서 핸들러 메서드의 파라미터를 해석하고 변환하는 역할을 담당하는 인터페이스이다. 이를 통해 클라이언트의  HTTP 요청 정보를 컨트롤러 메서드의 파라미터로 변환할 수 있다. 
일반적으로 HTTP 요청의 헤더, 경로 변수, 쿼리 파라미터 등의 정보를 가져와서 컨트롤러 메서드의 파라미터로 변환해주는 역할을 한다. 이를 통해 클라이언트의 요청을 처리할 때 유용하게 사용된다. 

1. boolean supportsParameter(MethodParameter parameter):
 이 메서드는 해당 HandlerMethodArgumentResolver가 주어진 파라미터를 처리할 수 있는지 여부를 확인한다. 
  true를 반환하명 해당 파라미터를 처리할 수 있으며, false를 반환하면 처리할 수 없다. 

2. Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception:
  이 메서드는 실제로 파라미터를 해석하고 변환하는 역할을 한다. 
  parameter: 해석할 파라미터 정보
  mavContainer: 뷰와 관련된 컨테이너 객체
  webRequest: 현재 요청 정보를 나타내는 객체
  binderFactory: WebDataBinder를 생성하기 위한 팩토리 객체
  변환된 파라이며를 반환한다. 
 => 실제 바인딩을 할 객체를 반환한다. 

이 인터페이스는 스프링의 MVC 프레임워크에서 주로 사용되며, 클라이언트의 요청을 처리하는 과정에서 중요한 역할을 한다. 


DTO(Data Transfer Object)
계층 간(Controller, Service, Repository) 데이터 전송을 위해 도메인 모델 대신 사용되는 객체 
DTO는 순수하게 데이터를 저장하고, 데이터에 대한  getter, setter만을 가져야한다고 한다. 
DTO는 어떠한 비즈니스 로직을 가져서는 안되며 저장, 검색, 직렬화, 역직렬화 로직만을 가져야 한다. 

도메인 대신 DTO를 사용하는 이유
-> 도메인 모델을 계층 간 전달에 사용하면, UI계층에서 도메인 모델의 메서드를 호출하거나 상태를 변경시킬 수 있다. 또한 UI화면 마다 사용하는 도메인 모델의 정보는 상이하다. 하지만 도메인 모델은 UI에 필요하지 않은 정보까지 가지고 있다. 이런 모든 도메인 모델 속성이 외부에 노출되면 보안 문제가 발생할 수 있다. 
즉, DTO는 도메인 모델을 캡슐화 하여 보호할 수 있다. 
또한 도메인 모델을 계층 간 전송에 사용하면, 모델과 뷰가 강하게 결합될 수 있다. 뷰의 요구사항 변화로 도메인의 코드를 변경해야할 일이 생기는 것은 좋지 않다. DTO를 사용하면 이 결합을 느슨하게 만들 수 있다.