# TIL: 2022-07-30

wisdom·2022년 7월 30일
0

Today I learned

목록 보기
7/79

오늘 한 일

  • 게시판 프로젝트 기능 구현
  • 깃 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로 매칭한 경우 테이블 단위로 유연하게 변경 가능하다.
  • 코드의 중복이 생겼다는 문제와 하나의 클래스가 너무 장황해진다는 단점이 있다.
  1. 공통필드 추출
  • 중복 코드를 없앨 수 있다.
  • 단점은 추출하면서 depth 가 하나 더 생겨 한 눈에 엔티티 파악하는 게 어렵다.

공통 필드 추출하는 방식

  1. @MappedSuperclass
    • 상속 방식으로 추출
  2. @Embedded

공통 필드를 추출하거나 혹은 1엔티티 1데이터베이스 테이블로 매칭하는 2가지 선택지 중 선택하는 건 tradeoff 관계이다. 정답은 없다. 그리고 선택지가 더 있을 수도 있다.

불변 객체 만들 때 record 로?!!

  • 불변 데이터 객체를 쉽게 생성할 수 있도록 하는 클래스
  • JDK16에서 포함됨

회고

  • record를 이용해서 DTO를 만들면 좋을 것 같다. 다음에 한번 적용해봐야겠다.
  • 슬라이스 테스트에 대해서 더 자세하게 공부해보고 싶다고 느꼈다.
profile
문제를 정의하고, 문제를 해결하는

0개의 댓글