Spring/Spring Boot

[Spring Boot] 응답(response) 만들기!

jinsang-2 2025. 4. 29. 23:55

응답 만들기 4가지 

  • String : 일반 Text Type 응답
  • Object : 자동으로 Json 변환되어 응답, 상태 값은 항상 200 OK
  • ResponseEntity : Body의 내용을 Object로 설정, 상황에 따라 HttpStatus Code 설정
  • @ResponseBody : RestController가 아닌곳(Controller)에서 Json 응답을 내릴 때

Object 객체 응답

DTO

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequest {
    private String userName;
    private Integer UserAge;
    private String email;
    private Boolean isKorean ;
}

ResponseApiController

@RestController
@RequestMapping("/api/v1")
public class ResponseApiController {
    @GetMapping("")
    public UserRequest user(){
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(10);
        user.setEmail("HONG@GMAIL.COM");
        return user;
    }
}
/* 응답 결과
dto에서 JsonNaming 을 제거한다면 camelCase로 응답이 올것이다. 
{
    "user_name": "홍길동",
    "email": "HONG@GMAIL.COM",
    "is_korean": null,
    "user_age": 10
}
*/

String 응답

  • 반환형 String
  • 반환값을 toString()
  • plain text 값으로 UserRequest(userName=홍길동, UserAge=10, email=HONG@GMAIL.COM, isKorean=null) 응답
@Slf4j
@RestController
@RequestMapping("/api/v1")
public class ResponseApiController {
    @GetMapping("")
    public String user(){
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(10);
        user.setEmail("HONG@GMAIL.COM");
        
        log.info("user:{}",user);
        return user.toString();
    }
}

ResponseEntity custom한 응답 내리기!

@Slf4j
@RestController
@RequestMapping("/api/v1")
public class ResponseApiController {
    @GetMapping("")
    public ResponseEntity<UserRequest> user(){
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(10);
        user.setEmail("HONG@GMAIL.COM");

        log.info("user:{}",user);
        var response = ResponseEntity
                .status(HttpStatus.NOT_FOUND)
                .header("x-custom","h1")
                .body(user);
        return response;
    }
}

커스텀 status 조정

  • .status(HttpStatus.NOT_FOUND)
    • 404 Not Found status가 뜬다.

  • .header("x-custom","h1")
    • 헤더에 key, value 형태로 커스텀하게 들어감

@Controller 와 @RestController

  • @Controller 는 Spring 때부터 사용
    • html 응답을 사용할 때 사용
    • 옛날에는 Controller만 있었는데 지금은 RestController랑 갈라짐
  • @RestController
    • JSON 응답할 때 사용

@GetMapping , @RequestMapping(path = "", method = RequestMethod.GET)

@GetMapping("")
// 위에와 아래는 같은 기능의 코
@RequestMapping(path = "", method = RequestMethod.GET)
  • @RequestMapping(path = "") 만 한다면 모든 REST 요청 받을 수 있음. 사용 X

@Controller 사용시

@Slf4j
@Controller 
@RequestMapping("/api/v1")
public class ResponseApiController {
    @GetMapping("")
    @ResponseBody // @Controller 일 때 json으로 응답
    public UserRequest user(){
        var user = new UserRequest();
        user.setUserName("홍길동");
        user.setUserAge(10);
        user.setEmail("HONG@GMAIL.COM");

        log.info("user:{}",user);
        var response = ResponseEntity
                .status(HttpStatus.NOT_FOUND)
                .header("x-custom","h1")
                .body(user);
        return user;
    }
}
  • @Controller 사용시에 @ResponseBody를 넣어주지 않고 user를 그냥 return 해준다면 html 형식으로 응답 받아야 하는 Controller이기에 404 NOT Found가 뜬다.
    • 그래서 json 형식으로 응답해 줄 수 있는 @ResponseBody 어노테이션을 넣어줘야 한다.