RequestMapping 어노테이션은 설정이 쉽고 간편하며 가장 많이 사용하는 어노테이션 중 하나다. 그리하여 설정하는 방법이 아닌 기본적인 속성을 중점적으로 다루었다.
@RequestMapping
해당 어노테이션은 클래스와 메소드 레벨에서 모두 사용할 수 있다.
대부분의 경우 메소드 레벨의 응용 프로그램은 HTTP 메소드별 종류 중 하나를 사용하는 것을 선호한다.(get, post, delete, put 등등)
많은 *meta-annotation이 정의 되어 있는 것을 볼 수 있다.
*meta-annotation : 다른 annation 에서도 사용되는 annotation
@see
관련 항목으로 외부 링크 또는 텍스트를 표시하거나, 다른 필드나 메소드에 대한 모든 참조 링크를 나타내는 경우에 사용한다.
작성 위치 : 개요, 패키지, 클래스, 인터페이스, 필드, 메소드
중복 작성 : 가능
출력 형식 : 관련 항목
Java Doc의 See Also 부분을 보면 다른 메소드에 대한 참조 링크가 나와있다.
@Target
어노테이션을 적용할 위치를 나타내는 태그
enum ElementType 형식을 입력할 수 있다.
ElementType.Type (클래스 선언), ElementType.METHOD (메소드 선언) 때에 사용한다는 의미이며
아래와 같은 종류가 있다.
ElementType.TYPE | 클래스, 인터페이스(어노테이션 타입 포함), enum, record 선언 |
ElementType.PACKAGE | 패키지 선언 |
ElementType.CONSTRUCTOR | 생성자 선언 |
ElementType.TYPE_PARAMETER | 전달인자 타입 선언 |
ElementType.FIELD | 멤버 변수 선언 |
ElementType.LOCAL_VARIABLE | 지역 변수 선언 |
ElementType.PARAMETER | 전달인자 선언 |
ElementType.ANNOTATION_TYPE | 어노테이션 타입 선언 |
ElementType.TYPE_USE | 타입 선언 |
ElementType.MODULE | 모듈 선언 |
@Retention
어노테이션이 적용되고 유지 되는 범위
RetentionPolicy.RUNTIME | 컴파일러에 의해 클래스 파일에 기록, JVM에 의해 유지 가능 |
RetentionPolicy.CLASS | 클래스 파일에 기록되나 런타임에 사라짐 |
RetentionPolicy.SOURCE | 컴파일러에 의해 삭제 (컴파일러 전까지) |
@Documented
JavaDoc에 문서화됨을 나타냄(해당 어노테이션을 사용하는 어노테이션의 코드 문서에 나타남)
@interface
어노테이션 타입 선언은 특별한 종류의 인터페이스로 일반적인 인터페이스와 구분하기 위해 선언한다. 모든 어노테이션은 자동적으로 java.lang.Annotation 인터페이스를 상속하며 내부의 메소드들은 abstract 키워드가 자동으로 붙게된다.
@RequestMapping 에 정의된 속성
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
String name() | 이름 매핑 (# 을 통한 결합) |
String[] value() | URL 패턴 지정 (default) |
String[] path() | URL 패턴 지정 |
RequestMethod[] method() | Http 메서드 지정 (Enum 형식) |
String[] params() | 요청 파라미터와 값 지정(Post 형식 또한 가능) |
String[] headers() | 공통 헤더 값 지정 |
String[] consumes() | request에 *'Content-Type' 헤더가 명시한 미디어 타입에 포함될 때 수신 |
String[] produces() | request에 *'Accept' 헤더가 명시한 미디어 타입에 포함될 때, 명시한 타입으로 응답 |
*Content-Type : 클라이언트가 서버에게 해당 미디어 타입으로 데이터를 보낸다는 헤더
*Accept : 클라이언트가 서버에게 해당 미디어 타입으로 달라고 하는 요청 헤더
headers와의 차이. 공통,요청헤더
#매핑
RequestMappingHandlerMapping 빈 생성 -> 빈 초기화 -> initHandlerMethods 호출 -> @Controller와 @RequestMapping를 가지고 있는 빈 가져옴 -> 핸들러가 될 수 있는 모든 메서드 추출 -> 추출된 메서드 registry 등록
Controller 클래스에 @Controller 어노테이션을 붙여 빈 자동 스캔으로 등록된다. 이를 통해 @RequestMapping을 사용 여부 클래스를 판단한다.
만약 @Controller 어노테이션이 없다면 클래스 레벨에서 @RequestMapping을 명시해야한다.
#consumes 테스트
1. 요청 헤더 Content type에 application/json;UTF-8 을 담는다.
2. Request
Headers [Content-Type:"application/json;charset=UTF-8"]이 담긴 것을 볼 수 있다.
3. 핸들러 매핑
consumes에 지정된 형식이 일치할 경우 해당 메소드를 실행한다.
4. Response
특별한 응답 값, viewName을 지정하지 않아 리턴 값이 URL로 지정되어 응답 값을 받았다.
#produces 테스트
1. 요청 헤더 accept에 "application/json"을 담는다.
2. Request
Headers 에 [Accept:"application/json"] 이 담긴 것을 볼 수 있다.
3. 핸들러 매핑
produces에 지정된 형식이 일치할 경우 해당 형식으로 응답한다.
4. Response
응답 값의 Content type이 요청한 application/json 형식인 것을 볼 수 있다.
@GetMapping
위의 내용을 종합하였을 때, @GetMapping 어노테이션은 다음과 같이 정리할 수 있다.
메소드 선언 때(@Target) 사용되며, 런타임 종료(@Retention)시까지 메소드가 살아있다. 또한 문서화(@Documented)에 포함되며 @RequestMapping의 GET 메소드 방식을 지정하고 있다. 정의된 내용으로는 AliasFor 어노테이션을 통해 @RequestMapping에서 정의한 값을 가져온다.
출처:
https://araikuma.tistory.com/658?category=870356 [프로그램 개발 지식 공유]
'Study > Spring' 카테고리의 다른 글
[Spring] Handler Method(ResponseEntity) (0) | 2021.09.12 |
---|---|
[Spring] @ModelAttribute (0) | 2021.09.08 |
[Spring] Spring IoC Container 그리고 Bean (0) | 2021.08.29 |
[Spring] Dispatcher Servlet (0) | 2021.08.24 |
[Spring] Request Mapping - httpMethod (0) | 2021.08.15 |