제목 후보


Repository 테스트 작성 중 실제 로그를 찍어보니 영속성 컨텍스트 내에서만 접근할 뿐 실제 DB 에는 접근하지 않았다. DB 에 입력된 데이터의 값으로 검증하기 위해서 영속성 컨텍스트의 캐싱된 데이터를 DB 와 동기화 시켰지만 일부 엔티티가 저장되지 않는 문제가 발생하였다. 왜 일부 엔티티만 DB 에 입력되었는지 알아보았다.

모모 서비스의 모임 관련 테이블도메인의 구조는 다음과 같다.

모임 관련 테이블 구조

Untitled

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);
		}

		...
}

테스트를 실행하면 결과는 성공이다.

Untitled

하지만 로그를 읽어보면 테스트하고자 했던 내용과는 다르다.