JPA를 왜 사용해야 하는가?
@Entity
JPA가 관리할 객체, 엔티티라고 한다.
@Id
DB PK와 매핑할 필드
@Column
@Column(name = "USERNAME")
name
insertable, updatable
nullable
unique
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
SEQUENCE
데이터베이스 시퀀스 오브젝트 사용, ORACLE
@SequenceGenerator 필요
TABLE
키 생성용 테이블 사용, 모든 DB에서 사용
@TableGenerator 필요
AUTO
@Query, JPQL 정의
@Query 어노테이션을 사용해서 직접 JPQL을 지정할 수 있다.
마찬가지로 Named 쿼리도 애플리케이션 로딩 시점에 파싱을 하므로, 이로 인해 런타임 에러를 내지 않을 수 있다.
SQL, JPQL은 문자열이다. Type-check가 불가능하다.
잘 해봐야 애플리케이션 로딩 시점에 알 수 있다. 컴파일 시점에 알 수 있는 방법이 없다. 자바와 문자열의 한계이다.
해당 로직 실행 전까지 작동여부 확인을 할 수 없다.
해당 쿼리 실행 시점에 오류를 발견한다.
QueryDSL 장점
문자가 아닌 코드로 작성하자
컴파일 시점에 문법 오류를 발견하자.
코드 자동완성(IDE 도움)
단순하고 쉽다. 코드 모양이 JPQL과 거의 비슷하다
동적 쿼리