모르지 않다는 것은 아는것과 다르다.

Spring Jpa

JPA 관련 애노테이션 정리

채마스 2022. 3. 24. 21:26

@Repository 관련

  • persistence layer 를 구현하는 클래스에 사용한다.
  • @Component 와 마찬가지로 해당 클래스를 빈으로 등록한다.
  • persistence layer 에서 발생하는 예외를 잡아서 DataAccessException 으로 처리해준다. - PersistenceExceptionTranslationPostProcessor 가 처리한다.
  • @Repository 와 관련된 Spring Data JPA 인터페이스
    • Repository: 기본 repository 인터페이스다. -> 어떤 메소드도 제공하지 않는다.
    • CrudRepository: Repository + CRUD 기능 제공한다.
    • PagingAndSortingRepository: CrudRepository + 페이징, 정렬 기능 제공한다.
    • JpaRepository: PagingAndSortingRepository + Spring Data JPA repository 전체 기능을 제공한다. -> 실무에서 대부분 해당 인터페이스가 사용된다.
  • @Param
    • 쿼리 메소드 입력 파라미터에 사용하여 애노테이션 기반 파라미터 바인딩할 때 사용한다.
    • ex) List findByEventNameAndEventStatus(@Param("eventName") String eventName, EventStatus eventStatus);
      • 원래는 순서를 기준으로 컬럼을 판단하지만, @Param 을 사용해서 애노테이션을 기준으로 컬럼을 매핑할 수 있다.
  • @NoRepositoryBean: 빈으로 등록하고 싶지 않은 인터페이스를 지정할 수 있다.
    • 특정 쿼리 메소드를 기본 메소드로 지정하는 방식으로 운영가능하다.
    • 특정 메소드를 선택적으로 사용하거나 api에 노출하고자 할 때, 사용한다.

 

@Entity 관련

  • 데이터베이스에 저장(persist)할 자바 객체를 정의한다.
  • 다양한 애노테이션을 이용해 보다 자세한 테이블 스키마 정보를 표현한다.
  • 애노테이션으로 표현한 스키마 정보와 실제 테이블 스키마가 완벽히 일치해야 할 필요는 없다.
  • 하나의 도메인(domain) 으로 간주한다.
  • @Table : 테이블 기본 정보를 설정한다.
  • @Index : 인덱스 설정한다.
  • @UniqueConstraint: unique 키를 설정한다.
  • @Id, @GeneratedValue: primary key 설정한다.
  • @Column: 각 컬럼 설정한다.
    • 컬럼명 뿐 아니라, nullable, insertable, updatable, columnDefinition 등을 설정 할 수 있다.
    • ex) @Column(nullable = false, insertable = false, updatable = false, columnDefinition = "datetime default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP")
    • 여기서 insertable, updatable 는 jpa 에 의해서 sql 문이 만들어질때 포함되지 않는 다는 뜻이지, insert나 update 가 안된다는 의미는 아니다.
    • columnDefinition 은 DB에 종속적임으로 사용에 주의해야한다.
  • @Enumerated: enum 을 처리하는 방법을 설정한다.
  • @Transient: 특정 필드를 DB 영속 대상에서 제외할때 사용한다.
    • DB엔 없는 컬럼을 코드 레벨에서 사용하고 싶을 때 사용한다.
  • @OneToOne, @OneToMany, @ManyToOne, @ManyToMany: 연관 관계 설정
  • @MappedSuperClass: 상속을 이용한 공통 필드 정의
  • @Embedded, @Embeddable: 클래스 멤버를 이용한 공통 필드 정의한다.
    • 상속을 사용하지 않고 필드를 추출할 수 있다.
  • @DateTimeFormat: 스프링에서 제공하는 애노테이션, 날짜 입력의 포맷을 지정

 

JPA 엔티티의 lifecycle event 를 활용한 Auditing

  • JPA 엔티티에 생성일시, 수정일시 같이 일정하게 작성하는 메타데이터를 처리 가능이다.
    • @PrePersist
    • @PostPersist
    • @PreRemove
    • @PostRemove
    • @PreUpdate
    • @PostUpdate
    • @PostLoad
  • 위와 같은 기능을 Spring JPA 에서 제공하는 애노테이션을 대체할 수 있다.
    • @CreatedBy
    • @CreatedDate
    • @LastModifiedBy
    • @ LastModifiedDate
    • 대신 사용하기 위해서는 Config class 에 @EnableJpaAuditing 붙이고, 사용하고 싶은 Entity 클래스에 @EntityListeners(AuditingEntityListener.class) 를 붙여 줘야 한다.

 

@Transactional

  • 스프링이 애노테이션 기반 트랜잭션 관리 기능을 제공하는 애노테이션이다.
  • EntityManager 불러오고 -> 구역 지정하고 -> commit(), rollback() 직접 할 필요 없다.
  • JpaRepository 는 메소드 단위 @Transactional 이 이미 붙어있다.
  • 옵션
    • transactionManager(value): 사용할 트랜잭션 매니저를 이름으로 지정할 수 있다.
    • label: 트랜잭션 구분 짓고 식별하는 레이블
    • propagation: 트랜잭션이 중첩될 경우 동작(트랜잭션 효과의 전파) 규칙을 지정한다. (default: REQUIRED)
      • REQUIRED(default): 현재 있으면 보조, 없으면 새로 만든다.
      • SUPPORTS: 현재 있으면 보조, 없으면 트랜잭션 없이 실행한다.
      • MANDATORY: 있으면 보조, 없으면 예외 처리한다.
      • REQUIRES_NEW: 트랜잭션 생성하고 실행, 현재 있던 것은 미룬다.
      • NOT_SUPPORTED: 트랜잭션 없이 실행, 현재 있던 것은 미룬다.
      • NEVER: 트랜잭션 없이 실행, 현재 트랜잭션이 있었으면 예외 처리한다.
      • NESTED: 현재 있으면 그 안에서 중첩된 트랜잭션 형성한다.
    • isolation: 트랜잭션 내부 데이터의 격리 레벨을 설정한다. (default: DEFAULT)
      • DEFAULT: 데이버테이스에게 맡김
      • READ_UNCOMMITTED: dirty read + non-repeatable read + phantom read
      • READ_COMMITTED: non-repeatable read + phantom read
      • REPEATABLE_READ: phantom read
      • SERIALIZABLE: 완전 직렬 수행
    • timeout, timeoutString: 시간 제한을 거는 것이 가능하다.
    • readOnly: "이 트랜잭션 안에서는 select 만 일어난다" 를 표현한다.
    • rollback 관련 : rollbackFor, rollbackForClassName, noRollbackFor, noRollbackForClassName




REFERENCES