들어가기에 앞서
실제 프로젝트 진행했던 코드 내용은 업로드하지 않았습니다
Repository
: 기본 인터페이스. 어떤 메소드도 제공하지 않음CrudRepository
: Repository
+ CRUD
기능 제공PagingAndSortingRepository
: CurdRepository
+ 페이징, 정렬 기능JpaRepository
: PagingAndSortingRepository
+ Spring Data JPA repository 전체 기능List<Event> findByEventStatusAndEventNameorCapacity(String eventStatus, String eventName, Integer capacity);
Optional<Event> findFirstBtEventEndDateTimeBetween(LocalDateTime form, LocalDateTime to);
@Param
: 쿼리 메소드 입력 파라미터에 사용, 애노테이션 기반 파라미터 바인딩 시 사용@Query
: 직접 JPQL을 작성하고 싶을 때 사용@NoRepositoryBean
: 빈으로 등록하고 싶지 않은 인터페이스를 지정@NoRepositoryBean
public interface EventReadOnlyRepository extends Repository <Event, Long> {
Optional<Event> findById(Long id);
@Entity
클래스 안에서 사용되는 주요 JPA 애노테이션@Table
, @Index
, @UniqueConsraint
: 테이블 기본 정보와 인덱스, UK를 설정@Id
, @GeneratedValue
: PK 설정@Column
: 각 컬럼 설정@Enumerated
: enum을 처리하는 방법을 설정@Transient
: 특정 필드를 DB 영속 대상에서 제외@OneToOne
, @OneToMany
, @ManyToOne
, @ManyToMany
: 연관 관계 설정@MappedSuperClass
: 상속을 이용한 공통 필드 정의@Embedded
, @Embeddedable
: 클래스 멤버를 이용한 공통 필드 정의@DateTimeFormat
: 스프링에서 제공하며 날짜 입력의 포맷을 지정@PrePersist
@PostPersist
@PreRemove
@PostRemove
@PreUpdate
@PostUpdate
@PostLoad
@EnableJpaAuditing
, @EntityListeners(AuditingEntityListener.class)
@CreatedBy
@CreatedDate
@LastModifiedBy
@LastModifiedDate
EmbeddedDatabaseBuilder
: HSQL, Derby, H2 등 임베디드 DB 세팅 시DataSourceBuilder
: JDBC DataSource 빌더DriverManagerDataSource
: JDBC 드라이버로 세팅하는 DataSourceSimpleDriverDataSource
: 위를 간편하게 만든 것HikariDataSource
: HikariCP를 connection pool로 사용하는 DataSourcePlatformTransactionManager
, ReactiveTransactionManager
JpaTransactionManager
: Spring Data JPA 일반적인 상황에 사용하는 구현체EntityManagerFactory
를 사용DataSourceTransactionManager
: 단일 JDBC DataSource를 사용하는 구현체HibernateTransactionManager
: 하이버네이트 SessionFactory를 사용하는 구현체ChainedTransactionManager
: 여러 개의 트랜잭션 매니저를 묶어서 사용하는 구현체TransactionManager
를 여러 개를 동시에 활용할 수 없으므로 묶어서 사용 필요)DataSource
, ransactionManager
를 수동 세팅해야 하는 경우가 있음DataSource
DataSource
EntityManagerFactory
-> LocalContainerEntityManagerFactoryBean
PlatformTransactionManager
DataSource
(DB 설정) -> EntityManagerFactory
(JPA 엔티티 관리)PlatformTransactionManager
(트랜잭션 관리)JpaConfig
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.acme.domain");
factory.setDataSource(dataSource());
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
EntityManager
불러오고 -> 구역 지정하고 -> 커밋 / 롤백 직접 할 필요 없음JpaRepository
는 메소드 단위 @Transactional
이 이미 붙어 있음@DataJpaTest
와 좋은 조합@Commit
@Rollback
javax.transaction.@Transactional
: 스프링 패키지가 아니므로 주의transactionManager(value)
: 사용할 트랜잭션 매니저를 이름으로 특정label
: 트랜잭션을 구분 짓고 식별하는 레이블propagation
: 트랜잭션이 중첩될 경우 동작(트랜잭션 효과의 전파) 규칙 (default : REQUIRED)isolation
: 트랜잭션 내부 데이터의 격리 레벨 (default : DEFAULT)timeout
, timeoutString
: 시간 제한 걸기readOnly
: "이 트랜잭션 안에는 select 만 일어난다" 를 표현, 강제성 없으므로 주의rollbackFor
, rollbackForClassName
noRollbackFor
, noRollbackForClassName