실전 jpa활용1편

네코·2022년 7월 14일
0

기본편 안듣고 활용편 먼저 들으면서 남기는 기록

Enetity 객체 생성 후 진행 과정에서

  1. @Repository는 정확히 하는 일이 뭔가
    like DAO와 비슷하다, 엔티티를 찾아주는 역할을 한다고 언급

  2. PersistenceContext, EntityManager란?

  3. save()함수
    보통 반환형으로 엔티티를 반환하지만 영한님 스타일 중
    커맨드와 쿼리를 분리하자 원칙에 따라 저장 후엔 가급적 리턴값을 안만드는 커맨드성
    id 정도 있으면 조회가 가능해서 id를 반환했다

ctrl+shift+T => 테스트 메서드 생성 단축키
테스트 시에 @RunWith() => @ExtendWith(SpringExtension.class)로 바뀜

tdd live template 생성

@) entitymanager를 통한 모든 데이터 변경은 항상 transaction 안에서 이뤄져야한다.

@)일반적으로 @Transactional 이 test메서드에 붙으면 실행 후 rollback을 한다. 따라서 케이스가 남아 있지 않는다.

  1. 같은 transactional 안에서 저장, 조회하면 영속성 컨텍스트가 똑같다=> 같은 영속성 컨텍스트 안에서 id가 같으면 같은 Entity로 식별..?

로그보면 insert쿼리만 있고 select 쿼리는 없음, 1차 캐시에서 같은 영속성 컨텍스트이기 때문에 꺼내옴..?

오류) 강의와 다르게 나는 insert 쿼리 log가 뜨지 않아서 yml 파일 작성에 문제인 줄 알았으나 @Rollback(false)하지 않아서 안보이던 것

쿼리파라미터 찍기
yml 파일에서 logging 부분 하위 org.hibernate.type: trace 추가
나아가서 spring-boot-data-source-decorator

Q5) 보통 레퍼지토리 구현을 JpaRepository인터페이스 구현한 걸 그대로 썻는데 어떤 차이인지,,

@) @PersistenceContext 하면 자동 주입된다고 생각.
entitymanger가 하는일은 정확히 뭔가, 왜 필요한가 등등

도메인(=객체)에 어떤 역할과 책임을 주고 어떤 방식으로 메세지를 주고 받을지 고민할 것

Q6) 팩토리 패턴은 무엇인가 ?

Q7) 회원가입시 여러 was가 띄워진 상태에서 완벽하게 동일한 시간에 동일 이름의 회원가입을 할경우가 있을 수 있으므로 db의 해당 컬럼을 unique index로 잡아주자

@) 필드에서 의존 주입을 하거나 setter를 통해 주입하기 보다 constructor로 주입하는 방식을 선호한다. 필드에서 주입하면 테스트, 수정이 어렵고 setter는 런타임에 변경될 가능성을 만들기 때문에 constructor injection을 선호한다

@) @RequiredArgsConstructor는 final이 붙은 의존대상만을 constructor방식으로 주입한다.

@) 엔티티 도메인에 비즈니스 로직을 포함시키는게 바람직하다.

@)jpa에선 static으로 만들어둔 생성 로직이외 객체를 생성하지 못하게 하기 위해서 생성자를 protected 스코프로 설정해두면 된다.
NoArgsConstructor(access=AccessLevel.PROTECTED)

Q) 트랜잭션 스크립트 패턴, 도메인 모델 패턴?

0개의 댓글