[Spring] Spring Boot의 JPA

thingzoo·2023년 6월 26일
0

Spring

목록 보기
27/54
post-thumbnail

SpringBoot 환경에서의 JPA

프로젝트 JPA 설정

build.gradle: JPA dependency 추가

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

application.properties : Hibernate 설정

spring.jpa.hibernate.ddl-auto=update

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
  • ddl-auto
    • create : 기존 테이블 삭제 후 다시 생성(DROP + CREATE)
    • create-drop : create와 같으나 종료시점에 테이블을 DROP
    • update : 변경된 부분만 반영
    • validate : Entity와 테이블이 정상 매핑되었는지만 확인
    • none : 아무것도 안함
  • show_sql, format_sql, use_sql_comments 옵션
    • Hibernate가 DB에 요청하는 모든 SQL을 보기좋게 출력

EntityManager

  • SpringBoot 환경에서는 EntityManagerFactory와 EntityManager를 자동으로 생성해줌
    • application.properties에 DB 정보를 전달해 주면 이를 토대로 EntityManagerFactory가 생성됨
  • @PersistenceConext: 자동으로 생성된 EntityManager를 주입받아 사용 가능
    @PersistenceContext
    EntityManager em;

Spring의 Transaction

Spring 프레임워크에서는 DB의 트랜잭션 개념을 애플리케이션에 적용할 수 있도록 트랜잭션 관리자를 제공한다.

@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
		...
		@Transactional
		@Override
		public <S extends T> S save(S entity) {
			Assert.notNull(entity, "Entity must not be null");
		
			if (entityInformation.isNew(entity)) {
				em.persist(entity);
				return entity;
			} else {
				return em.merge(entity);
			}
		}
		...
}
  • @Transactional: 클래스나 메서드에 추가하면 쉽게 트랜잭션 개념을 적용 가능
    • 메서드가 호출되면, 해당 메서드 내에서 수행되는 모든 DB 연산 내용은 하나의 트랜잭션으로 묶임
    • 이때, 해당 메서드가 정상적으로 수행되면 트랜잭션을 커밋하고, 예외가 발생하면 롤백
    • 클래스에 선언한 @Transactional은 해당 클래스 내부의 모든 메서드에 트랜잭션 기능 부여
    • 이때, save 메서드는 @Transactional 애너테이션이 추가되어있기 때문에 readOnly = true 옵션인 @Transactional을 덮어쓰게 되어 readOnly = false 옵션으로 적용됨

@Transactional

  • JPA를 사용하여 DB에 데이터를 저장, 수정, 삭제하려면 @Transactional 적용이 반드시 필요🔥
    • 조회 작업은 단순하게 데이터를 읽기만 하기 때문에 트랜잭션 적용이 필수는 아님
      • 다만 조회의 경우에도 트랜잭션 환경이 필요한 경우가 있을 수 있기 때문에
      • 조회 작업 기능만 존재하는 메서드일 경우에만 앞서 본 예시처럼 readOnly = true 옵션이 설정된 @Transactional을 적용하면 좋음

영속성 컨텍스트와 트랜잭션의 생명주기

  • 스프링 컨테이너 환경에서는 영속성 컨텍스트와 트랜잭션의 생명주기가 일치한다.
    • 즉, 트랜잭션이 유지되는 동안은 영속성 컨텍스트도 계속 유지가 되기 때문에 영속성 컨텍스트의 기능을 사용할 수 있다.

트랜잭션 전파 설정

진행중인 트랜잭션에서 다른 트랜잭션이 호출될 때 어떻게 처리할지 정하는 것

  • @Transactional에서 트랜잭션 전파 옵션을 지정 가능
    • 트랜잭션 전파의 기본 옵션은 REQUIRED
      • REQUIRED: 부모 메서드에 트랜잭션이 존재하면 자식 메서드의 트랜잭션은 부모의 트랜잭션에 합류하게 됨
      • 자식 트랜잭션이 끝나고 부모 메소드에 트랜잭션이 합류되면서 커밋됨
profile
공부한 내용은 바로바로 기록하자!

0개의 댓글