JPA에 대해서 알아보자

Kyle's Archive·2023년 9월 26일

Spring

목록 보기
1/1

JPA

개요

  • DB를 건드리면 = JDBC를 쓴다는 고정관념(?)이 있을 수도 있는데
    • JPA는 메서드로 데이터를 조작할 수 있다.
    • 그리고 객체간 관계를 바탕으로 SQL이 자동으로 생성된다.

장점

  • 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중 할 수 있으며, 객체지향 개발이 가능하다.
  • 테이블 생성, 변경, 관리가 쉽다. (JPA를 잘 이해하고 있는 경우)
  • 로직을 쿼리에 집중하기 보다는 객체자체에 집중 할 수 있다.
  • 빠른 개발이 가능하다.

단점

  • 어렵다. 장점을 더 극대화 하기 위해서 알아야 할게 많다.
  • 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다. (persistence context)
  • 성능상 문제가 있을 수 있다.(이 문제 또한 잘 이해해야 해결이 가능하다.)

JPA 사용법

DI 의존성 주입

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-stater-data-jpa')
    compile('com.h2database:h2')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

Entity 클래스 생성

@Entity
public class BoardTable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idx;

    @Column(nullable = true)
    private String title;
    // length가 없으면 기본 varchar(255)

    @Column(length = 500, nullable = true)
    private String comment;
}

@Entity

  • 테이블과 링크될 클래스임을 나타낸다.
  • 기본값으로 케멀케이스를 클래스이름을 사용하면 언더스코어 네이밍(_)으로 테이블 이름을 매칭한다.(클래스 이름이라 대문자로 시작)
    • ex) SalesManager.java -> sales_manager (table)

@Id

  • 해당 테이블의 PK 필드를 나타낸다.

@GeneratedValue

  • PK 생성 규칙
  • 스프링 부트 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment가 된다.
    • IDENTITY : 데이터베이스에 위임(MYSQL)
    • SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용(ORACLE)
      • @SequenceGenerator 필요
    • TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용
      • @TableGenerator 필요
    • AUTO : 방언에 따라 자동 지정, 기본값

@Column

  • 테이블의 컬럼을 나타내며 굳이 선언하지 않더라고 해당 클래스의 필드는 모두 컬럼이 된다.

  • 사용하는 이유는 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용한다.

    • JPA에서 아무것도 적지 않으면 String의 길이는 Default로 varchar(255)이다.

      private String title;
      
      or
      
      @Column
      private String title;
      
    • 타입의 길이는 length로 정해줄 수 있다.

      @Column(length = 100)
      private String title;
      
      @Column(length = 5)
      private Integer count;
      
      @Column
      private Long idx;
      // Long은 DB에 bigint(20)으로 저장된다.
      
    • @Column의 속성으로 columnDefiniton을 사용하면 Default값이나 Comment등을 사용할 수 있다.

      • columnDefiniton를 사용하면 length는 기본으로 적용되므로 columnDefinition 안에서 적용해주어야 한다.
        - columnDefinition = "varchar(100)" 이렇게 사용하여야 적용됨
        - columnDefinition = "varchar", length = 100 이렇게 하면 기본값인 255가 적용됨

        @Entity
        public class BoardTable {
        
            @Column(length = 100, nullable = true)
            private String title;
            // String 타입으로 length를 100으로 지정해주면 varchar(100)이 됨
            // nullable = true이면 null, false이면 not null
        
            @Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
            @Temporal(TemporalType.TIMESTAMP)
            private Date regDt;
            // 케멀케이스로 네이밍하면 regDt = reg_dt (table)로 매칭된다.
            // TIMESTAMP는 columnDefinition으로 TIMESTAMP를 작성해주고 @Temporal(TemporalType.TIMESTAMP) 추가해준다.
        
            @Column(columnDefinition = "TINYINT(4)", nullable = true)
            private Integer value;
        
            @Column(columnDefinition = "VARCHAR(1) DEFAULT 'N' COMMENT '삭제여부'", nullable = false)
            private String delFlag;
            // columnDefinition으로 default나 comment 추가 가능
        
            Column(nullable = true)
            private Integer accountIdx;
            // int(11)은 이렇게만 사용해도 가능
        }
        

@Builder

  • 해당 클래스의 빌더 패턴 클래스를 생성
  • 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함
profile
Java Backend, iOS Developer (Transforming 중🤮)

0개의 댓글