BOOK 3 - 자바 ORM 표준 JPA 프로그래밍(2)
JPA 시작
객체 매핑
User클래스와USER테이블을 매핑해야 한다.- JPA가 제공하는 mapping annotation을 사용하여 매핑할 수 있다.
@Entity
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column
private String picture;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Role role;
}
Mapping Annotation
@Entity- 해당 클래스를 DB 테이블과 매핑한다고 JPA에게 알려준다.
@Entity가 사용된 클래스를 엔티티 클래스라고 한다.
@Table- 엔티티 클래스에 매핑할 테이블 정보를 알려준다.
name속성을 사용하여 매핑할 DB 테이블 명을 지정할 수 있다.- 이 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 자동 매핑한다.
@Id- 엔티티 클래스의 필드를 테이블의 primary key에 매핑한다.
@Id가 사용된 필드를 식별자 필드라고 한다.
@Column- 필드를 컬럼에 매핑한다.
name속성을 사용해서 매핑할 DB 테이블 컬럼명을 지정할 수 있다.- 이 어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 자동 매핑한다. (대소문자를 구분하지 않는다.)
properties 설정
- JPA는
.properties파일들을 사용해서 필요한 설정 정보를 관리한다.
application-prod-db.properties
-
운영 환경에서의 JPA 표준 속성을 관리한다.
spring.datasource.url=데이터베이스 접속 URL spring.datasource.username=데이터베이스 접속 아이디 spring.datasource.password=데이터베이스 접속 비밀번호 spring.datasource.driver-class-name=JDBC 드라이버
application-production.properties
-
운영 환경에서의 hibernate 속성을 관리한다.
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.properties.hibernate.dialect.storage_engine=innodbhibernate.dialect: 데이터베이스 dialect 설정hibernate로 시작하는 속성은 hibernate 전용 속성이므로 하이버네이트에서만 사용할 수 있다.
-
Hibernate 전용 속성
hibernate.show_sql: 하이버네이트가 실행한 SQL을 출력한다.hibernate.format_sql: 하이버네이트가 실행한 SQL을 출력할 때 보기 쉽게 정렬한다.hibernate.use_sql_comments: 쿼리를 출력할 때 주석도 함께 출력한다.hibernate.id.new_generator_mappings: JPA 표준에 맞춘 새로운 키 생성 전략을 사용한다.
Database Dialect
- JPA는 특정 데이터베이스에 종속적이지 않은 기술이므로 손쉽게 다른 데이터베이스로 교체할 수 있다.
- 아래와 같이 각 데이터베이스가 제공하는 SQL문법과 함수는 조금씩 다르다.
- 데이터 타입
- 예를 들어 가변 문자 타입으로 MySQL은
VARCHAR, Oracle은VARCHAR2를 사용한다.
- 예를 들어 가변 문자 타입으로 MySQL은
- 다른 함수명
- 예를 들어 문자열을 자르는 함수로 SQL 표준은
SUBSTRING()을 사용하지만, Oracle은SUBSTR()을 사용한다.
- 예를 들어 문자열을 자르는 함수로 SQL 표준은
- 페이징 처리
- 예를 들어 MySQL은
LIMIT, Oracle은ROWNUM을 사용한다.
- 예를 들어 MySQL은
- 데이터 타입
-
이처럼 SQL 표준과 다르거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 Dialect(방언) 라 한다.
-
특정 데이터베이스에 종속되는 기능을 많이 사용하면 데이터베이스 교체가 어려워지므로 대부분의 JPA 구현체들은 다양한 데이터베이스 방언 클래스를 제공한다.

- 개발자는 JPA가 제공하는 표준 문법에 맞추어 JPA를 사용하면 되고, 특정 데이터베이스에 의존적인 SQL은 Database Dialect가 처리해준다.
JPQL
- 어플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 결국 검색 조건이 포함된 SQL을 사용해야 한다.
- JPA는 JPQL(Java Persistence Query Language) 이라는 쿼리 언어로 이런 문제를 해결한다.
- JPQL은 SQL과 문법이 거의 유사해서
SELECT,FROM,WHERE,GROUP BY,HAVING,JOIN등을 사용할 수 있다.
- JPQL은 SQL과 문법이 거의 유사해서
-
JPQL은 entity 객체를 대상으로 쿼리하고, SQL은 데이터베이스 테이블을 대상으로 쿼리한다는 차이점이 있다.
- JPA는 JPQL을 분석해서 적절한 SQL문을 생성하여 데이터베이스에서 데이터를 조회한다.