2021 08 03
2021-08-03¶
Transaction 전파¶
- 참고: https://deveric.tistory.com/86
- Transaction 전파 설정 - 진행되고 있는 트랜잭션에서 다른 트랜잭션이 호출될 때 어떻게 처리할 지 정하는 것
- 전파 설정 옵션
-
@Transactional(propagation=여기)- REQUIRED(기본설정): 부모 트랜잭션이 있다면 부모 트랜잭션으로 합류. 부모/자식 다같이 롤백-커밋 - REQUIRES_NEW: 무조건 새로운 트랜잭션 생성. 부모/자식 각자 롤백-커밋 - MANDATORY: 부모 트랜잭션에 합류. 없으면 예외 - NESTED: 자식은 중첩 트랜잭션. 중첩된 트랜잭션 내부 롤백하면 해당 중첩 트랜잭션 시작 시점까지로만 롤백 - NEVER: 트랜잭션 생성 X. 부모 트랜잭션 없으면 예외 - SUPPORTS: 부모 트랜잭션이 있다면 합류
BaseEntity¶
- 참고1: https://eocoding.tistory.com/60
- 참고2: https://ict-nroo.tistory.com/129
- 참고3: https://velog.io/@aidenshin/%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%9E%91%EC%84%B1-JPA-Auddit-%EC%A0%81%EC%9A%A9
@MappedSuperclass: 객체의 입장에서 공통 매핑 정보가 필요한 경우 - 반복되는 id, name - 부모 클래스에만 선언하고 속성만 상속받아 사용하자 - DB는 다 컬럼 따로따로 알아서 잘 되어있어. 객체로써 안 써둘 뿐이야
- Auddit(감사)
- 거의 모든 엔티티에 들어가는 필드들
- 다음과 같이 Spring Audit 기능을 쓸라면 main 클래스에
@EnableJpaAuditing을 추가하자
- 직접 생성해서 사용할 일 없으니 추상 클래스로 만들자
@MappedSuperclass //BaseEntity 상속한 엔티티들은 BaseEntity에 있는 멤버변수를 컬럼으로 인식 @Getter @EntityListeners(AuditingEntityListener.class) //Auditing 기능을 사용한다. (자동으로 값을 매핑 시키겠다) public abstract class BaseEntity { @CreatedDate @Column(nullable = false) private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime modifiedDate; }
자기참조 테이블¶
- 참고1: https://needjarvis.tistory.com/498
- 참고2: https://velog.io/@wltjs10645/%EC%9E%90%EA%B8%B0%EC%B0%B8%EC%A1%B0%ED%85%8C%EC%9D%B4%EB%B8%94
- 자기참조관계 - 하나의 엔티티가 다른 엔티티가 아니니 자기 자신과 관계를 맺는 타입 - 동일 엔티티 타입 내에서 자기가 자기의 인스턴스를 참조하는 구조 - 조직을 표현할 때 유용 - 계층 구조를 나타내기 - 조직도와 게시판 Q&A등
- 최상위 계층~최하위 계층까지 한 테이블에 데이터 저장 - FK로 연결하지 않고, 하나의 테이블에서 본부/실/팀 데이터를 모두 관리 - 상위 계층의 id는 자기 참조 관계를 통해 나타냄
JPA N+1 문제¶
- 참고1: https://blog.advenoh.pe.kr/database/JPA-N1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95/
- 참고2: https://jojoldu.tistory.com/165
- N+1 문제 발생 경우 - fetchType.EAGER + findAll() - LAZY로 변경하여 진짜 찐으로 필요할 때 가져오자. - fetchType.LAZY + Loop으로 조회 - JPQL fetchJoin으로 한방 쿼리 - join 대상을 함께 조회하자!
- FetchJoin 주의사항
- FetchJoin에 alias 별칭 사용 X - 둘 이상 컬렉션 Fetch X - paging API 사용 X - InnerJoin을 사용하여 촤르르 조회
- @EntityGraph
- 쿼리 손상없이 Eager/Lazy 필드를 정의하여 사용가능
@EntityGraph(attributePaths = "subjects") //쿼리 수행시 바로 가져올 필드명 (Eager 조회로 가져옴) @Query("select a from Academy a") List<Academy> findALlEntityGraph();- OuterJoin을 사용하여 촤르르 조회
- 카테시안곱 - From 절에 2개 이상의 Table이 있을 때 두 Table 사이에 유효 Join 조건을 적지 않았을 경우, - 해당 테이블에 대한 모든 데이터를 전부 결합하여 Table에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환됨 - WHERE 절에 기술하는 join 조건이 잘못 기술되었거나 아예 없는 경우
- 카테시안곱 막기
-
@OneToMany필드를 Set으로 선언 (LinkedHashSet 추천) - 쿼리에서 distinct로 중복 제거
@JoinColumn¶
- 외래키를 매핑할 때 사용
- name: 매핑할 외래키 이름 (기본적으로 "필드명_참조테이블기본키컬럼명")