오늘 한 일
- 게시판 프로젝트 기능 구현
- 깃 stash 공부
- 스프링부트 슬라이스 테스트 코드 작성
배움
깃 Stash
- 커밋하기에는 애매하고, 그렇다고 코드를 날릴 수도 없고 리비전을 돌아가야 되는 상황에서 쓸 수있는 해결책이 바로 stash 다.
- 예를들면 책상 위에 올릴 수 있는 물건은 책상 크기로 인해 한정적이다. 그때 지금 당장은 필요없는 물건들을 책상 서랍에 잠깐 보관했다가 필요할 때 다시 꺼내서 쓰면 되는 느낌
@Repository 어노테이션
- 아래 코드에 @Repository 어노테이션 안 붙여도 정상 동작함
- 왜냐하면 JpaRepository의 구현체인 SimpleJpaRepository에 @Repository 가 이미 붙어 있음
- 그리고 @Repository 같은 Stereo type 은 기본적으로 인터페이스가 아닌 구현 클래스에 붙인다.
public interface ArticleRepository extends JpaRepository<Article, Long> {
}
Spring Data REST
- REST API를 쉽게 만들기 위한 기술
- 특징
- Repository 인터페이스 정의만으로 REST API 제공
- Query Method: 메소드 선언으로 검색 API 지원
- Projection: 데이터 표현 방식을 다양하게 정의/표현 가능
- HATEOAS: 메타데이터 표현(Model, Link, Resource)
@DataJpaTest
- JPA 관련 테스트 설정만 로드하는 어노테이션
- 메모리상에 내부 데이터베이스를 생성하고 @Entity 클래스들을 등록하고 JPA Repository 설정들을 해준다. 각 테스트마다 테스트가 완료되면 관련한 설정들은 롤백된다.
- 메서드 단위로 자동으로 transactional이 걸려있다.
- 기본값이 롤백으로 동작
- 문제는 내가 만든 JpaConfig 클래스를 읽지 못한다는 것인데 그래서 발생하는 문제가 @EnableJpaAuditing 옵션 추가한 것을 모르게 된다.
- 해결 방법은 @Import(JpaConfig.class) 어노테이션을 추가해주면 된다.
- 참고로 테스트할 때 junit5 의 경우, 테스트에서도 생성자 주입 패턴을 사용할 수 있다.
@DisplayName("JPA 연결테스트")
@Import(JpaConfig.class)
@DataJpaTest
class JpaRepositoryTest {
private final ArticleRepository articleRepository;
private final ArticleCommentRepository articleCommentRepository;
public JpaRepositoryTest(@Autowired ArticleRepository articleRepository,
@Autowired ArticleCommentRepository articleCommentRepository) {
this.articleRepository = articleRepository;
this.articleCommentRepository = articleCommentRepository;
}
}
중복되는 엔티티 필드들은 추출해보는 게 어떨까?
댓글과 게시글에 메타데이터인 공통 필드가 있다.
공통 필드에 대한 두 가지 방법이 있다.
1. 반복같은 거 신경쓰지 말고 1 entity 를 1 데이터베이스 테이블로 매칭한다.
- 변경에 유연하다. 테이블 단위 변경.
- 댓글에서는 updatedBy 가 있어야 하지만 게시글에서는 updatedBy가 필요없어지는 경우가 발생할 수 있는데 1 entity 1 database table로 매칭한 경우 테이블 단위로 유연하게 변경 가능하다.
- 코드의 중복이 생겼다는 문제와 하나의 클래스가 너무 장황해진다는 단점이 있다.
- 공통필드 추출
- 중복 코드를 없앨 수 있다.
- 단점은 추출하면서 depth 가 하나 더 생겨 한 눈에 엔티티 파악하는 게 어렵다.
공통 필드 추출하는 방식
- @MappedSuperclass
- @Embedded
공통 필드를 추출하거나 혹은 1엔티티 1데이터베이스 테이블로 매칭하는 2가지 선택지 중 선택하는 건 tradeoff 관계이다. 정답은 없다. 그리고 선택지가 더 있을 수도 있다.
불변 객체 만들 때 record 로?!!
- 불변 데이터 객체를 쉽게 생성할 수 있도록 하는 클래스
- JDK16에서 포함됨
회고
- record를 이용해서 DTO를 만들면 좋을 것 같다. 다음에 한번 적용해봐야겠다.
- 슬라이스 테스트에 대해서 더 자세하게 공부해보고 싶다고 느꼈다.