[데브코스] Spring Boot 인증·인가(Auth) (7강) - DTO 스펙 변경 시 테스트도 함께 수정하기 (MockMvc / jsonPath)

zuno·2026년 1월 6일

이번 강의에서는 DTO 응답 스펙이 바뀌면 테스트 코드도 반드시 함께 수정해야 한다는 점을 다뤘다.
테스트는 단순히 “돌아가나 확인”이 아니라, API 응답 스펙(계약)을 고정하는 역할을 한다.


✅ 변경 배경: DTO 스펙이 바뀜

6강에서 PostDto, PostCommentDto에 작성자 정보가 추가되었다.

  • authorId
  • authorName
  • (댓글은 추가로) postId

DTO가 바뀌면, 컨트롤러 응답 JSON 구조도 바뀐다.
따라서 기존 테스트는 “예전 JSON”을 기대하고 있어서 실패할 수 있다.


✅ 이번 7강 작업: 테스트 코드에 DTO 변경 반영

테스트 코드에서 새 필드를 검증하는 assert가 추가되었다.

예를 들어 글 단건 조회/작성 테스트에서:

.andExpect(jsonPath("$.data.authorId").value(post.getAuthor().getId()))
.andExpect(jsonPath("$.data.authorName").value(post.getAuthor().getNickname()))

리스트 응답 테스트에서:

.andExpect(jsonPath("$[%d].authorId".formatted(i)).value(post.getAuthor().getId()))
.andExpect(jsonPath("$[%d].authorName".formatted(i)).value(post.getAuthor().getNickname()))

🧠 테스트 코드 문법 이해하기 (MockMvc / jsonPath)

1) .andExpect(...)가 뭐야?

MockMvc로 요청을 보내면, 결과(Response)에 대해 기대값을 검증(assert) 할 수 있다.

mockMvc.perform(get("/api/v1/posts/1"))
       .andExpect(status().isOk())
       .andExpect(jsonPath("$.data.title").value("제목"));
  • perform() : 요청 실행
  • andExpect() : 결과가 기대한 값과 같은지 확인(틀리면 테스트 실패)

2) jsonPath("...")가 뭐야?

응답이 JSON일 때, JSON 안에서 특정 위치 값을 뽑는 문법이다.

✅ 자주 쓰는 jsonPath 규칙

표현의미
$JSON의 루트(root)
$.data루트 아래 data
$.data.titledata 안의 title
$[0]배열의 0번째 요소
$[0].title배열 0번째의 title

예시 JSON

{
  "resultCode": "200-1",
  "data": {
    "id": 1,
    "title": "제목"
  }
}
  • $.data.id → 1
  • $.data.title → "제목"

3) .value(...)는 뭐야?

jsonPath()로 뽑은 값이 이 값이 맞는지 확인하는 부분

.andExpect(jsonPath("$.data.title").value("제목"))

즉, “응답 JSON에서 $.data.title 값이 제목 이어야 한다” 뜻.


4) Matchers.startsWith(...)는 뭐야?

날짜/시간 문자열은 초/나노초까지 다르면 테스트가 자주 깨진다.
그래서 “앞부분만 맞으면 통과” 하게 만드는 패턴을 쓰기도 한다.

.andExpect(jsonPath("$.data.createDate")
    .value(Matchers.startsWith(post.getCreateDate().toString().substring(0, 20))))
  • startsWith("2026-01-07T06:16:") 이런 식으로 앞부분만 비교

📌 즉, “createDate가 완전히 똑같진 않아도, 앞부분이 같으면 OK” 전략


0개의 댓글