콘텐츠로 이동

2021 08 03

2021-08-03

Transaction 전파

  • 참고: https://deveric.tistory.com/86
  • Transaction 전파 설정 - 진행되고 있는 트랜잭션에서 다른 트랜잭션이 호출될 때 어떻게 처리할 지 정하는 것
  • 전파 설정 옵션 - @Transactional(propagation=여기) - REQUIRED(기본설정): 부모 트랜잭션이 있다면 부모 트랜잭션으로 합류. 부모/자식 다같이 롤백-커밋 - REQUIRES_NEW: 무조건 새로운 트랜잭션 생성. 부모/자식 각자 롤백-커밋 - MANDATORY: 부모 트랜잭션에 합류. 없으면 예외 - NESTED: 자식은 중첩 트랜잭션. 중첩된 트랜잭션 내부 롤백하면 해당 중첩 트랜잭션 시작 시점까지로만 롤백 - NEVER: 트랜잭션 생성 X. 부모 트랜잭션 없으면 예외 - SUPPORTS: 부모 트랜잭션이 있다면 합류

BaseEntity

  • Auddit(감사) - 거의 모든 엔티티에 들어가는 필드들 - 다음과 같이 Spring Audit 기능을 쓸라면 main 클래스에 @EnableJpaAuditing을 추가하자
    @EnableJpaAuditing
    @SpringBootApplication
    public class NoltoApplication {
        public static void main(String[] args) {
            SpringApplication.run(NoltoApplication.class, args);
        }
    }
    
  • 직접 생성해서 사용할 일 없으니 추상 클래스로 만들자
    @MappedSuperclass //BaseEntity 상속한 엔티티들은 BaseEntity에 있는 멤버변수를 컬럼으로 인식
    @Getter
    @EntityListeners(AuditingEntityListener.class) //Auditing 기능을 사용한다. (자동으로 값을 매핑 시키겠다)
    public abstract class BaseEntity {
    
        @CreatedDate
        @Column(nullable = false)
        private LocalDateTime createdDate;
    
        @LastModifiedDate
        private LocalDateTime modifiedDate;
    
    }
    

자기참조 테이블

  • 최상위 계층~최하위 계층까지 한 테이블에 데이터 저장 - FK로 연결하지 않고, 하나의 테이블에서 본부/실/팀 데이터를 모두 관리 - 상위 계층의 id는 자기 참조 관계를 통해 나타냄
    id | name          | parent_id
    1  | 최상위 부서    | null
    2  | 하위 부서 1    | 1
    3  | 하위 부서 2    | 1
    4  | 최하위 부서 1  | 2
    

JPA N+1 문제

  • 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: 매핑할 외래키 이름 (기본적으로 "필드명_참조테이블기본키컬럼명")