Study/Spring

[Spring] @RequestMapping

개발개발개발 2021. 8. 19. 00:14

RequestMapping 어노테이션은 설정이 쉽고 간편하며 가장 많이 사용하는 어노테이션 중 하나다. 그리하여 설정하는 방법이 아닌 기본적인 속성을 중점적으로 다루었다.

 

@RequestMapping

해당 어노테이션은 클래스와 메소드 레벨에서 모두 사용할 수 있다.

대부분의 경우 메소드 레벨의 응용 프로그램은 HTTP 메소드별 종류 중 하나를 사용하는 것을 선호한다.(get, post, delete, put 등등) 

 

org.springframework.web.bind.annotation.RequestMapping

많은 *meta-annotation이 정의 되어 있는 것을 볼 수 있다.

*meta-annotation : 다른 annation 에서도 사용되는 annotation 

 

@see

관련 항목으로 외부 링크 또는 텍스트를 표시하거나, 다른 필드나 메소드에 대한 모든 참조 링크를 나타내는 경우에 사용한다.

작성 위치 : 개요, 패키지, 클래스, 인터페이스, 필드, 메소드

중복 작성 : 가능

출력 형식 : 관련 항목

 

@RequestMapping Java Doc

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 을 담는다.

mockMvc를 활용한 consumes 테스트

2. Request

Headers [Content-Type:"application/json;charset=UTF-8"]이 담긴 것을 볼 수 있다.

요청 헤더 Content type

3. 핸들러 매핑

consumes에 지정된 형식이 일치할 경우 해당 메소드를 실행한다.

매핑시 consumes 지정

4. Response

특별한 응답 값, viewName을 지정하지 않아 리턴 값이 URL로 지정되어 응답 값을 받았다.

응답 값 지정 X

#produces 테스트

1. 요청 헤더 accept에 "application/json"을 담는다.

mockMVC 를 활용한 produces 테스트

2. Request

Headers 에 [Accept:"application/json"] 이 담긴 것을 볼 수 있다. 

요청 헤더 Accept

3. 핸들러 매핑

produces에 지정된 형식이 일치할 경우 해당 형식으로 응답한다.

매핑시 produces 지정

 

4. Response 

응답 값의 Content type이 요청한 application/json 형식인 것을 볼 수 있다.

응답 값 Content type

 

 

@GetMapping

ㅟGetMapping 어노테이션

위의 내용을 종합하였을 때, @GetMapping 어노테이션은 다음과 같이 정리할 수 있다. 

메소드 선언 때(@Target) 사용되며, 런타임 종료(@Retention)시까지 메소드가 살아있다. 또한 문서화(@Documented)에 포함되며 @RequestMapping의 GET 메소드 방식을 지정하고 있다.  정의된 내용으로는 AliasFor 어노테이션을 통해 @RequestMapping에서 정의한 값을 가져온다. 

 

 

 

 

출처:

https://araikuma.tistory.com/658?category=870356 [프로그램 개발 지식 공유]

https://docs.oracle.com/

'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