@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
- https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
- 김은호님의 Spring Data JPA
'Spring Jpa' 카테고리의 다른 글
JdbcTemplate을 활용하여 JPA의 saveAll() 대체하기 (0) | 2023.09.23 |
---|---|
JPA에서 여러 종류의 영속성 관리하기 (0) | 2023.08.28 |
JPA DB 수동설정 (0) | 2022.03.24 |
프록시와 연관관계 관리 (0) | 2022.02.27 |
JPA Id 생성전략 설정하기 (0) | 2022.02.27 |