본문 바로가기

Spring Boot

[Spring Boot] Web에서 응답 만드는 방법 - Response Entity

728x90

Spring Boot에서 응답을 만드는 방법

Spring Boot에서 응답을 생성하는 방법에는 4가지가 있습니다.

  1. String
    • 일반 Text Type 응답
  2. Object
    • 자동으로 JSON 변환되어 응답 상태값은 항상 상태 코드 200(OK)
  3. ResponseEntity
    • Body의 내용을 Object로 설정하고 상황에 따라서 HTTP 상태 코드를 설정
  4. @ResponseBody
    • RestController가 아닌 Controller에서 JSON 응답을 내릴 때 사용

 

ResponseEntity 반환

ResponseEntity는 Object 타입으로 반환할 때보다 조금 더 상세하게 반환하고 싶을 때 사용하는 방식입니다.

알아두어야 할 것

@RestController는 기본적으로 JSON을 반환하는 라우터입니다.

 

String 타입으로 반환

import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController  // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {

    @GetMapping("")
    public String user() {
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(24);
        user.setEmail("hong123@naver.com");
        user.setIsKorean(true);

        log.info("user : {}", user);
        return user.toString();
    }
}

 

user 객체에 setter로 값을 설정하고 해당 값을 toString으로 반환하여 문자열로 응답합니다

 

header를 확인해보면 Content-Type이 text/plain으로 설정된 것을 확인할 수 있습니다.

Object 타입으로 반환

import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController  // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {

    @GetMapping("")
    public UserRequest user() {
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(24);
        user.setEmail("hong123@naver.com");
        user.setIsKorean(true);

        log.info("user : {}", user);
        return user;
    }
}

 

객체를 반환하면 JSON으로 변환되어 응답됩니다.

 

헤더를 확인해보면 application/json으로 설정된 것을 확인할 수 있습니다.

 

ResponseEntity 타입으로 반환

import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController  // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {

    @GetMapping("")
    public ResponseEntity<UserRequest> user() {
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(24);
        user.setEmail("hong123@naver.com");
        user.setIsKorean(true);

        log.info("user : {}", user);

        var response = ResponseEntity
                .status(HttpStatus.OK)
                .header("custom_key", "custom_value")
                .body(user);
        return response;
    }
}

 

상태 코드는 OK(200)으로 설정하고, 헤더에 custom_key, custom_value를 추가했습니다.

 

 

 

상태 코드 변경

201번 CREATED로 바꾸어 보겠습니다

import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController  // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {

    @GetMapping("")
    public ResponseEntity<UserRequest> user() {
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(24);
        user.setEmail("hong123@naver.com");
        user.setIsKorean(true);

        log.info("user : {}", user);

        var response = ResponseEntity
        		// 상태 코드 변경
                .status(HttpStatus.CREATED)
                .header("custom_key", "custom_value")
                .body(user);
        return response;
    }
}

 

상태 코드를 201(CREATED)로 변경했습니다.

ResponseEntity의 장점

ResponseEntity는 헤더, 상태 코드 등 세부적인 정보를 설정할 수 있습니다.

 

 

ResponseEntity 언제 써야 할까?

ResponseEntity는 상태 코드에 따른 예외 처리를 할 때 사용할 수 있습니다. 대표적인 예시로는 404 상태 코드가 있습니다.

 

404 예외 처리

404는 클라이언트가 잘못된 경로로 요청을 한 경우에 발생합니다.

서버 경로를 잘못 설정하면, 아래와 같은 404 오류 페이지가 호출됩니다:

404 예외 처리가 된 서버 예시(네이버)

 

@Controller와 @ResponseBody 사용 예제

@Controller는 뷰 템플릿 엔진과 함께 사용되어 HTML 등의 뷰를 반환하는 데 사용됩니다. 하지만 @Controller를 사용하면서 JSON 타입의 응답을 원할 때는 @ResponseBody 어노테이션을 함께 사용해야 합니다.

@Controller 사용 시 @ResponseBody를 사용하지 않은 경우

@Slf4j
@Controller  // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {


    @GetMapping("")
    public ResponseEntity<UserRequest> user() {
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(24);
        user.setEmail("hong123@naver.com");
        user.setIsKorean(true);

        log.info("user : {}", user);

        var response = ResponseEntity
                .status(HttpStatus.CREATED)
                .header("custom_key", "custom_value")
                .body(user);
        return response;
    }
}

 

위 코드는 @Controller 어노테이션을 사용했지만, @ResponseBody를 사용하지 않았기 때문에 JSON 응답이 아닌 뷰 이름을 반환하려 시도하게 되어 오류가 발생합니다

 

@Controller 사용 시 @ResponseBody를 사용하는 경우

import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;


@Slf4j
@Controller  // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {

    @ResponseBody
    @GetMapping("")
    public UserRequest user() {
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(24);
        user.setEmail("hong123@naver.com");
        user.setIsKorean(true);

        log.info("user : {}", user);
        return user;
    }
}

 

위 코드는 @Controller 어노테이션과 함께 @ResponseBody 어노테이션을 사용하여 메서드가 JSON 타입으로 응답하도록 만듭니다.

핵심 요약

  • @Controller 어노테이션은 기본적으로 뷰 이름을 반환하여 뷰 템플릿 엔진을 통해 HTML 등을 렌더링합니다.
  • JSON 타입으로 응답하려면 @Controller 어노테이션과 함께 @ResponseBody 어노테이션을 사용해야 합니다.
  • @RestController 어노테이션은 @Controller와 @ResponseBody를 합친 형태로, 기본적으로 JSON 응답을 반환합니다.
728x90