JPA

민지킴·2021년 4월 19일
0

JPA를 왜 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발객체 매핑하기

객체 매핑하기

@Entity

JPA가 관리할 객체, 엔티티라고 한다.

@Id

DB PK와 매핑할 필드


매핑 어노테이션

@Column

  • @Column(name = "USERNAME")

  • name

    • 필드와 매핑할 테이블의 컬럼 이름
  • insertable, updatable

    • TRUE/FALSE 설정. 읽기 전용
  • nullable

    • null 허용여부 결정, DDL 생성시 사용(not null 추가)
  • unique

    • 유니크 제약 조건, DDL 생성시 사용
  • columnDefinition, length, precision, scale(DDL)

@Temporal

  • @Temporal(TemporalType.TIMESTAMP)

  • 시간과 관련된 매핑

  • Date 뿐만아니라 자바8에서 지원하는 LocalDatetime도 지원한다.

@Enumerates

  • @Enumerated(EnumType.STRING)

  • 자바의 Enum 타입 매핑을 지원한다.

  • 현업에서는 EnumType을 무조건 STRING으로 지정 해야한다.

  • 기본 값인 ORDINAL로 설정하면 Enum 순서로 숫자가 매핑되는데, Enum 중간에 필드가 하나 추가 되면 다 꼬이게 된다.

@Lob

  • 컨텐츠의 길이가 너무 길 경우 바이너리 파일로 DB에 바로 밀어 넣어야 하는데, 보통 이런 경우에 사용한다.

  • 공통적으로 @Lob으로 사용하면 된다.

  • CLOB, BLOB 매핑

  • CLOB : String, char[], java.sql.CLOB

  • BLOB : byte[], java.sql.BLOB

@Transient

  • 이 필드는 매핑하지 않는다.

  • 애플리케이션에서 DB에 저장하지 않는 필드

  • 웬만하면 쓰지 않는 것이...


식별자 매핑 어노테이션

식별자 매핑 방법

  • @Id(직접 매핑)

  • @GeneratedValue(strategy = GenerationType.[타입])

    • 타입 설정

    • IDENTITY

      • 데이터베이스에 위임, MYSQL
    • SEQUENCE

      • 데이터베이스 시퀀스 오브젝트 사용, ORACLE

      • @SequenceGenerator 필요

    • TABLE

      • 키 생성용 테이블 사용, 모든 DB에서 사용

      • @TableGenerator 필요

    • AUTO

      • 방언에 따라 자동 지정, 기본값

@Query

@Query, JPQL 정의
@Query 어노테이션을 사용해서 직접 JPQL을 지정할 수 있다.

마찬가지로 Named 쿼리도 애플리케이션 로딩 시점에 파싱을 하므로, 이로 인해 런타임 에러를 내지 않을 수 있다.


SQL, JPQL의 문제점

SQL, JPQL은 문자열이다. Type-check가 불가능하다.

잘 해봐야 애플리케이션 로딩 시점에 알 수 있다. 컴파일 시점에 알 수 있는 방법이 없다. 자바와 문자열의 한계이다.

해당 로직 실행 전까지 작동여부 확인을 할 수 없다.

해당 쿼리 실행 시점에 오류를 발견한다.


QueryDSL

QueryDSL 장점

  • 문자가 아닌 코드로 작성하자

  • 컴파일 시점에 문법 오류를 발견하자.

  • 코드 자동완성(IDE 도움)

  • 단순하고 쉽다. 코드 모양이 JPQL과 거의 비슷하다

  • 동적 쿼리

profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글