Spring 18. SpringBoot의 JPA

김창민·2024년 8월 16일

BE

목록 보기
38/50

JPA 설정

  • spring-boot-starter-data-jpa 를 이용해서 JPA를 설정한다.
  • application.properties
    • Hibernate를 설정해야한다.

      spring.jpa.hibernate.ddl-auto=update //테이블 생성 방식
      
      //Hibernate의 DB 요청을 출력하기 위한 옵션
      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: 아무것도 하지 않습니다.
  • 객체
    • 과거 단순한 객체 Class였던걸 Entity로 교체해야한다.

      @Entity // JPA가 관리할 수 있는 Entity 클래스 지정
      @Getter
      @Setter
      @Table(name = "memo") // 매핑할 테이블의 이름을 지정
      @NoArgsConstructor
      public class Memo {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          @Column(name = "username", nullable = false)
          private String username;
          @Column(name = "contents", nullable = false, length = 500)
          private String contents;
      
          public Memo(MemoRequestDto requestDto) {
              this.username = requestDto.getUsername();
              this.contents = requestDto.getContents();
          }
      
          public void update(MemoRequestDto requestDto) {
              this.username = requestDto.getUsername();
              this.contents = requestDto.getContents();
          }
      }
    • 추가된 어노테이션은 @Entity, @Table 이 있고, 필드에 추가된 어노테이션은 @Id, @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "~", nullable = false, length = 500) 과 같다.

  • EntityManagerFactory와 EntityManage는 SpringBoot 환경에선 자동생성이다.
    • application.properties에 DB 정보를 전달해 주면 이를 토대로 EntityManagerFactory가 생성된다.

    • 이후, @PersistenceContext 를 통해서 EntityManager 를 주입받아서 사용이 가능해진다.

      @PersistenceConext 애너테이션을 사용하면 자동으로 생성된 EntityManager를 주입받아 사용할 수 있습니다.

트랜잭션

  • @Transactional 애너테이션을 클래스나 메서드에 추가하면 쉽게 트랜잭션 개념을 적용할 수 있다.
    • 메서드에 추가한 경우
      • 메서드 호출시 해당 메서드의 모든 DB 연산은 하나의 트랜잭션으로 붂인다.
      • 메서드가 종료되면 커밋, 실패하면 롤백이다.
    • 클래스에 추가한 경우
      • 클래스 내부 메서드에 트랜잭션 기능을 부여한다.
      • 근데, 클래스에 @Transactional(readOnly = true)와 같이 옵션을 부여했는데, 특정 메소드에선 해당 옵션을 사용하고싶지 않다면 @Transactional 그냥 덮어 쓰면 된다.
  • Spring 컨테이너에서는 트랜잭션 생명 주기 = 영속성 컨텍스트 생명주기 다.
    • 트랜잭션이 유지되는 동안 영속성 컨텍스트도 유지가 되므로 영속성 컨텍스트의 기능을 사용할 수 있다는 것.
  • 트랜잭션 전파
    • @Transactional(propagetion = REQUIRED) 옵션이 default로 되어 있다.
      • 이 옵션으로 부모 메서드에 트랜잭션이 존재하면 자식 메서드의 트랜잭션은 부모 트랜잭션에 흡수된다.
      • 즉, 자식 메서드 종료후 부모 메서드가 종료되어야지 커밋이 된다..
profile
일일 회고 : https://rlackdals981010.github.io/

0개의 댓글