[개요] JPA를 공부하는데 가장 난해한 부분인 '영속성 컨텍스트'에 대해서 알아보겠습니다. 영속성 컨텍스트에 대한 지식이 수반되어야 JPA의 동작방식을 온전히 이해할 수 있습니다. [영속성 컨텍스트 (Persistence Context)] 영속성 컨텍스트란 인스턴스로 존재하는 엔티티를 관리하고 영속화시키는 논리적 영역 입니다. 영속화의 사전적 의미는 '사라지지 않고 지속되게 한다' 입니다. 쉽게 말하자면 DB에 저장된다는 의미입니다. 하지만 '영속'이라는 말에 현혹되어서는 안됩니다. 영속성 컨텍스트에서 관리하는 엔티티라고 해도 반드시 '영속화'되어 DB에 저장된 것은 아닙니다. 다만 영속화 될 수 있는 가능성이 있을 뿐입니다. 영속성 컨텍스트에서 엔티티를 관리하고 필요에 따라 DB의 데이터를 저장, 조..
지연 로딩? 예를 들어 A라는 객체가 B라는 객체를 가지고 있다면, A를 데이터를 불러 올 때 해당되는 B의 데이터도 필요합니다. 하지만 B객체에 대한 정보가 굳이 필요 없는 상황에서도 B데이터까지 모두 데이터베이스에서 불러오는 작업을 한다면 비효율적인 작업이 됩니다. 이런 상황에서 성능을 올리기 위한 방법으로 JPA의 '지연 로딩'이 있습니다. 실제로 B객체의 데이터가 사용 될 때, B데이터를 불러오고, 그렇지 않다면 굳이 B객체 데이터를 사용하지 않습니다. 지연 로딩을 구현하기 위해서 JPA (정확히는 Hibernate)에서는 프록시 디자인 패턴을 사용합니다. 프록시 디자인 패턴 이미지 출처 ㅣ 위키 백과 클라이언트(Client)가 특정 객체(Subject)를 사용하게 될 때, 이를 구현한 (혹은 상..
JPA Domain 셀프 참조 (셀프 조인) 구현하기 예제로 사용한 Domain은 책의 목차(BookContent)로 하위 목차(subBookContents)를 여러개 참조하고 있고, 상위 목차(superBookContent)를 0개~1개 가질 수 있습니다. @Entity public class BookContent { . . . @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "super_book_content_id") private BookContent superBookContent; @OneToMany(mappedBy = "superBookContent", cascade = CascadeType.ALL) private List subBookConten..
JPA 조인(JOIN) 전략 엔티티(Entity)들 간의 관계가 맺어져 있다면, JPA는 조인(JOIN)을 이용해서 데이터베이스를 조회하게 됩니다. 조인전략중에 성능이 가장 좋은 조인 전략은 내부조인(INNER JOIN)입니다. 하지만 연관된 외래키가 null이 존재하는 경우에 내부조인을 사용할 경우 일부만 필터링을 해서 조회하는 문제가 생길 수 있습니다. 이러한 이유로 JPA는 외부조인(OUTER JOIN)을 기본설정으로 수행하게 됩니다. 내부조인 전략으로 변경하기 내부조인을 사용하고 싶다면 JPA에게 연관된 외래키에는 null이 존재하지 않음을 명시해주어야 합니다. 2가지 설정 방법중에 하나만 설정하면 됩니다. 참고로 @OneToMany와 @ManyToMany는 컬렉션으로 로딩해야 하므로 내부조인 설..
부모클래스(Entity) 설정 @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "dtype") public abstract class Parent { . . . }부모 Entity클래스 애노테이션 2가지를 추가합니다.@Inheritance(strategy = InheritanceType.JOINED) : 상속 관계를 맺고 있음을 명시해줍니다. 상속관계에 대한 설정은 JOINED전략, SINGLE_TABLE 전략, TABLE_PER_CLASS 전략 3가지가 있습니다. 각 전략마다 장단점이 있고 설정방법이 상이합니다. 여기서는 주로 쓰인다고 하는 조인전략으로 설명하도록 하겠습니다. 조인 전략을 사용하게 되면..
1. Entitiy간의 연관관계(방향)이란? 데이터베이스상에서는 관계를 맺어주기만 하면 자동으로 서로간의 양방향 참조가 가능합니다. 하지만 객체지향의 (Entity) 클래스간에는 '참조 방향'을 지정해주어야 하는데, 어떤 '방향성'을 고려해야하는지는 굉장히 중요합니다. (처음에는 Entity간의 양방향성을 남발했지만, 공부를 지속하면서 양방향성의 위험성을 알게 되었습니다.) 2. 단뱡향vs양방향 방향을 가져야 하는 경우는 어떤 경우인지 부터 보겠습니다. 먼저 객체지향적인 관점에서 생각해보면 A클래스와 B클래스가 연관관계일때, A클래스는 B클래스를 사용하게 되고 이런 경우에 방향성을 갖습니다. 반대로 B클래스가 A클래스를 사용하게 되면 역시 방향성을 갖습니다. 그러나 방향성을 남발하게 되면 성능상의 큰 문..
JPA란? JPA는 Java Persistence API의 약자입니다. Persistence라는 단어는 Java DTO(Data Transfer Object)에게 '없어지지 않고 오랫동안 지속'되는 '영속성(persistence)'을 부여해준다는 의미입니다. 즉, 데이터를 DB상에 영구적으로 저장해주는 API라고 생각하면 됩니다. 기존 JDBC만을 이용하는 경우 반복적이며 비슷한 SQL문을 많이 만들어야하고, 데이터베이스의 테이블과 자바 객체간의 매핑하는 소모적인 작업을 지속해야 합니다. JPA를 사용하게 되면 SQL문을 개발자가 만들지 않기 때문에 객체 중심적인 개발로 생산성과 유지보수의 능률이 크게 오르고, 특정 DBMS 문법에 종속적이지 않은 개발이 가능합니다. 또한 JPA의 영속성 컨텍스트는 효율..