본문 바로가기

ORM46

JPA - 다양한 연관관계 - M : N 식별관계 - 참조: 자바 ORM 표준 JPA 프로그래밍 - M : N 연결 엔티티 이제 1 : 1, 1 : N, M : N 의 단방향과 양방향을 모두 알아보았으니 도메인 설계만 잘하면 JPA 로 모든 맵핑을 할 수 있을까? 세상 문제가 그렇게 간단하면 좋겠지만 M : N 관계에서 더 살펴볼 사항이 있다. 앞의 글 다양한 연관관계 M : N 의 ER Diagram 과 UML 을 다시 한번 생각해보자. ER Diagram 에 USER 와 PRODUCT 테이블이 있었고, 두 테이블이 서로에 대해 M : N 의 관계라면 외래키를 이용해서 표현할 방법이 없으므로 USER_PRODUCT 조인 테이블도 추가했었다. 반면 객체(UML Digram)에서는 User 와 Product 엔티티를 선언하고 서로 Collection 으로.. 2021. 7. 10.
JPA - 다양한 연관관계 - 1 : 1 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 1 : 1 연관관계 1 : 1 관계는 양쪽이 서로 하나씩만 가지는 관계로 아주 심플한 다중성을 갖는다. 회원과 사물함이 있다고 할 때, 회원은 하나의 사물함만 소유할 수 있고 사물함도 회원 한명에 의해서만 소유될 수 있다고 한다면 1 : 1 관계이다. 다중성에서 항상 N 쪽이 외래키를 가진다고 하였는데, 1 : 1 에서는 어느쪽에 외래키를 두어도 되기 때문에 양방향일 경우 연관관계의 주인을 선택해야 한다. 주 테이블 또는 대상 테이블에 외래키를 둘 수 있다. 주 테이블: 주 테이블에 대상 테이블을 참조하는 사상을 그대로 따라가기 때문에 어플리케이션 코드에 더 직관적이다. 대상 테이블: DB 개발자들이 선호하는 방법이며 1 : 1 에서 1 : N 으로 변경.. 2021. 7. 6.
JPA - 엔티티 맵핑 - 기본 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 참조: https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/naming.html - 엔티티 맵핑 JPA 를 사용하는데 있어서 가장 중요한일은 테이블과 엔티티를 정확히 맵핑하는것이다. JPA 의 맵핑 어노테이션은 아래와 같다. 객체 - 테이블 맵핑: @Entity, @Table 기본 키 맵핑: @Id 필드와 컬럼 맵핑: @Column 연관관계 맵핑: @ManyToOne, @JoinColumn - @Entity JPA 를 사용해서 맵핑한 클래스는 @Entity 어노테이션을 반드시 붙여야 한다. 그래야 JPA 가 관리해야 하는 클래스라고 인식할 수 있다. @Entity 적.. 2021. 6. 27.
JPA - 영속성 관리 - 준영속과 병합 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 준영속 여태까지는 영속상태를 중심으로 알아보았다. 이번에는 영속 -> 준영속 상태를 알아보도록 하자. 영속성관리 초반에 보았던 생명주기 그래프의 내용을 떠올려보자. 영속 상태의 엔티티를 준영속 상태로 만드는 방법은 3 가지가 있다. em.detach(entity): 특정 엔티티를 준영속 상태로 전환 em.clear(): 영속성 컨텍스트 초기화 em.close(): 영속성 컨텍스트 종료 준영속 상태는 거의 비영속과 같다고 할 수 있다. 영속성 컨텍스트가 제공하는 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩의 기능이 동작하지 않는다. 비영속은 식별자 값이 없지만 준영속 상태는 이미 한번 영속 상태였으므로 식별자값을 갖고 있다. 준영속 상태에서 지연 로딩시.. 2021. 6. 24.
JPA - 영속성 관리 - 플러시(flush) - 참조: 자바 ORM 표준 JPA 프로그래밍 - 플러시 플러시(flush())는 영속성 컨텍스트의 변경 내용을 DB에 반영하는 연산이다. 플러시를 수행하면 변경 감지 -> 영속성 컨텍스트의 엔티티와 스냅샷 비교 -> 수정된 엔티티 수정 쿼리 생성 -> 쓰기 지연 SQL 저장소 등록 쓰기 지연 SQL 저장소 -> DB 로 쿼리 전송 영속성 컨텍스트의 플러시는 3 가지 방법으로 수행할 수 있다. em.flush()로 직접 호출 트랜잭션 커밋시 자동 호출 JPQL 쿼리 실행 시 자동 호출 em.flush() 를 직접 호출하면 영속성 컨텍스트를 강제로 플러시한다. 하지만 이는 거의 사용하지 않는 기능이다. 트랜잭션 커밋시 자동 호출되어야 하는 이유는 flush() 와 COMMIT 이 다르기 때문이다. flus.. 2021. 6. 24.
JPA - 환경구축 및 객체맵핑, persistence.xml - 참조: 자바 ORM 표준 JPA 프로그래밍 - 참조: http://www.h2database.com/html/tutorial.html#creating_new_databases - 환경 구축 JPA Project를 시작하기 위해 환경을 구축해보자. 환경설정은 STS(Spring Tool Suit) 의 Spring Starter Project 를 이용한다. 아래 그림을 참조하여 Maven과 Java 8 version 을 선택한다. 그 다음 화면에서 Dependency 를 고를 수 있다. Spring Web 과 Template 엔진으로 Thymeleaf 를 기본으로 선택해준다. H2 DB와 Spring Data JPA 를 선택한다. 설치를 끝냈으면 h2 를 다운받아야 한다. H2는 In-memory 형으로.. 2021. 6. 23.