오브젝트 매핑과 슈퍼 타입 토큰

자바 프로젝트를 진행 하면서 외부 데이터를 가지고 VO클래스에 매핑하고 여러가지 연산작업을들 합니다. 그중에서도 VO클래스의 정보를 가져와 매핑하는 방법에 대해서 궁금하게 되었고 자바에서 제공하는 리플렉션API와 간단한 예제들을 통해서 오브젝트 매핑에 대해 알아 보겠습니다.

클래스 정보 가져오기

자바는 java.lang.reflect패키지의 API를 가지고 클래스의 정보와 필드 어노테이션 정보까지 모두 가져 올수 있는 리플렉션을 제공 합니다.

그래서 이렇게 구할수 있는 정보를 가지고 외부에서 가져오는 json 데이터나 sql문을 가져올시 매핑을 하여서 해당 오브젝트로 값을 삽입해 넘겨줄수 있습니다.

QueryDSL

JPA

1 QueryDSL 소개

  • JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
  • JPA 크리테리아에 비해서 편리하고 실용적임
  • 쿼리를 문자가 아닌 코드로 작성해도, 쉽고 간결하며 그 모양도 쿼리와 비슷하게 개발 할 수 있는 프로젝트가 바로 QueryDSL 이다.
  • 오픈소스

객체지향 쿼리 언어

JPA

1 JPQL 소개

JPQL(Java Persistence Query Language) : 엔티티 객체를 조회하는 객체지향 쿼리.

  • JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다.
  • JPQL은 객체지향 쿼리 언어다. 테이블X 엔티티O
  • JPQL은 결국 SQL로 변환된다.

값 타입

JPA
  • 기본값 타입basic value type
    • 자바 기본 타입(예: int, double)
    • 래퍼 클래스(예: Integer)
    • String
  • 임베디드 타입embedded type(복합 값 타입)
  • 컬렉션 값 타입collection value type

복합 값 타입

복합값 정의 : @Embeddable 어노테이션으로 정의

프록시와 연관관계 관리

JPA
  • 프록시 : 연관된 객체를 실제 사용하는 시점에 데이터베이스에서 조회 하는 기술
  • 지연로딩: 연관된 객체를 실제 사용하는 시점에 불러 오는것
  • 즉시로딩 : 연관된 객체를 조인을 통하여 함께 불러오는것
  • 영속성 전이 : 연관된 객체를 함께 저장하거나 삭제
  • 고아 객체 : 부모객체가 삭제시 홀로 남겨지는 객체

8.1 프록시

엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다.

JPA는 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연 로딩이라 한다.

지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라 한다.

고급 매핑

JPA
  • 상속 관계 매핑: 객체의 상속 관계를 데이터베이스에 어떻게 매핑하는지 다룬다.
  • @MappedSuperclass: 등록일, 수정일 같이 여러 엔티티에서 공통으로 사용하는 매핑 정보만 상속받고 싶으면 이 기능을 사용하면 된다.
  • 복합 키와 식별 관계 매핑: 데이터베이스의 식별자가 하나 이상일 때 매핑하는 방법을 다룬다. 그리고 데이터베이스 설계에서 이야기하는 식별 관계와 비식별 관계에 대해서도 다룬다.
  • 조인 테이블: 테이블은 외래 키 하나로 연관관계를 맺을 수 있지만 연관관계를 관리하는 연결 테이블을 두는 방법도 있다. 여기서는 이 연결 테이블을 매핑하는 방법을 다룬다.
  • 엔티티 하나에 여러 테이블 매핑하기: 보통 엔티티 하나에 테이블 하나를 매핑하지만 엔티티 하나에 여러 테이블을 매핑하는 방법도 있다. 여기서는 이 매핑 방법을 다룬다.

엔티티의 연관관계 매핑시 고려할거 정리

JPA

고려할건 크게 3가지다.

  • 다중성
  • 단방향, 양방향
  • 연관관계의 주인

다중성 : 두 엔티티의 연관관계를 나타냄 (예: 일대다,다대일,일대일,다대다) 다중성을 판단하기 힘들땐 반대방향을 생각하면 됨 (일대다의 반대는 다대일)

  • 다대일(@ManyToOne)
  • 일대다(@OneToMany)
  • 일대일(@OneToOne)
  • 다대다(@ManyToMany)

연관관계 기초

JPA
  • 객체의 참조와 테이블의 외래 키를 매핑하는 것이 이 장의 목표다.*

핵심 키워드

  • 방향(Direction): [단방향, 양방향]이 있다. 한 쪽만 참조하는 것을 단방향 관계라 하고, 양쪽 모두 서로 참조하는 것을 양방향 관계라 한다. 방향은 객체관계에만 존재하고 테이블 관계는 항상 양방향이다.
  • 다중성(Multiplicty): [다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)] 다중성이 있다.
  • 연관관계의 주인(Owner): 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다.

엔티티 매핑

JPA
  • 객체와 테이블 매핑 : @Entity, @Table
  • 기본 키 매핑 : @Id
  • 필드와 컬럼 매핑 : @Column
  • 연관관계 매핑 : @ManyToOne, @JoinColumn

@Entity(클래스) : 테이블과 매핑할 클래스, JPA가 관리함

@Table(클래스) : 엔티티와 매핑할 테이블 (생략시 엔티티명으로 적용)

  • uniqueConstraints(DDL) : DDL생성시 유니크 제약조건 만듬.

@Column(필드) : 칼럼을 매핑한다.

영속성 관리

JPA

개요

  • EntityManagerFactory : EntityManager를 만드는 공장. 애플리케이션에서 persistens.xml의 persistens-unit갯수 만큼만 있어야함
  • EntityManager : 요청이 올때마다 생성 해도 됨.(커넥션풀에서 커넥션 한개씩 이라고 생각해도 될듯)

persistencecontext4

  • persistence context(영속성 컨텍스트) : ‘엔티티를 영구 저장하는 환경’

특징

  • 영속 상태인 엔티티는 식별자 값이 반드시 있어야 한다. (식별자 값이없으면 예외 발생)
  • 트랜잭션 커밋 하는 순간 DB 반영힘 이를 플러시(flush)라 함