본문 바로가기

Programming/JPA

(7)
[JPA] 값 타입(Value Object) 엔티티 타입 vs 값 타입 엔티티 타입 @Entity로 정의하는 객체 식별자를 통해 지속적으로 추적이 가능해 값을 변경해도 식별자를 통해 같은 객체인지 인식 가능 생성, 소멸, 영속 등의 생명 주기가 존재 다른 객체에서 참조가 가능 값 타입 int, Integer, String 등 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 존재하기 때문에 추적이 변경시 불가능 생명주기를 엔티티에 의존. 의존하는 엔티티가 제거되면 함께 삭제 공유하지 않는 것이 안전 기본 값 타입 basic value type 기본 타입, 래퍼 클래스나 String 등을 사용한다. 값 타입의 속성은 식별자 값이 없으며, 공유를 막아야 한다. 만약 공유를 허용하면 회원의 이름을 변경할 때 다른 회원의 이름까지 변경될..
[JPA] 영속성 전이(cascade)와 고아 객체 영속성 전이(transitive persistence) 특정 엔티티를 영속 상태로 만들 때, 영관된 엔티티도 함께 영속 상태로 만드는 것이다 CASCADE옵션을 사용하면 부모 엔티티를 저장할 때, 자식 엔티티도 함께 저장이 가능하다. 엔티티를 저장할 때에는 연관된 모든 엔티티가 영속상태여야하기 때문에 부모 엔티티를 저장하려면 부모 엔티티와 연관된 자식 엔티티 각각 영속 상태로 만들어야 한다. @Entity public class Parent { ... @OneToMany(mappedBy = "parent") private List children = new ArrayList(); } @Entity public class Child { ... @ManyToOne private Parent parent; }..
[JPA] 프록시, 즉시 로딩과 지연로딩 프록시 엔티티를 조회하고 항상 연관된 엔티티가 사용되는 것은 아니다. 회원을 조회했다고 해도 회원이 가입한 팀을 사용하지 않을 수도 있다. 때문에 회원을 조회할 때 항상 팀 엔티티를 함께 조회하는 것은 효율적이지 않다. JPA는 엔티티가 실제로 사용되기 전까지 데이터베이스 조회를 지연할 수 있도록 제공하는데 이를 지연 로딩이라 한다. 실제 사용하는 시점에 데이터베이스에서 필요한 데이터를 가져오는 것이다. 하지만 지연 로딩을 사용하면 실제 엔티티 객체 대신 가짜 객체가 필요한데 이것이 프록시 객체이다. 프록시 객체 JPA에서는 식별자로 엔티티를 조회할 때 EntityManager.find()를 사용하는데 이 메소드는 영속성 컨텍스트에 엔티티가 없으면 데이터베이스를 조회한다. 이렇게 조회하면 사용하지 않더라..
[JPA] Entity 생명주기(Entity LifeCycle) 엔티티 생명주기(Entity LifeCycle) 비영속(new/transient) 순수한 객체 상태이며, 영속성 컨텍스트와 관련이 없는 상태 Member member = new Member(); 영속(managed) EntityManager를 통해 엔티티를 영속성 컨텍스트에 저장되어 영속성 컨텍스트가 관리하는 상태 em.persist(member); // 객체 저장 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된(detached) 상태 em.detach(member); // 특정 엔티티를 분리 em.close(); // 영속성 컨텍스트 닫기 em.clear(); // 영속성 컨텍스트 초기화 추가 설명 삭제(removed) 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한 상태 em.remo..
[JPA] 플러시(flush) 플러시(flush) 플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 플러시를 한다고 commit이 이루어지는 것이 아니다! 동작 과정 변경 감지를 동작해 영속성 컨텍스트의 모든 엔티티를 스냅샷과 비교해 수정된 엔티티를 찾음(Dirty Checking) 수정된 엔티티는 쿼리를 만들어 쿼리를 저장 저장된 쿼리를 DB에 전송 플러시하는 방법 직접 호출 em.flush(); 영속성 컨텍스트를 강제로 플러시한다. 플러시를 하더라도 1차 캐시에 있는 내용은 지워지지 않고 저장된 쿼리만 DB에 전송하게 된다 커밋시 자동 호출 JPA가 트랜잭션을 커밋할 때 플러시를 자동으로 호출해 변경 내용을 반영하게 된다 JPQL 쿼리 실행시 자동 호출 Member member = new Member(); em.persi..
[JPA] 영속성 컨텍스트(Persistence Context) EntityManagerFactory & EntityManager EntityManagerFactory 말 그대로의 Entity Manger를 만드는 공장이다 데이터베이스를 하나만 사용한다면 한개의 EntityManagerFactory를 생성한다. 스레드에 안전하기 때문에 서로 다른 스레드간의 공유를 해도 문제가 없고 생성하는데의 비용이 크기 때문에 Application 로딩 시점에 생성해 공유하도록 설계되어 있다. ... EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydatabase"); // EntityManagerFactory 생성 emf.close(); // EntityManagerFactory 종료 EntityManag..
[JPA] JPA란? JPA를 사용하는 이유 자바는 JDBC API를 사용해 SQL을 데이터 베이스에 전달하기 때문에 중요하지만 SQL 중심적인 개발을 하게 되면 많은 문제가 발생한다. JPA Java persistence API는 자바의 ORM 기술의 표준이다 ORM❓ Object-Relational Mapping 객체와 관계형 데이터베이스를 매핑한다는 뜻 ORM 프레임워크는 객체와 테이블을 매핑해 패러다임의 불일치를 개발자 대신 해결해준다. 객체는 객체대로 생성하고, 데이터베이스는 데이터베이스에 맞도록 설계를 가능하게 해준다. 개발자는 이를 매핑하는 방법만 전달해주면 된다. JPA란 자바 ORM에 대한 API 표준 명세이고, 인터페이스의 모음이다. 따라서 구현체가 없고, 사용하기 위해서는 ORM프레임워크를 선택해야한다. 다양한 프레임워크가 존재..