Repository 테스트 작성 중 실제 로그를 찍어보니 영속성 컨텍스트 내에서만 접근할 뿐 실제 DB 에는 접근하지 않았다. DB 에 입력된 데이터의 값으로 검증하기 위해서 영속성 컨텍스트의 캐싱된 데이터를 DB 와 동기화 시켰지만 일부 엔티티가 저장되지 않는 문제가 발생하였다. 왜 일부 엔티티만 DB 에 입력되었는지 알아보았다.
모모 서비스의 모임 관련 테이블과 도메인의 구조는 다음과 같다.
모임 관련 테이블 구조
backend/src/main/java/com/woowacourse/momo/group/domain/group/Group.java
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Long hostId;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private Category category;
@Column(nullable = false)
@Embedded
private Duration duration;
@Column(nullable = false)
private LocalDateTime deadline;
@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true,
cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
@JoinColumn(name = "group_id")
private List<Schedule> schedules = new ArrayList<>();
@Column(nullable = false)
private String location;
@Lob
@Column(nullable = false)
private String description;
...
}
backend/src/main/java/com/woowacourse/momo/group/domain/schedule/Schedule.java
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Schedule {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private LocalDate date;
@Column(nullable = false)
private LocalTime startTime;
@Column(nullable = false)
private LocalTime endTime;
...
}
테이블 상에서 외래키는 Schedule 이 Group 의 아이디를 관리한다. 엔티티 구조로 보면 Group 이 Schedule 을 리스트로 관리한다.
테스트를 수정하기 전, 즉 DB 까지 데이터가 저장되기 전의 테스트 코드는 다음과 같다. 저장된 모임의 아이디를 이용하여 모임 정보를 조회하는 테스트이다.
backend/src/test/java/com/woowacourse/momo/group/domain/group/GroupRepositoryTest.java
@DataJpaTest
class GroupRepositoryTest {
@Autowired
private GroupRepository groupRepository;
@DisplayName("식별자를 통해 모임을 조회한다")
@Test
void findById() {
List<Schedule> schedules = List.of(_7월_1일_10시부터_12시까지.newInstance(), _7월_2일_10시부터_12시까지.newInstance());
Group group = constructGroup(schedules);
Group savedGroup = groupRepository.save(group); // (1) 모임 및 일정 정보 저장
Optional<Group> foundGroup = groupRepository.findById(savedGroup.getId()); // (2) 모임 정보 조회
assertThat(foundGroup).isPresent();
assertThat(foundGroup.get()).usingRecursiveComparison()
.isEqualTo(savedGroup);
}
...
}
테스트를 실행하면 결과는 성공이다.
하지만 로그를 읽어보면 테스트하고자 했던 내용과는 다르다.