
200 OK로 응답을 받았다@RequestBody 는 HTTP Body의 데이터를 객체로 변환할 때 사용한다@RestController
@RequestMapping(path = "/api/v1")
public class ResponseApiController {
@GetMapping("")
public UserRequest user(){
UserRequest user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(10);
user.setEmail("hong@hmail.com");
return user;
}
}

@JsonNaming의 camel case, sanke case에 따라 값이 달라진다그런데, 우리는 다른 개발자와 협력을 한다...
- 만약 생성을 할 때는 201 상태코드를 내려야 한다면?
- 다른 http status를 사용해야 한다면?
- 400 error든 500 코드 등 기타 코드를 활용하고 싶다면??
@GetMapping("")
public ResponseEntity<UserRequest> user2(){
UserRequest user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(10);
user.setEmail("hong@hmail.com");
log.info("user : {}", user);
ResponseEntity<UserRequest> response = ResponseEntity
.status(HttpStatus.CREATED)
.header("x-custom","hi")
.body(user);
return response;
}
ResponseEntity<UserRequest> 이렇게 제네릭 타입을 사용한다stauts로 http 상태코드를 넣어줄 수 있다header을 통해 http header도 넣어줄 수 있다body에 객체를 넣어 json타입으로 응답해줄 수 있다
🤔 언제 사용할까?
- 메서드 내에서 응답을 할 때는 주로 객체(Object)를 이용한다
- responseEntity는 주로 해당 로직을 처리하다가, 예외를 처리할 때 많이 사용한다
- 커스텀해서 다른 협력하는 개발자와 합의한 내용을 보내줄 수 있다
🤔그런데 궁굼한게 생겼다...
- 우리가 응답 2번째 경우를 보면, 객체를 반환하는데 어떻게 json 타입을 반환해주지?
- 정답은 ObjectMapper에 있다!

- 직렬화 : DTO를 JSON형태로
- 역직렬화 : JSON을 DTO로
- springboot에서는 ObjectMapper을 이용한다
- Google에서 제공하는 Gson도 있다
@RequestBody가 들어올 때는, 역직렬화를 통해 json형태에서 dto 형태로 반환하고@RestController 즉 @ResponseBody가 있을 때는, 반환시 직렬화를 통해 DTO 형태를 josn으로 만들어 json으로 반환을 해준다@SpringBootTest
class RestApiApplicationTests {
@Autowired // 스프링에서 관리하는 빈들 중에서 자동으로 생성되는 오브젝트 메퍼를 가져오겠다는 의미
private ObjectMapper objectMapper;
@Test
void contextLoads() throws JsonProcessingException {
UserRequest user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(10);
user.setEmail("hong@hmail.com");
user.setIsKorean(true);
String json = objectMapper.writeValueAsString(user);// 직렬화를 쓰기 위해서 write를 한다
System.out.println(json); // {"user_name":"홍길동","user_age":10,"email":"hong@hmail.com","is_korean":true}
UserRequest dto = objectMapper.readValue(json, UserRequest.class);
System.out.println(dto); // UserRequest(userName=홍길동, userAge=10, email=hong@hmail.com, isKorean=true)
}
주의!
- ObjectMapper는
writeValueAsString을 통해서 직렬화를 해주는데- 이때 변수 기준이 아닌 get이라는 이름이 들어가는 메서드를 참고한다
- 🤔 즉 프로퍼티 규약중 getter가 없으면, 잘 작동하지 않는다
- 또한
✅ @JsonProperty를 통해 Json으로 직렬화시 이름을 바꿔 줄 수 있다
만약 다른 사림이 get메서드를 만든다면?
- 만약 누가 get메서드를 하나더 만들었다고 가정하자
@Data public class UserRequest { private String userName; private Integer userAge; private String email; private Boolean isKorean; public String getUser(){ return userName; }
- user가 2개가 되었다 (직렬화시 get을 참고하기 때문에)
- 만약 내가 json으로 사용하지 않는 변수가 있다면 꼭
✅ @JsonIgnore을 붙여주자!
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) // 헤당 클래스의 변수들을 snake_case로 매핑하겠다!
public class UserRequest {
private String userName;
private Integer userAge;
@JsonProperty("user_email")
private String email;
private Boolean isKorean;
@JsonIgnore
public String getUser(){
return userName;
}
}

그렇다면 역 질렬화는?
- private으로 기본생성자를 막아놨지만...
- ObjectMapper는 리플렉터를 이용해서 , 객체를 생성했다(이부분은 지금은 넘어가자)
- 역직렬화는 프로퍼티 setter을 통해 역직렬화를 한다
- 🤔즉 프로퍼티 규약중 setter가 없으면, 잘 작동하지 않는다
- 그런데 setter 메서드가 없으면 getter메서드를 이용해 역직렬화를 하기도 한다!
만약 getter와 setter가 없다면???
- 모두
@JsonProperty를 이용해 모두 매칭을 할 수 있다!- 그런데 변수가 많다면??? -> 활용하기 어렵다

ISO 8601로 국제 표준이다그런데.. 🤔하나하나 @JsonNaming을 붙인다면? -> 우리가 사용하는 프로젝트에서는 정말 많은 Contoller가 있을 것이다! -> 공통화 처리를 해주자
@Configuration
public class ObjectMapperConfig {
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jdk8Module()); // jdk 8 버전 이후 클래스
objectMapper.registerModule(new JavaTimeModule()); // << local date
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 모르는 json field에 대해서는 무시 한다
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
//날짜 관련 직렬화
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 스테이크 케이스
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategies.SnakeCaseStrategy());
return objectMapper;
}
}

@Data 어노테이션을 이용한다물론 is붙은 변수들은 조심해야 한다!!!
ObjectMapper을 이용을 원칙으로 한다@JsonProperty를 이용한다@JsonIgnore을 붙여준다