Entity 생성 및 Repository 테스트

이정음·2022년 4월 15일
0

SpringBoot

목록 보기
1/7

1. Entity 생성

미리 작성된 ERD를 바탕으로 도메인 생성

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Todo extends BaseEntity {
    @Id @GeneratedValue
    private Long seq;

    @Builder
    public Todo(String name, String content, TodoStatus status, Integer predictedPomo, Integer realPomo, WorkProficiency workProficiency, WorkType workType, WorkImportance workImportance) {
        this.name = name;
        this.content = content;
        this.status = status;
        this.predictedPomo = predictedPomo;
        this.realPomo = realPomo;
        this.workProficiency = workProficiency;
        this.workType = workType;
        this.workImportance = workImportance;
    }

		@ManyToOne(fetch = FetchType.LAZY)
		@JoinColumn(name="group_seq")
    private Group group;

    private String name, content;
    private TodoStatus status;

    private Integer predictedPomo, realPomo;

    private WorkProficiency workProficiency;
    private WorkType workType;
    private WorkImportance workImportance;
}

[ Annotation ]

  • @Entity: 테이블에 대응하는 하나의 클래스
    • 기본 생성자 필수! → JPA가 엔티티 객체 생성 시 기본 생성자 사용
  • @Getter: Lombok라이브러리로 Getter 메소드 생성
    • Setter를 쓰지 않는 이유: 어떤 포인트에서든지 Setter 함수 호출을 통해 Entity의 값을 변경할 수 있다면, 변경한 의도를 파악하기 어려움 → 의도를 파악할 수 있는 함수를 만들어 호출
      ( More: https://yoonbing9.tistory.com/28 )
  • @Id: 기본키 매핑
    • @GeneratedValue와 같이 사용 시, 자동 생성
  • @Builder: 엔티티 객체 생성자 → Builder 패턴 적용
    • 인자가 많을 경우 안전하게 객체 생성 가능
    • 인자의 순서와 상관없이 객체 생성 가능

[ 연관관계 매핑 ]

Todo는 Group과 단방향 N:1 관계를 가지고 있음

  • ManyToOne
    • 다대일 관계를 나타내는 매핑정보
    • fetch = fetchType.LAZY
      • ToDo를 조회할 시, Group을 조회하는 쿼리가 생성되지 않고, 실제로 Group을 사용하는 시점에서 Group을 조회하는 쿼리가 나감 → Proxy로 조회
  • JoinColumn(name=”team_seq”)
    • 매핑할 외래키의 이름을 명시하여 생성
  • More: https://private-space.tistory.com/87

2. Repository 생성

public interface TodoRepository extends JpaRepository<Todo, Long> {}

JPARepository를 상속 받는 interface생성

  • JPARepository
    • CRUD 메소드를 제공
    • 메소드 명명규칙에 따라 메소드 이름을 지어주면, JPA가 이름을 분석해 적절한 JPQL 실행

3. Repository 단위테스트

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class TodoRepositoryTest {
    @Autowired
    private TodoRepository todoRepository;

    @Test
    void testCreateTodo() {
        // given
        Todo todo = Todo.builder()
                .name("할일")
                .content("내용")
                .predictedPomo(1)
                .realPomo(1)
                .status(TodoStatus.TODO)
                .workImportance(WorkImportance.LOWER)
                .workProficiency(WorkProficiency.ADVANCED)
                .build();

        // when
        Todo savedTodo = todoRepository.save(todo);

        // then
        assertThat(savedTodo.getName()).isEqualTo("할일");
        assertThat(savedTodo.getContent()).isEqualTo("내용");
        assertThat(savedTodo.getPredictedPomo()).isEqualTo(1);
        assertThat(savedTodo.getRealPomo()).isEqualTo(1);
        assertThat(savedTodo.getStatus()).isEqualTo(TodoStatus.TODO);
        assertThat(savedTodo.getWorkImportance()).isEqualTo(WorkImportance.LOWER);
        assertThat(savedTodo.getWorkProficiency()).isEqualTo(WorkProficiency.ADVANCED);
    }
}
profile
코드먹는 하마

0개의 댓글