@RequestMapping - class레벨에서 사용
@RequestMapping의 정의
- Request를 특정 메소드와 매핑하기 위해 사용하는 어노테이션
- 주로 Controller단에서 사용되며 DispatcherServlet이 Controller 파일을 찾ㄱ고, 논리적 주소가 매핑된 Method를 찾기 위해,
@Controller와 @RequestMapping이 작성되어야한다.
- 이런 내용들은 알고 있기 때문에 생략!!
작성 예시
1. 기본적인 작성법 - 메소드 레벨
@PostMapping ("/albums/create")
public ResponseEntity<?> createAlbum(@RequestBody @Valid AlbumCreateRequestDTO requestDTO, @AuthenticationPrincipal CustomUserDetails userDetails){
...
}
@PutMapping("albums/{id}/update")
public ResponseEntity<?> updateAlbum (@RequestBody @Valid AlbumUpdaterequestDTO requestDTO, @AuthenticationPrincipal CustomUserDetails userDetails, @PathVariable Long id){
...
}
@GetMapping("albums")
public ResponseEntity<?> findAllAlbum (@AuthenticationPrincipal CustomUserDetails userDetails){
...
}
2. Class 위에 @RequestMapping 작성하기
- 공통되는 URL이 있을 경우, Class레벨에
@RequestMapping을 작성해 method에 중복되는 value값을 없앨 수 있다.
- GET 방식으로,
[localhost:8080/api/main1](http://localhost:8080/api/main1) 이라는 url 요청이 올 경우, mainGet()메서드가 호출된다.
@RequestMapping("/api")
public class MainController {
@GetMapping(value = "/main1")
public String mainGet(...) {
...
}
⚠️ 주의할 점
@RquestMapping은 Class와 Method에 붙일 수 있고, @GetMapping,@PostMapping,@PutMapping, @DeleteMapping은 Method에만 붙일 수 있다.
Why 이 내용을 다시 보게 되었는지와 간단한 회고
- 코드리뷰 당시, 중복 코드를
@RequestMapping 으로 묶어도 좋을 것 같다는 민석님의 리뷰를 받고 찾아보게 되었다. 나는 이상하게, Get,Post,Put,DeleteMapping만 있는줄 알았다..ㅎㅎ
수정 전 코드
@RestController
@RequiredArgsConstructor
public class AlbumController {
private final AlbumService albumService;
@PostMapping ("albums/create")
public ResponseEntity<?> createAlbum(@RequestBody @Valid AlbumCreateRequestDTO requestDTO, @AuthenticationPrincipal CustomUserDetails userDetails){
albumService.createAlbum(requestDTO,userDetails.getUser());
return ResponseEntity.ok(null);
}
@PutMapping("albums/{id}/update")
public ResponseEntity<?> updateAlbum (@RequestBody @Valid AlbumUpdaterequestDTO requestDTO, @AuthenticationPrincipal CustomUserDetails userDetails, @PathVariable Long id){
albumService.updateAlbum(requestDTO,userDetails.getUser(),id);
return ResponseEntity.ok(null);
}
@GetMapping("albums")
public ResponseEntity<?> findAllAlbum (@AuthenticationPrincipal CustomUserDetails userDetails){
AlbumFindAllResponseDTO responseDTO = albumService.findAllAlbum(userDetails.getUser());
return ResponseEntity.ok(null);
}
}
수정 후 코드
@RestController
@RequiredArgsConstructor
@RequestMapping("/albums")
public class AlbumController {
private final AlbumService albumService;
@PostMapping ("/create")
public ResponseEntity<?> createAlbum(@RequestBody @Valid AlbumCreateRequestDTO requestDTO, @AuthenticationPrincipal CustomUserDetails userDetails){
albumService.createAlbum(requestDTO,userDetails.getUser());
return ResponseEntity.ok(null);
}
@PutMapping("/{id}/update")
public ResponseEntity<?> updateAlbum (@RequestBody @Valid AlbumUpdaterequestDTO requestDTO, @AuthenticationPrincipal CustomUserDetails userDetails, @PathVariable Long id){
albumService.updateAlbum(requestDTO,userDetails.getUser(),id);
return ResponseEntity.ok(null);
}
@GetMapping("")
public ResponseEntity<?> findAllAlbum (@AuthenticationPrincipal CustomUserDetails userDetails){
AlbumFindAllResponseDTO responseDTO = albumService.findAllAlbum(userDetails.getUser());
return ResponseEntity.ok(null);
}
}
이후 더 알아보면 좋을 RequestMapping의 옵션들
참고 링크