웹개발/SpringBoot

Controller Mapping Annotation

bergerac 2025. 5. 23. 09:11

1. @RequestParam – URL 파라미터를 메서드 파라미터로

@RequestParam은 주로 GET 요청에서 URL 뒤에 붙는 쿼리 파라미터를 받아올 때 사용된다. 예를 들어 검색 기능, 페이징 처리, 간단한 필터링 등에 많이 쓰인다.

@GetMapping("/search")
public String searchBooks(@RequestParam String keyword) {
    return "검색어: " + keyword;
}

이때 옵션을 활용하면 더욱 유연한 파라미터 처리도 가능하다:

  • required = true (기본값): 해당 파라미터가 없으면 에러 발생
  • required = false: 파라미터가 없어도 허용 (null로 처리)
  • defaultValue = "기본값": 값이 없을 경우 기본값 사용

주의: URL에 노출되므로 민감한 정보를 전달할 땐 사용을 피해야 한다.

 

2. @RequestBody – HTTP 본문을 객체로 변환

@RequestBody는 클라이언트가 전송한 JSON 데이터를 객체로 변환해서 받아올 때 사용된다. 보통 POST, PUT, DELETE 요청에서 사용된다.

@PostMapping("/books")
public String createBook(@RequestBody BookRequestDto requestDto) {
    return "등록된 책 제목: " + requestDto.getTitle();
}

사용할 때 주의할 점은 다음과 같다:

  • 클라이언트는 Content-Type: application/json 헤더를 반드시 설정해야 함
  • DTO 클래스에는 getter, setter가 있어야 하며 Lombok의 @Data를 활용해도 된다
  • 요청 본문이 반드시 존재해야 한다. 없으면 400 Bad Request 발생

@RequestParam과의 가장 큰 차이는 데이터의 **위치(URL vs Body)**와 **형태(단일 vs 구조적)**이다.

 

3. @PathVariable – URL 경로를 변수로 받기

@PathVariable은 URL 경로 안에 포함된 값을 받아오는 데 사용된다. 리소스의 식별자(ID 등)를 명시적으로 표현할 때 매우 유용하다.

@GetMapping("/books/{bookId}")
public String getBookById(@PathVariable Long bookId) {
    return "조회한 책 ID: " + bookId;
}

RESTful API에서 자주 등장하는 방식이며, 특히 리소스를 특정 짓는 ID를 처리할 때 자주 쓰인다. @RequestParam과 달리 경로 자체가 의미를 가지기 때문에 가독성과 명확성이 좋다.

4. @AuthenticationPrincipal – 로그인 사용자 정보 가져오기

Spring Security를 적용했다면, 인증된 사용자의 정보를 가져올 수 있는 방법 중 가장 깔끔한 게 @AuthenticationPrincipal이다.

@GetMapping("/profile")
public String getProfile(@AuthenticationPrincipal UserDetailsImpl userDetails) {
    return "로그인한 사용자: " + userDetails.getUsername();
}
 

이 애너테이션은 현재 로그인된 사용자의 인증 정보를 SecurityContext에서 꺼내 파라미터로 전달해준다. 로그인한 유저의 고유 ID를 기준으로 조회하거나, 권한에 따른 분기 처리에 자주 사용된다.

'웹개발 > SpringBoot' 카테고리의 다른 글

Response/Request &Validation  (0) 2025.05.25
@Bean VS @Component  (0) 2025.05.24
Jpa Repository  (0) 2025.05.22
ORM (Object-Relational Mapping)  (4) 2025.05.21
SpringBoot 활용  (0) 2025.05.20