프로그래밍/Spring & Spring boot

[Springboot] RESTAPI_03 ResponseEntity

pupu91 2022. 11. 3. 18:01
반응형

 

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();
	}
}
반응형