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=innodb
    
    • hibernate.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 를 사용한다.
    • 다른 함수명
      • 예를 들어 문자열을 자르는 함수로 SQL 표준은 SUBSTRING() 을 사용하지만, Oracle은 SUBSTR() 을 사용한다.
    • 페이징 처리
      • 예를 들어 MySQL은 LIMIT , Oracle은 ROWNUM 을 사용한다.
  • 이처럼 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은 entity 객체를 대상으로 쿼리하고, SQL은 데이터베이스 테이블을 대상으로 쿼리한다는 차이점이 있다.

  • JPA는 JPQL을 분석해서 적절한 SQL문을 생성하여 데이터베이스에서 데이터를 조회한다.