[SpringBoot] Response

허훈·2023년 12월 26일
0

spring-boot

목록 보기
4/6
post-thumbnail

지난 시간까지는 서버에서 어떻게 여러 HTTP 메서드(GET, POST, PUT, DELETE)들을 통해 클라이언트로부터 데이터(요청)를 받아오는지 알아보았는데, 서버 내에서 받아온 그 데이터에 대한 로직 수행 후, 어떻게 클라이언트한테 응답을 돌려주는지 알아보고자 한다.

@RestController
@RequestMapping("/api/response")
public class APIController { }

Controller 클래스를 하나 만들고, @RestController 어노테이션을 붙이고, @RequestMapping 어노테이션을 통해 경로를 지정해주자. 너무 많이 해서 이제는 지겨울 지경이다.


✅ 1. Text

@GetMapping("/text")
public String text(@RequestParam String id) {
    return id;
}

GetMapping 방식으로 Query String을 통해 id를 받아오는 메서드이다. 파라미터로 넘어온 id를 리턴하면, HTML Body에 문자열 그대로 출력된다. 이미 눈치챘겠지만, 이렇게 Response를 하는 경우는 거의 없다. 이런 방법이 있다...고만 알아두자.


✅ 2. Json

@Setter
@Getter
@ToString()
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class User {
    private String userName;
    private int userAge;
    private String userPhone;
}

@PostMapping("/json")
public User json(@RequestBody User user) {
    return user;
}

JSON 형식으로 넘어온 파라미터를 DTO 객체로 받으면, SpringBoot가 알아서 JSON key값과 대응되는 DTO의 멤버변수에 값을 자동으로 대입해준다고 지난 시간에 배웠다. 또한, snake_case로 선언된 JSON의 key값과 camelCase로 선언된 DTO의 멤버 변수를 매칭하기 위해 @JsonNaming 어노테이션을 사용하는 것까지는 알고 있다.

그런데 DTO 클래스(User) 상단에 처음보는 어노테이션이 덕지덕지 붙어있다? @Getter, @Setter, @ToString... 이름만 보고 대충 유추가 될테지만 해당 어노테이션을 클래스 상단에 선언하면, 모든 변수에 대한 getter 메서드, setter 메서드, toString 메서드를 자동으로 SpringBoot에서 만들어준다. 굳이 n줄의 getter, setter, toString 메서드를 개발자가 직접 작성할 필요가 없는 것이다. 가독성 면에서 정말 최고의 어노테이션이 아닌가?

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

단, @Getter, @Setter와 같은 어노테이션을 사용하기 위해서는 Lombok 라이브러리를 프로젝트에 주입을 해주어야 한다. 상단의 코드를 build.gradle 파일의 dependencies { }에 추가하도록 하자.

아무튼 다시 본론으로 돌아와서...
메서드에서 DTO 객체를 리턴해주면 HTML Body에 JSON 형식으로 데이터가 출력된다.


✅ 3. Response Entity

@PutMapping("/response-entity")
public ResponseEntity<User> responseEntity(@RequestBody User user) {
    return ResponseEntity.status(HttpStatus.CREATED).body(user);
}

Response Entity 객체를 사용하면, HTTP Response 메시지를 서버에서 직접 제어할 수 있다. HTTP Status, HTTP Body, 심지어는 HTTP Header 값도 임의로 추가할 수 있어서, Response에 필요한 정보를 모두 담은 객체라고 보면 된다.

위 코드는 PUT(리소스 생성/변경) 메서드를 사용하여 리소스 생성 로직(로직 과정은 생략)을 처리한 후, 응답을 보내는 예시이다. 저번 시간 PutMapping에서 배웠듯이, 우리는 @RequestBody 어노테이션을 통해 클라이언트가 JSON 형태로 보낸 데이터 DTO 객체로 받는데, 그동안은 메서드에서 DTO 객체를 그대로 리턴했다면, 이제는 상태 코드, 각종 헤더 등을 개발자가 유연하게 리턴할 Response 메시지를 직접 설정해줄 수 있는 것이다.

이 때, ResponseEntity의 제너릭 타입에는 HTTP Body에 들어올 자료형을 선택하는데,
여기서는 User(DTO) 객체가 JSON 타입으로 변환되어야 하므로, User 클래스로 지정한다.
또한, status 메서드에는 HTTP Status를, body 메서드에는 HTTP Body에 들어갈 데이터(여기서는 User DTO)를 인수로 담아서 리턴하면 된다.

POST, 혹은 PUT 메서드를 사용해 리소스가 정상적으로 추가된 경우,
HTTP Status로 201(HTTPStatus.CREATED)을 리턴한다.


0개의 댓글

관련 채용 정보