본문 바로가기
공부/Spring

[chap16] JSON 응답과 용청 처리

by JERO__ 2022. 6. 9.

JSON 규칙

{
	"name" : "유관순",
	"birthday": "1902-12-16",
	"edu" : [
		{
			"title" : "이화학당보통과",
			"year" : 1916
		},
		{
			"title" : "이화학당고등과",
			"year" : 1919
		}
	]
}
  • 중괄호
  • 이름과 값 :

응답 : @RestController

  • @Controller
  • @ResponseBody

JSON 형태 변경

1. 제외 예외처리 @JsonIgnore

  • Response를 정해서 반환해주는데, 이걸 굳이 사용하는 경우가 있을까?
public class Member {
		private id;
		private email;
		@JsonIgnore
		private String password;
}

2. 날짜 형식 변환 처리1 @JsonFormat

{
		"registerDateTime" : 1519870069000         // LocalDataTime 타입
}
  • 형식을 변환하면?
public class Member {
		
	@JsonFormat(shape = Shape.STRING)             // ISO-8601 형식
	private LocalDateTime registerDataTime1;
	@JsonFormat(pattern = "yyyyMMddHHmmss")             // pattern
	private LocalDateTime registerDataTime2;
}
{
		"registerDateTime1" : "2018-03-01T11:07:49"         // LocalDataTime 타입
		"registerDateTime2" : "20180301020749"
}

3. 날짜 형식 변환 처리2 : 기본 적용 설정

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
    
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
                .simpleDateFormat("yyyyMMddHHmmss")   // Date 변환 패턴
                .build();
        converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));
    }
}

응답데이터 @RequestBody

  • 생략할 수 있다.
  • @Valid 로 요청 객체를 검증

응답코드 지정하기 @HttpServletResponse

@GetMapping("/api/members/{id}")
public Member member(@PathVariable Long id, HttpServletResponse response) throws IOException {
    Member member = memberService.selectById(id);
    if (member == null) {
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
        return null;
    }
    return member;
}
  • 이 방법보다 ResponseEntity를 사용하자

ResponseEntity를 이용한 응답 데이터 처리

  • 에러 클래스
public class ErrorResponse {

    private String message;

    public ErrorResponse(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
  • Controller 코드
@GetMapping("/api/members/{id}")
public ResponseEntity<Object> member(@PathVariable Long id) {
    Member member = memberService.selectById(id);
    if (member == null) {
        return ResponseEntity.status(HttpStatus.NOT_COUND)
							.body(new ErrorResponse("no member"));
    }
    return ResponseEntity.status(HttpStatus.OK);
}

댓글