Java/Spring Boot
[Java] Spring Web Annotation 이해하고 사용하기 -2 : 요청 및 응답
adjh54
2023. 11. 11. 23:42
반응형
반응형
해당 글에서는 Spring Web에서 사용되는 주요 어노테이션 중 요청/응답과 관련된 어노테이션의 종류에 대해 상세히 알아봅니다.
💡 [참고] 이전에 작성한 Spring Web Annotation '환경구성' 글에서 이어집니다.
💡 [참고] 또한 Rest API와 관련된 내용이기에 아래의 글을 참고하시면 도움이 됩니다.
1) Spring Boot Web
💡 Spring Boot Web
- Spring Boot 프레임워크의 일부로 웹 애플리케이션을 빠르고 쉽게 구축할 수 있도록 도와주는 도구입니다.
- 내장된 웹 서버를 제공하여 웹 애플리케이션을 실행하고 관리하는 데 필요한 모든 설정을 자동으로 처리합니다. (내장된 웹 서버로 Tomcat, Jetty, Undertow와 같은 서버를 사용할 수 있습니다.)
- 이를 사용하면 간단한 설정으로 HTTP 엔드포인트를 생성하고 관리할 수 있습니다. 또한, Spring MVC와 같은 웹 프레임워크와 통합되어 효율적인 웹 애플리케이션 개발을 지원합니다.
- RESTful API, 웹 서비스, 단일 페이지 애플리케이션 등 다양한 유형의 웹 애플리케이션 개발에 적합합니다.
💡 [참고] Spring Boot Web을 사용하기 위한 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' // Spring Boot Web
}
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
1. 주요 어노테이션
어노테이션 | 분류 | 설명 |
@RestController | 공통 | 핸들러 메서드가 RESTful 웹 서비스의 엔드포인트임을 나타냅니다. |
@RequestMapping | 공통 | HTTP 요청과 매핑되는 핸들러 메서드를 지정합니다. |
@GetMapping | 공통 | HTTP GET 요청과 매핑되는 핸들러 메서드를 지정합니다. |
@PostMapping | 공통 | HTTP POST 요청과 매핑되는 핸들러 메서드를 지정합니다. |
@PutMapping | 공통 | HTTP PUT 요청과 매핑되는 핸들러 메서드를 지정합니다. |
@PatchMapping | 공통 | HTTP PATCH 요청과 매핑되는 핸들러 메서드를 지정합니다. |
@DeleteMapping | 공통 | HTTP DELETE 요청과 매핑되는 핸들러 메서드를 지정합니다. |
@RequestParam | 요청 처리 | 요청 파라미터를 메서드 매개변수로 전달받습니다. |
@RequestBody | 요청 처리 | 요청의 본문(body)을 메서드 매개변수로 전달받습니다. |
@PathVariable | 요청 처리 | URL 경로에서 변수 값을 추출하여 메서드 매개변수로 전달받습니다. |
@ResponseBody | 응답 처리 | 메서드의 반환 값을 응답 본문(body)으로 전송합니다. |
@ResponseStatus | 응답 처리 | 핸들러 메서드의 HTTP 응답 상태 코드를 지정합니다. |
💡 [참고] 해당 어노테이션에 대해 참고한 사이트입니다.
Spring Web Annotations | Baeldung
2) Spring Web Annotation 주요 어노테이션 : 요청/응답 공통
1. @RestController
💡 @RestController
- 스프링 애플리케이션에서 ‘RESTful 웹 서비스를 구현’하는 데 사용됩니다. RESTful 웹 서비스는 HTTP 프로토콜을 통해 클라이언트와 서버 간의 통신을 처리하는 웹 서비스입니다.
- 지정된 클래스는 스프링 애플리케이션 컨텍스트에서 빈으로 등록되며, JSON이나 XML과 같은 다양한 형식으로 데이터를 반환할 수 있습니다. 이 어노테이션은 주로 REST API 엔드포인트를 처리하는 컨트롤러 클래스에 사용됩니다.
@RestController
@RequestMapping(value = "/api/v1/rest")
public class RestfulController {
/**
* RESTful API의 GET을 이용한 방식
*
* @return
*/
@GetMapping("/user")
public ResponseEntity<ApiResponse<Object>> restfulGet(@RequestParam String userId) {
String result = "";
log.debug("userId :: " + userId);
ApiResponse ar = ApiResponse.builder()
.result(result)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
}
[ 더 알아보기 ]
💡 @Controller와 @RestController는 무슨 차이인가?
@Controller
- 전통적인 웹 애플리케이션에서 사용되는 어노테이션으로, 주로 View를 반환하기 위해 사용됩니다. 메서드에 @RequestMapping과 함께 사용되어 특정 URL에 매핑되는 요청 처리기로 동작합니다.
- 주로 JSP와 같은 View 템플릿을 이용하여 HTML을 생성하고 반환합니다.
@RestController
- Spring 4.0 버전부터 도입된 어노테이션으로, JSON, XML 등의 데이터를 반환하기 위해 사용됩니다.
- @Controller와는 달리 모든 메서드에 @ResponseBody 어노테이션이 자동으로 적용되어 응답을 직접 반환합니다. 주로 RESTful API를 구현할 때 사용됩니다.
2. @RequestMapping
💡 @RequestMapping
- Java Spring 프레임워크에서 ‘HTTP 요청을 컨트롤러 클래스의 특정 메서드에 매핑‘하는 데 사용됩니다. 보통 메서드가 처리해야 할 엔드포인트 URL과 HTTP 메서드를 정의하는 데 사용됩니다.
- 해당 어노테이션은 컨트롤러 클래스의 클래스 레벨과 메서드 레벨에 모두 적용할 수 있습니다.
💡 주요 특징
1. 해당 어노테이션은 컨트롤러 클래스의 ‘클래스 레벨’과 ‘메서드 레벨’에 모두 적용할 수 있습니다.
- 즉 클래스 내에 선언이 가능하고, 메서드 내에서도 선언이 가능합니다.
- 단, 가독성을 높이기 위해 메서드 레벨에서는 주로 @GetMapping, @PostMapping, … 등을 사용하여 HTTP Method에 대해 명시적으로 사용합니다.
2. 메서드 레벨에서는 특정 메서드의 URL 경로와 HTTP 메서드를 추가로 지정합니다.
3. value, method, params, headers 등과 같은 다양한 속성을 지원하여 매핑을 추가로 사용자 정의할 수 있습니다.
4. 동일한 메서드에 여러 개의 @RequestMapping 어노테이션을 사용하여 다른 URL 매핑을 처리할 수 있습니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | 매핑할 URL 경로를 지정합니다. |
method | 요청에 대한 허용되는 HTTP 메서드를 지정합니다. |
params | 요청의 매개변수를 추가로 제한하는데 사용됩니다. |
headers | 요청의 헤더를 추가로 제한하는데 사용됩니다. |
consumes | 요청이 수락하는 미디어 타입을 지정합니다. |
produces | 응답으로 반환되는 미디어 타입을 지정합니다. |
path | 기본 URL에서 일부를 재정의하여 매핑할 URL 경로를 지정합니다. |
name | 매핑의 이름을 지정합니다. |
params | 요청의 매개변수를 추가로 제한하는데 사용됩니다. |
headers | 요청의 헤더를 추가로 제한하는데 사용됩니다. |
consumes | 요청이 수락하는 미디어 타입을 지정합니다. |
produces | 응답으로 반환되는 미디어 타입을 지정합니다. |
💡 @RequestMapping 사용예시
- 해당 예시에서는 코드 정보를 관리하는 Controller 클래스를 의미합니다.
- 클래스 최상위에 @RequestMapping 어노테이션의 선언을 통해 해당 Controller의 기본 엔드포인트를 지정합니다.
- 예를 들어 @RequestMapping(value = "/api/v1/code") 이렇게 구성을 하면 기본적으로 해당 Controller의 어노테이션은 localhost:8080/api/v1/code로 시작합니다.
- 추후 구성한 메서드 별 엔드포인트는 해당 어노테이션을 이어지게 됩니다.
/**
* 코드 정보를 관리하는 Controller
*/
@Slf4j
@RestController
@RequestMapping(value = "/api/v1/code")
public class CodeController {
private final CodeService codeService;
public CodeController(CodeService cs) {
this.codeService = cs;
}
/**
* [API] 코드 단건 조회 : 코드 키 값을 기반으로 조회합니다.
*
* @param cd String
* @return ApiResponseWrapper<ApiResponse> : 응답 결과 및 응답 코드 반환
*/
@GetMapping("/code")
public ResponseEntity<ApiResponse<Object>> selectCodeByCd(@RequestParam String cd) {
CodeDto codeItem = codeService.selectCodeByCd(cd);
ApiResponse<Object> ar = ApiResponse.builder()
.result(codeItem)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
}
3. @GetMapping
💡 @GetMapping
- Java Spring 프레임워크에서 HTTP GET 요청을 특정 메서드에 매핑하는 데 사용됩니다.
- 이 어노테이션은 @RequestMapping 어노테이션의 축약형이며, 주로 ‘조회’ 작업에 사용됩니다.
💡 주요 특징
1. 이 어노테이션은 메서드 레벨에 적용 가능합니다.
2. @RequestMapping과 마찬가지로 value 속성을 사용하여 매핑할 URL 경로를 지정합니다.
3. 기본적으로 GET 요청에만 매핑되며, method 속성을 사용하여 다른 HTTP 메서드와 매핑할 수도 있습니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | 매핑할 URL 경로를 지정합니다. |
method | 요청에 대한 허용되는 HTTP 메서드를 지정합니다. |
params | 요청의 매개변수를 추가로 제한하는데 사용됩니다. |
headers | 요청의 헤더를 추가로 제한하는데 사용됩니다. |
consumes | 요청이 수락하는 미디어 타입을 지정합니다. |
produces | 응답으로 반환되는 미디어 타입을 지정합니다. |
💡 @GetMapping 사용예시
- 클라이언트에서 localhost:8080/api/v1/rest/user로 HTTP Method GET으로 요청되었을 시 해당 API로 호출이 됩니다.
- 주로 ‘조회’를 목적으로 하는 데이터 처리에 사용이 되는 어노테이션입니다.
@RestController
@RequestMapping(value = "/api/v1/rest")
public class RestfulController {
/**
* RESTful API의 GET을 이용한 방식
*
* @return
*/
@GetMapping("/user")
public ResponseEntity<ApiResponse<Object>> restfulGet(@RequestParam String userId) {
String result = "";
result = userId;
ApiResponse ar = ApiResponse.builder()
.result(result)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
}
[ 더 알아보기 ]
💡 GetMapping을 선언한 메서드에서는 POST로 데이터를 JSON 전송이 가능한가?
- @GetMapping은 주로 조회에서 사용되지만, Body 형태로 데이터를 전달하는 것도 가능합니다.
- 일반적으로는 @RequestBody 어노테이션을 사용하여 요청의 Body에 있는 데이터를 객체로 매핑할 수 있습니다.
💡 GET 방식 vs @GetMapping
GET 방식
- 웹 서버로부터 데이터를 요청하기 위해 사용되며, 데이터는 URL의 ‘쿼리 매개변수’를 통해 전달됩니다.
@GetMapping
- 특정 URL에 대한 GET 요청을 처리하는 메서드를 지정할 때 사용됩니다.
- @GetMapping을 사용하면 URL 경로를 통해 데이터를 전달하고, 해당 메서드에서 받은 데이터를 활용할 수 있습니다.
⭐️ 결론적으로는 GET방식은 데이터 전송방식(쿼리 스트링을 통한 전송)이며 @GetMapping 은 데이터 전송의 HTTP Method이기에 혼동하시면 안됩니다.
💡쿼리 스트링(Query String)
- URL 끝에 '?'로 시작하는 문자열로, 클라이언트가 서버에게 전달하는 매개변수입니다. 쿼리 스트링은 '키=값' 형식으로 구성되며, 여러 개의 매개변수는 '&'로 구분됩니다.
💡클라이언트 라이브러리 중 Axios의 경우 HTTP Method 중 GET을 선택하여 Body로 보내기가 불가능하던데 뭐가 맞는 걸까?
- Axios는 기본적으로 GET 메서드로 요청을 보낼 때 요청 본문을 지원하지 않습니다.
- 이는 HTTP 사양에서 GET 요청에 대한 요청 본문을 정의하지 않기 때문입니다.
- 일반적으로 HTTP Method의 GET 접근 방식은 쿼리 스트링(쿼리 매개변수)을 사용하는 것입니다.
- 이를 위한 대안으로는 GET 대신 POST 메서드를 사용하는 것입니다.
[참고] https://masteringjs.io/tutorials/axios/get-with-data
4. @PostMapping
💡 @PostMapping
- Java Spring 프레임워크에서 HTTP POST 요청을 특정 메서드에 매핑하는 데 사용됩니다.
- 이 어노테이션은 @RequestMapping 어노테이션의 축약형이며, 주로 ‘생성’ 작업에 사용됩니다.
- 단, 클라이언트에서 조회 방식 중 쿼리 스트링을 보내는 것이 아닌 Object를 보내는 방식의 경우 해당 어노테이션을 사용하기도 한다.
💡 주요 특징
1. 이 어노테이션은 메서드 레벨에 적용합니다.
2. @RequestMapping과 마찬가지로 value 속성을 사용하여 매핑할 URL 경로를 지정합니다.
3. 기본적으로 POST 요청에만 매핑되며, method 속성을 사용하여 다른 HTTP 메서드와 매핑할 수도 있습니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | 매핑할 URL 경로를 지정합니다. |
method | 요청에 대한 허용되는 HTTP 메서드를 지정합니다. |
params | 요청의 매개변수를 추가로 제한하는데 사용됩니다. |
headers | 요청의 헤더를 추가로 제한하는데 사용됩니다. |
consumes | 요청이 수락하는 미디어 타입을 지정합니다. |
produces | 응답으로 반환되는 미디어 타입을 지정합니다. |
💡 @PostMapping 사용 예시
- 클라이언트에서 localhost:8080/api/v1/rest/user로 HTTP Method POST으로 요청되었을 시 해당 API로 호출이 됩니다.
@RestController
@RequestMapping(value = "/api/v1/rest")
public class RestfulController {
/**
* RESTful API의 POST 이용한 방식
*
* @return
*/
@PostMapping("/user")
public ResponseEntity<ApiResponse<Object>> restfulPost(@RequestBody UserDto userDto) {
String result = "";
log.debug("userDto :: " + userDto.toString());
ApiResponse ar = ApiResponse.builder()
.result(userDto)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
}
5. @PutMapping
💡 @PutMapping
- Java Spring 프레임워크에서 HTTP PUT 요청을 특정 메서드에 매핑하는 데 사용됩니다.
- 이 어노테이션은 @RequestMapping 어노테이션의 축약형이며, 주로 ‘업데이트(수정)’ 작업에 사용됩니다.
- 해당 수정작업의 경우는 ‘전체 리소스를 변경’하는 경우 주로 사용이 됩니다.
💡 주요 특징
1. 이 어노테이션은 메서드 레벨에 적용합니다.
2. @RequestMapping과 마찬가지로 value 속성을 사용하여 매핑할 URL 경로를 지정합니다.
3. 기본적으로 PUT 요청에만 매핑되며, method 속성을 사용하여 다른 HTTP 메서드와 매핑할 수도 있습니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | 매핑할 URL 경로를 지정합니다. |
method | 요청에 대한 허용되는 HTTP 메서드를 지정합니다. |
params | 요청의 매개변수를 추가로 제한하는데 사용됩니다. |
headers | 요청의 헤더를 추가로 제한하는데 사용됩니다. |
consumes | 요청이 수락하는 미디어 타입을 지정합니다. |
produces | 응답으로 반환되는 미디어 타입을 지정합니다. |
💡 @PutMapping 사용 예시
- 클라이언트에서 localhost:8080/api/v1/rest/user로 HTTP Method PUT으로 요청되었을 시 해당 API로 호출이 됩니다.
6. @PatchMapping
💡 @PatchMapping
- Java Spring 프레임워크에서 HTTP PATCH 요청을 특정 메서드에 매핑하는 데 사용됩니다.
- 이 어노테이션은 @RequestMapping 어노테이션의 축약형이며, 주로 ‘업데이트(수정)’ 작업에 사용됩니다.
- 해당 작업의 경우 ‘일부 리소스를 변경’하는데 주로 사용이 됩니다.
💡 주요 특징
1. 이 어노테이션은 메서드 레벨에 적용합니다.
2. @RequestMapping과 마찬가지로 value 속성을 사용하여 매핑할 URL 경로를 지정합니다.
3. 기본적으로 PATCH 요청에만 매핑되며, method 속성을 사용하여 다른 HTTP 메서드와 매핑할 수도 있습니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | 매핑할 URL 경로를 지정합니다. |
method | 요청에 대한 허용되는 HTTP 메서드를 지정합니다. |
params | 요청의 매개변수를 추가로 제한하는데 사용됩니다. |
headers | 요청의 헤더를 추가로 제한하는데 사용됩니다. |
consumes | 요청이 수락하는 미디어 타입을 지정합니다. |
produces | 응답으로 반환되는 미디어 타입을 지정합니다. |
💡 @PatchMapping 사용 예시
- 클라이언트에서 localhost:8080/api/v1/rest/user로 HTTP Method PATCH으로 요청되었을 시 해당 API로 호출이 됩니다.
@RestController
@RequestMapping(value = "/api/v1/rest")
public class RestfulController {
/**
* RESTful API의 PATCH 이용한 방식
*
* @return
*/
@PatchMapping("/user")
public ResponseEntity<ApiResponse<Object>> restfulPatch(@RequestBody UserDto userDto) {
String result = "";
log.debug("userDto :: " + userDto.toString());
ApiResponse ar = ApiResponse.builder()
.result(userDto)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
}
[ 더 알아보기 ]
💡 HTTP Method의 Put과 Patch의 차이점
PUT
- 특정 URI에 있는 '전체' 리소스를 업데이트하거나 대체하는 데 사용됩니다.
- 클라이언트는 리소스의 완전한 표현을 서버로 보내어 기존의 리소스를 대체합니다.
Patch
- 특정 URI에 있는 리소스를 '부분적'으로 업데이트하는 데 사용됩니다.
- 클라이언트가 변경 사항 집합을 서버로 보내고, 서버는 해당 변경 사항을 기존 리소스에 적용하여 지정된 필드만 수정합니다.
7. @DeleteMapping
💡 @DeleteMapping
- Java Spring 프레임워크에서 HTTP DELETE 요청을 특정 메서드에 매핑하는 데 사용됩니다.
- 이 어노테이션은 @RequestMapping 어노테이션의 축약형이며, 주로 '삭제' 작업에 사용됩니다.
💡 주요 특징
1. 이 어노테이션은 메서드 레벨에 적용합니다.
2. @RequestMapping과 마찬가지로 value 속성을 사용하여 매핑할 URL 경로를 지정합니다.
3. 기본적으로 DELETE 요청에만 매핑되며, method 속성을 사용하여 다른 HTTP 메서드와 매핑할 수도 있습니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | 매핑할 URL 경로를 지정합니다. |
method | 요청에 대한 허용되는 HTTP 메서드를 지정합니다. |
params | 요청의 매개변수를 추가로 제한하는데 사용됩니다. |
headers | 요청의 헤더를 추가로 제한하는데 사용됩니다. |
consumes | 요청이 수락하는 미디어 타입을 지정합니다. |
produces | 응답으로 반환되는 미디어 타입을 지정합니다. |
💡 @DeleteMapping 사용 예시
- 클라이언트에서 localhost:8080/api/v1/rest/user로 HTTP Method DELETE으로 요청되었을 시 해당 API로 호출이 됩니다.
@RestController
@RequestMapping(value = "/api/v1/rest")
public class RestfulController {
/**
* RESTful API의 DELETE 이용한 방식
*
* @return
*/
@DeleteMapping("/user")
public ResponseEntity<ApiResponse<Object>> restfulDelete(@RequestBody UserDto userDto) {
String result = "";
log.debug("userDto :: " + userDto.toString());
ApiResponse ar = ApiResponse.builder()
.result(userDto)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
}
3) Spring Web Annotation 주요 어노테이션 : 요청
1. @RequestParam
💡 @RequestParam
- HTTP 요청 매개변수를 메서드의 매개변수와 바인딩하기 위해 사용됩니다.
- @RequestParam을 사용하여 URL 쿼리 매개변수, 폼 데이터, HTTP 헤더 등을 가져올 수 있습니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | 요청 매개변수의 이름을 지정합니다. |
required | - 요청 매개변수가 필수인지 여부를 지정합니다. 기본값은 true입니다. - 필수 매개변수가 누락된 경우 예외가 발생합니다. |
defaultValue | - 요청 매개변수의 기본값을 지정합니다. |
💡 사용예시
- 해당 URI의 쿼리 스트링으로 userId라는 key와 value 값이 들어오면 해당 API와 매핑이 됩니다.
@RestController
@RequestMapping(value = "/api/v1/rest")
public class RestfulController {
/**
* RESTful API의 GET을 이용한 방식
*
* @return
*/
@GetMapping("/user")
public ResponseEntity<ApiResponse<Object>> restfulGet(@RequestParam String userId) {
String result = "";
result = userId;
ApiResponse ar = ApiResponse.builder()
.result(result)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
}
💡 @RequestParam 사용 예시
- 쿼리스트링으로 받는 값(userId22)과 매핑하는 문자열 userId를 다르게 하여도 값을 받을 수 있습니다.
- http://localhost:8000/api/v1/rest/user?userId22=adjh54 로 호출을 합니다.
/**
* RESTful API의 GET을 이용한 방식
*
* @return
*/
@GetMapping("/user")
public ResponseEntity<ApiResponse<Object>> restfulGet(@RequestParam(value = "userId22") String userId) {
String result = "";
result = userId;
ApiResponse ar = ApiResponse.builder()
.result(result)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
2. @RequestBody
💡 @RequestBody
- Java Spring 프레임워크에서 HTTP 요청의 본문(body)을 특정 메서드의 매개변수로 바인딩하는 데 사용됩니다.
- 보통 POST 또는 PUT 요청에서 클라이언트가 전송한 데이터를 메서드의 매개변수로 바인딩하는 데 사용됩니다.
💡 주요 특징
1. 이 어노테이션은 메서드 매개변수 레벨에 적용합니다.
2. HTTP 요청의 본문을 자바 객체로 변환하여 메서드의 매개변수에 매핑합니다.
3. 주로 POST 또는 PUT 요청에서 사용되며, 클라이언트가 전송한 데이터를 메서드에서 처리하는 데 사용됩니다.
4. 요청의 Content-Type을 기반으로 적절한 변환기(MessageConverter)를 선택하여 데이터를 자바 객체로 변환합니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
required | 요청 본문의 필수 여부를 설정합니다. 기본값은 true입니다. |
value | 요청 본문의 데이터 형식을 지정합니다. 기본값은 */*입니다. |
headers | 요청 헤더를 지정합니다. |
name | 요청 본문의 이름을 지정합니다. |
defaultValue | 요청 본문의 기본값을 지정합니다. |
content | 요청 본문의 내용을 지정합니다. |
encoding | 요청 본문의 인코딩을 지정합니다. |
consumes | 요청 본문의 데이터 형식을 소비하는 미디어 타입을 지정합니다. |
produces | 응답 본문의 데이터 형식을 생성하는 미디어 타입을 지정합니다. |
💡 @RequestBody 사용 예시
- 해당 URI에 UserDto구조의 JSON 형태로 데이터를 전송하면 해당 API와 매핑이 됩니다.
/**
* RESTful API의 POST 이용한 방식
*
* @return
*/
@PostMapping("/user")
public ResponseEntity<ApiResponse<Object>> restfulPost(@RequestBody UserDto userDto) {
String result = "";
log.debug("userDto :: " + userDto.toString());
ApiResponse ar = ApiResponse.builder()
.result(userDto)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
package com.adjh.multiflexapi.model;
import com.adjh.multiflexapi.model.common.Pagination;
import lombok.*;
import java.util.List;
import java.util.Map;
@Getter
@ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserDto extends Pagination {
// 사용자 시퀀스
private int userSq;
// 사용자 아이디
private String userId;
// 사용자 패스워드
private String userPw;
// 사용자 이름
private String userNm;
// 사용자 상태
private String userSt = "S";
private String userEmail;
@Builder(builderMethodName = "userBuilder", toBuilder = true)
private UserDto(int userSq, String userId, String userPw, String userNm, String userSt
) {
this.userSq = userSq;
this.userId = userId;
this.userPw = userPw;
this.userNm = userNm;
this.userSt = userSt;
}
}
3. @PathVariable
💡 @PathVariable
- URI에서 ‘동적 값’들을 메서드 매개변수에 매핑하기 위해 사용됩니다.
- 이를 통해 요청 URL의 일부를 캡처하고 메서드 매개변수로 바인딩할 수 있습니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | URL 경로에서 캡처할 변수의 이름을 지정합니다. |
name | value와 동일한 역할을 합니다. 이름을 지정하여 변수를 캡처합니다. |
required | 매개변수가 필수인지 여부를 지정합니다. 기본값은 true입니다. |
defaultValue | 매개변수의 기본값을 지정합니다. |
💡 @PathVariable 사용 예시
- 해당 URI로 boardNum을 보낼 시 게시판 글에 대한 상세 정보를 반환해 줍니다.
/**
* 게시판 번호 별 글 조회
*
* @param boardNum
* @return
*/
@GetMapping("/board/{boardNum}")
public ResponseEntity<ApiResponse<BoardDto>> getUserInfoById(@PathVariable Long boardNum) {
String result = "";
BoardDto boardDto = boardService.selctBoardDtl(boardNum);
ApiResponse ar = ApiResponse.builder()
.result(boardDto)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
3) Spring Web Annotation 주요 어노테이션 : 응답
1. @ResponseBody
💡 @ResponseBody
- Spring MVC 프레임워크에서 사용되는 어노테이션으로 HTTP 응답 본문(Body)을 직접 데이터로 반환하고자 할 때 사용합니다.
- 해당 반환하는 데이터는 JSON이나 XML과 같은 형식으로 반환할 수 있습니다.
- 예를 들어 클라이언트가 특정 URL에 GET 요청을 보내면, 해당 요청에 대한 결과를 JSON 형식으로 반환하고자 한다면, @ResponseBody 어노테이션을 사용하여 컨트롤러 메서드에서 직접 JSON 데이터를 반환할 수 있습니다.
- 해당 어노테이션은 기본적으로 Jackson 라이브러리를 사용하여 객체를 JSON으로 변환합니다. 따라서, 컨트롤러 메서드에서는 반환하고자 하는 객체를 JSON으로 변환하여 반환하면 됩니다
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | - @ResponseBody 어노테이션을 사용하여 컨트롤러 메서드가 반환하는 값을 HTTP 응답의 본문으로 사용하도록 지정합니다. - 이를 통해 객체를 직접 JSON 또는 XML 형식으로 변환하여 클라이언트에게 전달할 수 있습니다. |
💡 @ResponseBody 사용 예시 : code/codes라는 Thymeleaf 페이지가 있다는 가정하에 호출을 하였습니다.
- 호출을 하였을 때 당연히 존재하지 않는 페이지여서 500 Internal Error를 반환하고 있습니다.
package com.adjh.multiflexapi.controller;
import com.adjh.multiflexapi.model.CodeDto;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
/**
* Code View Controller
*
* @author : jonghoon
* @fileName : SpringMVCController
* @since : 11/11/23
*/
@Controller
@RequestMapping("/code")
public class SpringMVCController {
@GetMapping("/codes")
public static String selectCode() {
return "code/codeList";
}
}
💡 @ResponseBody 적용 예시
- 그래서 이를 위해 @ResponseBody 어노테이션을 추가하여 객체를 전달하도록 구성하였습니다.
- 이는 객체 자체를 반환해 줍니다.
package com.adjh.multiflexapi.controller;
import com.adjh.multiflexapi.model.CodeDto;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
/**
* Code View Controller
*
* @author : jonghoon
* @fileName : SpringMVCController
* @since : 11/11/23
*/
@Controller
@RequestMapping("/code")
public class SpringMVCController {
@ResponseBody
@GetMapping("/codes")
public static CodeDto selectCode() {
CodeDto codeDto = CodeDto
.builder()
.cd("A1828")
.cdNm("Java")
.grpCd("prg")
.grpCdNm("프로그래밍")
.build();
return codeDto;
}
}
2. @ResponseStatus
💡 @ResponseStatus
- Spring MVC 프레임워크에서 사용되며, 컨트롤러 메서드의 응답 상태 코드를 지정하는 데 사용됩니다.
- 이 어노테이션을 사용하여 특정 상태 코드를 지정하면, 해당 상태 코드가 클라이언트로 반환됩니다.
💡 [참고] 해당 어노테이션의 주요 속성 값입니다.
속성 | 설명 |
value | 컨트롤러 메서드에서 반환할 HTTP 상태 코드를 지정합니다. 응답 상태를 사용자 정의하는 데 사용됩니다. |
💡 @ResponseStatus 사용 예시
- Thymeleaf를 통해서 간단한 화면이 출력이 되도록 구성한 화면입니다.
- 해당 페이지를 출력하고 응답 코드로 200을 전달해주고 있습니다.
package com.adjh.multiflexapi.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Slf4j
@Controller
public class MainController {
@GetMapping("/test")
public String loginPage(Model model) {
model.addAttribute("title", "");
return "pages/test/testPage";
}
}
💡 @ResponseStatus 사용 예시
- 위와 동일한 화면을 출력해 주는 Controller입니다.
- 그러나 응답 코드로 404 코드를 응답하도록 반환 코드를 구성하였습니다. 그래서 아래와 같이 Status 코드로 404를 반환해 줍니다.
package com.adjh.multiflexapi.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
@Slf4j
@Controller
public class MainController {
@ResponseStatus(HttpStatus.NOT_FOUND)
@GetMapping("/test")
public String loginPage(Model model) {
model.addAttribute("title", "");
return "pages/test/testPage";
}
}
💡 [참고] Spring Web Annotation에 대해 더 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
구분 | 링크 |
Spring Web Annotation : 환경 구성 | https://adjh54.tistory.com/311 |
Spring Web Annotation : 요청 및 응답 | https://adjh54.tistory.com/312 |
Spring Web Annotation : 예외처리 및 주입 | https://adjh54.tistory.com/313 |
오늘도 감사합니다. 😀
반응형