💡 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
}
@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 매핑을 처리할 수 있습니다.
- 클래스 최상위에 @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 메서드와 매핑할 수도 있습니다.
- 클라이언트에서 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 메서드와 매핑할 수도 있습니다.
- 클라이언트에서 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 메서드와 매핑할 수도 있습니다.
- 클라이언트에서 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 메서드와 매핑할 수도 있습니다.
- 클라이언트에서 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 메서드와 매핑할 수도 있습니다.
- 해당 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)를 선택하여 데이터를 자바 객체로 변환합니다.
- 해당 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 형식으로 변환하여 클라이언트에게 전달할 수 있습니다.