노트 정리/자바 ORM 표준 JPA 프로그래밍 10

[JPA이론] 11. 객체지향 쿼리 언어2 - 중급 문법

경로 표현식 경로 표현식은 JPQL문 내부에서 객체에 점을 찍어 객체 내부의 필드를 그래프 탐색할 수 있는 방식을 말한다. 경로 표현식에서 사용할 수 있는 필드는 다음 두 가지, 상태 필드와 연관 필드로 분류할 수 있다. 상태 필드(state field): 단순히 값을 저장하기 위한 필드이다. ex) m.username - 멤버 객체의 이름 연관 필드(association field): 연관관계를 위한 필드를 말한다. 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 위와 같은 분류에 따라 JPA에서 경로 표현식을 사용할 수 있다. 단순히 값을 저장하..

[JPA이론] 10. 객체지향 쿼리 언어1 - 기본 문법

소개 JPA는 다양한 쿼리 방법을 지원하는데 그 예시로는 JPQL, JPA Criteria, QueryDSL, 네이티브 SQL 등의 방식이 있다. 앞의 3개는 자바코드로 JPQL을 짜주는 클래스의 집합이라고 이해하면 된다. 이외에도 JPA와 함께 JDBC API 직접사용, MyBatis, SpringJdbcTemplate 함께 사용 하는 방법 등이 있는데 Hibernate의 창시자 개빈 킹의 말, `모든 문제를 해결하기 위해 제작된 것이 아니다.` 처럼 필요시 ORM이 가능한 다양한 방법을 사용하면 된다. 오늘은 이 중 JPQL을 사용하는 방법을 정리해보려고 한다. JPQL JPQL의 가장 단순한 조회 방법은 EntityManager의 find() 메서드를 통한 방법이다. 이를 통해 받아온 객체를 그래프..

[JPA이론] 9.값 타입

기본값 타입 JPA는 데이터 타입을 크게 2가지, 엔티티 타입과 값 타입으로 분류한다. 엔티티 타입은 `@Entity`로 정의하는 객체를 말하며 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 예를 들어 회원 엔티티의 내부 속성이 모두 변하더라도 식별자는 그대로기 때문에 변경을 추적할 수 있고 회원 엔티티 임을 알 수 있다. 그에 반해 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말하며 식별자가 존재하지 않아 엔티티와 달리 추적이 불가능하다. 아래 [1]은 [2]로 아예 대체 되는 것이다. int aHundred = 100---[1] aHundred = 200---[2] 값 타입 값 타입은 다시 3가지, 기본값 타입, 임베디드 타입, 컬렉션 ..

[JPA이론] 8. 프록시와 연관관계 관리

프록시 프록시는 가짜 엔티티 객체를 말한다. JPA를 사용하다 보면 자주 만날 수 있는 용어인데 왜 프록시 객체가 필요한 것일까? 먼저, 프록시가 무엇인지 알아보기 위해 프록시 객체를 만들어 보자. em.find() vs em.getReference() find()는 JPA에서 실제 DB에 접근하여 ORM에 맞게 실제 엔티티 객체를 가져오는 메소드이다. 이와 달리 getReference() 메서드는 가짜 DB에 직접 접근하지 않고 엔티티 객체인 프록시 객체를 조회 해준다. try { //sample 저장 Member member = new Member(); member.setUsername("1st member"); em.persist(member); em.flush(); em.clear();---[1..

[JPA이론] 7. 고급매핑

상속관계 매핑 관계형 데이터베이스는 상속 관계를 매핑할 수 없다. 그나마 관계형 데이터베이스에는 슈퍼타입 - 서브타입 관계가 존재하여 객체의 상속과 비슷하므로 이를 사용해 객체의 상속을 매핑할 수 있다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 변환하는 방법 테이블 join 전략 사용 - 정규화된 방식 물품 - 책, 영화, 음반 간의 부모 - 자식 관계가 있다면 각각의 테이블을 만들어 부모_ID를 FK로 만들어 조인하여 사용하는 방법. 단일 테이블 전략 사용 - 보통 성능을 위한 방식 통합 테이블을 구성하여 하위 테이블의 모든 컬럼을 넣는 방법 서브타입 테이블 전략 사용 - 부모 테이블 없이 자식 테이블로만 정리 구현 클래스마다 테이블 사용하는 방법 기본적으로 아무런 어노테이션이 없을 때는 단일 ..

[JPA이론] 6. 다양한 연관관계 매핑

다양한 연관관계에 대한 정리. 다중성 @OneToOne @OneToMany @ManyToOne @ManyToMany - 실무에서는 쓰지 않는게 좋다. 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 -> 단방향이 2개 있는 개념 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는 반면 객체의 경우에는 서로가 연관관계를 맺어야함. 객체는 양방향 관계에서 단방향이 2개인 형상이고 이 둘 중 하나의 객체에서 주인(외래 키를 관리할 곳)을 정해야한다. 오로지 연관관계의 주인 만이 데이터에 대한 영향을 줄 수 있으며 주인의 반대편은 단순 조회만 가능하다. 다대일 -..

[JPA이론] 5. 연관관계 매핑 기초

객체가 지향하는 패러다임과 관계형 DB가 지향하는 패러다임의 차이에서 오는 문제들을 해결하고 둘 사이를 매핑하기 위한 방법을 정리한 내용이다. 객체와 테이블 연관관계의 차이를 이해하고, 객체의 참조와 테이블의 외래 키를 매핑하는 방법에 대해서 알아보자. 용어 이해 - 방향(Direction): 단방향, 양방향 - 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) - 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인이 필요 두 패러다임의 차이 - 팀원(N):팀(1) 관계 팀원과 팀과의 관계에서 객체와 관계형 DB의 차이점을 알아보자. 팀원-팀은 N:1의 다대일 관계이다. 여러 팀원은 한 팀에 속할 수 있다. 다음 객체들은 테이블의 구조에 ..

4. 엔티티 매핑

엔티티 매핑 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리하며 엔티티라 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션이 필수이다. 주의 기본 생성자는 필수(파라미터가 없응 public 또는 protected 생성자) 리플렉션같은 다양한 기술을 사용하기 때문에 기술 스펙으로서 기본 생성자가 필요함 final 클래스, enum, interface inner 클래스 사용 x 저장할 필드에 final 사용 X @Entity 속성정리 @Entity(name): JPA에서 사용할 엔티티 이름을 정할 때 사용함. 기본값: 클래스 이름을 사용하며 가급적 기본값을 사용해야 헷갈리지 않는다. @Table: name: 매핑할 테이블 이름(기본값: 엔티티 이름 사용..

3. 영속성 관리 - 내부 동작 방식

영속성 관리 - 내부 동작 방식 영속성 컨텍스트 영속성 컨텍스트 : "엔티티를 영구 저장하는 환경"이라는 뜻. EntityManager.Persist(entity); EntityManager를 통해서 DB에 저장하는 것이 아닌 영속성 컨텍스트에 객체를 영속화 시키는 개념이다. 영속성 컨텍스트는 논리적 개념으로 눈에 보이지 않는다. EntityManager를 사용하게 되면 객체 내부에 1:1로 영속성 컨텍스트가 존재하게 된다. 엔티티의 생명주기 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속(managed): 영속성 컨텍스트에 관리되는 상태 em.persist(member)하여 영속성 컨텍스트에 객체가 영속 상태로 변환. 준영속(detached): 영속성 컨텍스트에..

2. JPA 시작하기

JPA 시작하기 데이터베이스 방언 JPA는 특정 데이터베이스에 종속 X MySQL, Oracle 등 각 데이터베이스의 문법에 따르도록 설정하여 사용할 수 있음. JPA가 방언(DB문법이 JPA입장에서)을 해석하여 사용해줌. javax와 hibernate의 차이점 javax는 java 진영 표준으로 jpa에 정의된 패키지이기 때문에 hibernate가 아닌 다른 구현체를 사용하더라도 그대로 사용이 가능하다. 하지만, hibernate.dialect 처럼 hibernate로 시작되는 패키지들은 hibernate에 종속적이므로 hibernate에서만 사용 가능하다. 애플리케이션 개발 JPA 구동 방식 Persistence 클래스에서 META-INF/persistence.XML 설정 정보 파일을 읽음. Enti..