[Spring] @RequestMapping이란 그리고 동작 방식
by 무작정 개발이번 글에서는 Spring 개발 시 자주 사용하는 @RequestMapping의 개념 및 동작 방식에 대해 정리할 것입니다.
[목차]
1. @RequestMapping이란?
2. @RequestMapping 작성 예시
3. @RequestMapping 동작 방식
1. @RequestMapping이란?
Spring 개발 시 특정 URL로 요청(Request)을 보내면 Controller에서 어떠한 방식으로 처리할지 정의합니다.
이때 들어온 요청을 특정 method와 매핑하기 위해 사용하는 어노테이션이 바로 @RequestMapping입니다.
- @RequestMapping은 Controller단에서 사용되는데, DispatcherServlet이 Controller 파일을 찾고, 논리적 주소가 매핑된 Method를 찾기 위해서는 @Controller와 @RequesetMapping이 작성되어야 합니다.
- URL와 Controller의 method 매핑을 설정하는 어노테이션
- URL 이외에도 다양한 속성을 지정 가능
- URL 템플릿 기능을 이용하면 URL속의 값을 쉽게 얻을 수 있음
@RestController
public class MainController {
@RequestMapping(value = "/main", method = RequestMethod.GET)
public String Main(...) {
...
}
위의 소스를 보면 필자가 국비 교육을 듣는 당시에 작성한 소스 코드입니다.
@RequestMapping에 여러 가지 속성들이 있는데 보통 value와 method를 주로 사용합니다.
- value는 요청받을 URL을 설정하게 됩니다.
- method는 어떤 요청으로 받을지 정의합니다. (GET, POST, PUT, DELETE 등등)
@RequestMapping의 method 속성을 알기 전에 HTTP 요청 메서드에 대해 알아야 해서 간략하게 하단에 정리합니다.
(1) Http Request Method (HTTP 요청 메서드)
HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동, Server가 수행해야 할 동작을 지정합니다.
[ HTTP 주요 메서드 ]
- GET - Server의 리소스를 조회하고자 할 때 - (CRUD에서 R(Read) - 읽기)
- POST - Server의 리소스를 생성하고자 할 때 - (CRUD에서 C(Create) - 생성)
- PUT - Server의 리소스를 수정하고자 할 때 - (CRUD에서 U(Update) - 수정)
- PATCH - Server의 리소스를 일부 수정하고자 할 때 - (CRUD에서 U(Update) - 수정)
- DELETE - Server의 리소스를 삭제할 때 - (CRUD에서 D(Delete) - 삭제)
원래는 더 많은 주요 메서드들이 있지만 여기서는 간략하게 위의 5가지만 다룰 것입니다.
2. @RequestMapping 작성 예시
이제 예시로 간단하게 @RequestMapping을 작성할 것입니다.
@RestController
public class MainController {
@RequestMapping(value = "/main", method = RequestMethod.GET)
public String mainGet(...) {
...
}
@RequestMapping(value = "/main", method = RequestMethod.POST)
public String mainPost(...) {
...
}
@RequestMapping(value = "/main", method = RequestMethod.PUT)
public String mainPut(...) {
...
}
@RequestMapping(value = "/main", method = RequestMethod.DELETE)
public String mainDelete(...) {
...
}
}
보통 GET, POST, PUT, DELETE를 만들면 위의 코드처럼 만들 수 있습니다.
하지만 이렇게 작성하면 불편하다는 생각이 듭니다.
- But, 시간이 흘러 선배들은 이러한 내용을 해결하기 위해 새로운 방식을 만들었습니다.
(1) Spring 4.3에 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 추가
Spring 4.3 버전부터 추가된 기능으로 기존에 쓰던 @RequestMapping 방식을 @GetMapping, @PostMapping 등의 방식으로 작성이 가능합니다.
따라서 Spring 4.3부터는 매핑을 보다 간편하게 작성이 가능합니다.
- 예제에서는 다루지 않았지만 추가적으로 @PatchMapping도 추가되었음
@RestController
public class MainController {
// 아래 2가지는 같은 의미 - GET
@RequestMapping(value = "/main", method = RequestMethod.GET)
public String mainGet(...) {
...
}
@GetMapping(value = "/main")
public String mainGet(...) {
...
}
// 아래 2가지는 같은 의미 - POST
@RequestMapping(value = "/main", method = RequestMethod.POST)
public String mainPost(...) {
...
}
@PostMapping(value = "/main")
public String mainPost(...) {
...
}
// 아래 2가지는 같은 의미 - PUT
@RequestMapping(value = "/main", method = RequestMethod.PUT)
public String mainPut(...) {
...
}
@PutMapping(value = "/main")
public String mainPut(...) {
...
}
// 아래 2가지는 같은 의미 - DELETE
@RequestMapping(value = "/main", method = RequestMethod.DELETE)
public String mainDelete(...) {
...
}
// 추가로 value = 생략 가능
@DeleteMapping("/main")
public String mainDelete(...) {
...
}
}
위의 방법대로 작성이 가능하고 마지막 @DeleteMapping부분을 보면 [ value = ]를 생략이 가능합니다.
(2) Class 위에 @RequestMapping 작성
공통되는 URL이 있을 경우에는 Class 레벨에 @RequestMapping을 작성할 수 있습니다.
@RestController
@RequestMapping("/api")
public class MainController {
@GetMapping(value = "/main1")
public String mainGet(...) {
...
}
@PostMapping(value = "/main2")
public String helloPost(...) {
...
}
@PutMapping(value = "/main3")
public String helloPut(...) {
...
}
@DeleteMapping("/main4")
public String helloDelete(...) {
...
}
}
위의 코드를 예시로 local환경에서 작업 시
- GET 방식으로 "localhost:8080/api/main1이라는 url 요청이 올 경우 mainGet() 메서드가 호출됩니다.
- GET 이외의 나머지 방식도 동일합니다.
이렇게 공통되는 URL이 있을 경우 Class 위에 @RequestMapping을 작성해서 method에 중복되는 value값을 없앨 수 있습니다.
[ 주의할 점 ]
- @RequestMapping은 Class와 Method에 붙일 수 있고, @GetMapping, PostMapping, @PutMapping 등은 Method에만 붙일 수 있습니다.
3. @RequestMapping의 동작 방식
1. SpringBoot 애플리케이션이 실행되면 애플리케이션에서 사용할 Bean들을 담을 ApplicationContext를 생성하고 초기화한다.
2. @RequestMapping이 붙은 Method들이 Handler에 등록되는 것을 ApplicationContext가 refresh 되는 과정에서 일어난다.
- ApplicationContext가 refresh 되는 과정에서 일어남
@SpringBootApplication
public class CoreApplication {
public static void main(String[] args) {
SpringApplication.run(CoreApplication.class, args);
}
}
// class 이름에 Core는 프로젝트 생성 시 Core로 작성하였기 때문
3. main 메서드인 애플리케이션 실행 메서드에 들어가면 아래와 같이 ApplicationContext.refresh() 메서드가 존재하는 것을 알 수 있다.
이때 생성되는 Spring Application 구동을 위한 수많은 Bean들이 존재합니다.
이렇게 등록되는 Bean들 중에 하나가 [ RequestMappingHandlerMapping ]이고, 이 Bean이 우리가 @RequestMapping으로
등록한 method들을 가지고 있다가 요청(Request)이 들어오면 매핑을 해주는 역할을 수행합니다.
4. 그 이후에 Bean으로 등록된 HandlerMapping이 변수들을 찾아서 Adapter를 거쳐 실행하게 됩니다.
- @RequesetMapping의 동작 방식에 대해 더 자세히 알고 싶다면 이 글을 참고할 수 있습니다.
4. 마무리
@RequestMapping 관련 글이 글이 길어져서 RequestMapping 옵션들에 대해서는 다음 글에서 다룰 예정입니다.
혹시 잘못된 부분이 있다면 댓글로 지적해주시면 감사합니다.
5. Reference
'Back-End > SpringBoot' 카테고리의 다른 글
Spring DI(Dependency Injection) - 의존 관계 주입 핵심 정리 (0) | 2023.02.02 |
---|---|
[Spring] @RequestMapping 옵션 (0) | 2022.12.15 |
@Controller와 @RestController 차이점 (2) | 2022.11.03 |
@Autowired vs @RequiredArgsConstructor vs @Resource 차이점 (3) | 2022.10.14 |
[Spring boot] 프로젝트 패키지 구조 (0) | 2022.09.15 |
블로그의 정보
무작정 개발
무작정 개발