반응형
ResponseEntity
결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스
HttpStatus, HttpHeaders, HttpBody를 포함
ResponseEntityTest
ResponseMessage
package com.greedy.api.section02.responseentity;
import java.util.Map;
public class ResponseMessage {
private int httpStatus;
private String message;
private Map<String, Object> results;
public ResponseMessage(int httpStatus, String message, Map<String, Object> results) {
super();
this.httpStatus = httpStatus;
this.message = message;
this.results = results;
}
public int getHttpStatus() {
return httpStatus;
}
public void setHttpStatus(int httpStatus) {
this.httpStatus = httpStatus;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Map<String, Object> getResults() {
return results;
}
public void setResults(Map<String, Object> results) {
this.results = results;
}
@Override
public String toString() {
return "ResponseMessage [httpStatus=" + httpStatus + ", message=" + message + ", results=" + results + "]";
}
}
UserDTO
package com.greedy.api.section02.responseentity;
import java.util.Date;
public class UserDTO {
private int no;
private String id;
private String pwd;
private String name;
private java.util.Date enrollDate;
public UserDTO() {}
public UserDTO(int no, String id, String pwd, String name, Date enrollDate) {
super();
this.no = no;
this.id = id;
this.pwd = pwd;
this.name = name;
this.enrollDate = enrollDate;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public java.util.Date getEnrollDate() {
return enrollDate;
}
public void setEnrollDate(java.util.Date enrollDate) {
this.enrollDate = enrollDate;
}
@Override
public String toString() {
return "UserDTO [no=" + no + ", id=" + id + ", pwd=" + pwd + ", name=" + name + ", enrollDate=" + enrollDate
+ "]";
}
}
ResponseEntityTestController
@RestController
@RequestMapping("/entity")
public class ResponseEntityTestController {
/* UserDTO 타입의 List 생성해서 데이터 채우기*/
private List<UserDTO> users;
public ResponseEntityTestController(){
users = new ArrayList<>();
users.add(new UserDTO(1, "user01", "pass01", "뽀로로", new java.util.Date()));
users.add(new UserDTO(2, "user02", "pass02", "짱구", new java.util.Date()));
users.add(new UserDTO(3, "user03", "pass03", "또치", new java.util.Date()));
}
}
Test 1 - 전체 유저 조회
@RestController
@RequestMapping("/entity")
public class ResponseEntityTestController {
private List<UserDTO> users;
public ResponseEntityTestController(){
users = new ArrayList<>();
users.add(new UserDTO(1, "user01", "pass01", "뽀로로", new java.util.Date()));
users.add(new UserDTO(2, "user02", "pass02", "짱구", new java.util.Date()));
users.add(new UserDTO(3, "user03", "pass03", "또치", new java.util.Date()));
}
@GetMapping("/users")
public ResponseEntity<ResponseMessage> findAllUsers(){
/* HttpHeaders 객체 만들고, 응답 컨텐츠 타입 설정 */
HttpHeaders hesders = new HttpHeaders();
headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
/* User정보를 담고 있을 Map을 만들고 ArrayList(users)의 key와 value 담기 */
Map<String, Object> responseMap = new HashMap<>();
reponseMap.put("users", users);
/* ResponseMessage에 응답코드, 메세지, 결과 값 담기*/
ResponseMessage responseMessage = new ResponseMessage(200, "조회 성공", responseMap);
return new ResponseEntity<>(responseMessage, headers, HttpStatus.OK);
}
}
POSTMAN
Test 2 - 유저 조회
조회 시 200번 코드로 응답
@RestController
@RequestMapping("/entity")
public class ResponseEntityTestController {
private List<UserDTO> users;
public ResponseEntityTestController(){
users = new ArrayList<>();
users.add(new UserDTO(1, "user01", "pass01", "뽀로로", new java.util.Date()));
users.add(new UserDTO(2, "user02", "pass02", "짱구", new java.util.Date()));
users.add(new UserDTO(3, "user03", "pass03", "또치", new java.util.Date()));
}
@GetMapping("/users/{userNo}")
public ResponseEntity<ResponseMessage> findUserByNo(@PathVariable int userNo){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
/* steam의 filter를 통해 No을 가지고 와서 steam 타입을 다시 List로 변환해서 UserDTO에 담기*/
UserDTO foundUser = users.stream().filter(user -> user.getNo() == userNo).toList().get(0);
Map<String, Object> responseMap = new HashMap<>();
responseMap.put("user", foundUser);
/* 빌더 패턴 형태로도 작성 가능하다.*/
return ResponseEntity
.ok() //HttpStatus
.headers(headers) //HttpHeaders
.body(new ResponseMessage(200,"조회 성공", responseMap)); //HttpBody
}
}
POSTMAN
반응형
Test 3 - 유저 등록
201 : 요청이 성공적으로 처리 되었으며, 자원이 생성 되었음을 나타내는 성공 상태 응답 코드
조회 시에는 200번 코드를 응답하지만 삽입 시에는 201번 코드를 응답한다.
해당 자원에 대한 요청 url을 location으로 설정하여 응답한다.
@RestController
@RequestMapping("/entity")
public class ResponseEntityTestController {
private List<UserDTO> users;
public ResponseEntityTestController(){
users = new ArrayList<>();
users.add(new UserDTO(1, "user01", "pass01", "뽀로로", new java.util.Date()));
users.add(new UserDTO(2, "user02", "pass02", "짱구", new java.util.Date()));
users.add(new UserDTO(3, "user03", "pass03", "또치", new java.util.Date()));
}
/* 조회는 GetMapping, 등록은 PostMapping */
@PostMapping("/users")
public ResponseEntity<?> registUser(@RequestBody UserDTO newUser){
/* 마지막 유저 번호 정의*/
int lastUserNo = users.get(users.size()-1).getNo();
newUser.setNo(lastUserNo + 1); //고유값 설정 , 새로운 유저는 마지막 유전 번호 +1
newUser.setEnrollDate(new java.util.Date()); //등록일 설정
users.add(newUser);
return ResponseEntity
.created(URI.create("/entity/users/" + users.get(users.size() -1).getNo()))
.build();
}
}
POSTMAN
Test 4 - 유저 정보 수정
수정 요청으로 자원의 내용이 변경 된다면 역시 201 코드로 응답한다.
만약 자원 수정 요청 결과가 기존의 자원 내용과 동일하여 변경 된 내용이 없을 경우에는 204로 응답할 수 있다.
204 : 요청이 성공했으나 클라이언트가 현재 페이지에서 벗어나지 않아도 된다는 것을 나타내는 상태 코드
@RestController
@RequestMapping("/entity")
public class ResponseEntityTestController {
private List<UserDTO> users;
public ResponseEntityTestController(){
users = new ArrayList<>();
users.add(new UserDTO(1, "user01", "pass01", "뽀로로", new java.util.Date()));
users.add(new UserDTO(2, "user02", "pass02", "짱구", new java.util.Date()));
users.add(new UserDTO(3, "user03", "pass03", "또치", new java.util.Date()));
}
@PutMapping("/users/{userNo}")
public ResponseEntity<?> modifyUser(@PathVariable int userNo, @RequestBody UserDTO modifyInfo){
System.out.println(modifyInfo);
UserDTO foundUser = users.stream().filter(user -> user.getNo() == userNo).toList().get(0);
foundUser.setId(modifyInfo.getId());
foundUser.setPwd(modifyInfo.getPwd());
foundUser.setName(modifyInfo.getName());
return ResponseEntity
.created(URI.create("/entity/users/" + userNo))
.build();
}
}
POSTMAN
Test 5 - 유저 삭제
삭제 요청을 하여 더 이상 참조할 수 없을 경우 204번으로 응답하는 것이 규칙이다.
하지만 204번으로 응답하는 API는 거의 없다시피 하다. 대부분은 200으로 응답한다.
@RestController
@RequestMapping("/entity")
public class ResponseEntityTestController {
private List<UserDTO> users;
public ResponseEntityTestController(){
users = new ArrayList<>();
users.add(new UserDTO(1, "user01", "pass01", "뽀로로", new java.util.Date()));
users.add(new UserDTO(2, "user02", "pass02", "짱구", new java.util.Date()));
users.add(new UserDTO(3, "user03", "pass03", "또치", new java.util.Date()));
}
@DeleteMapping("/users/{userNo}")
public ResponseEntity<?> removeUser(@PathVariable int userNo){
UserDTO foundUser = users.stream().filter(user -> user.getNo() == userNo).toList().get(0);
users.remove(foundUser); //원하는 유저를 찾아와서 리스트에서 리무브
return ResponseEntity
.noContent()
.build();
}
}
반응형
'프로그래밍 > Spring & Spring boot' 카테고리의 다른 글
[Spring boot] RESTAPI_05 Hateoas (0) | 2022.11.03 |
---|---|
[Spring boot] RESTAPI _ 04 Exception & validation(데이터 검증) (0) | 2022.11.03 |
[Spring boot] RESTAPI_02 Response (0) | 2022.11.03 |
[Spring boot ] REST API - 01 REST API & POSTMAN (0) | 2022.11.02 |
[Springboot / 스프링부트] thymeleaf (3) 타임리프 th:with, Spring EL, 속성값 설정 (1) | 2022.09.26 |