# @RequestMapping - class레벨에서 사용

woniwon·2024년 3월 18일

Spring

목록 보기
6/8

@RequestMapping - class레벨에서 사용

@RequestMapping의 정의

  • Request를 특정 메소드와 매핑하기 위해 사용하는 어노테이션
  • 주로 Controller단에서 사용되며 DispatcherServletController 파일을 찾ㄱ고, 논리적 주소가 매핑된 Method를 찾기 위해, @Controller@RequestMapping이 작성되어야한다.
  • 이런 내용들은 알고 있기 때문에 생략!!

작성 예시

1. 기본적인 작성법 - 메소드 레벨

  • 이전에는 아래처럼 사용해야한다.
    @RequestMapping(value = "/main", method = RequestMethod.GET)
        public String mainGet(...) {
            ...
        }
  • Get,Post,Put,DeleteMapping은 spring 4.3부터 추가된 기능이다.
@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;

    // 앨범 생성기능 POST
    // /albums/create
    @PostMapping ("albums/create")
    public ResponseEntity<?> createAlbum(@RequestBody @Valid AlbumCreateRequestDTO requestDTO, @AuthenticationPrincipal CustomUserDetails userDetails){
        albumService.createAlbum(requestDTO,userDetails.getUser());

        return ResponseEntity.ok(null);
    }

    // 앨범 수정 기능 PUT
    // /albums/{id}/update
    @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);
    }

    // 앨범 조회 기능 GET
    // /albums
    @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;

    // 앨범 생성기능 POST "/albums/create"
    @PostMapping ("/create")
    public ResponseEntity<?> createAlbum(@RequestBody @Valid AlbumCreateRequestDTO requestDTO, @AuthenticationPrincipal CustomUserDetails userDetails){
        albumService.createAlbum(requestDTO,userDetails.getUser());

        return ResponseEntity.ok(null);
    }

    // 앨범 수정 기능 PUT "/albums/{id}/update"
    @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);
    }

    // 앨범 조회 기능 GET "/albums"
    @GetMapping("")
    public ResponseEntity<?> findAllAlbum (@AuthenticationPrincipal CustomUserDetails userDetails){
        AlbumFindAllResponseDTO responseDTO = albumService.findAllAlbum(userDetails.getUser());

        return ResponseEntity.ok(null);
    }
}

이후 더 알아보면 좋을 RequestMapping의 옵션들

참고 링크

profile
단순 기록용 Velog 입니다.

0개의 댓글