자바 ORM 표준 JPA 프로그래밍

Dev/JPA

[강의정리] N+1 문제와 JPQL fetch join을 통한 해결

출처: 자바 ORM 표준 JPA 프로그래밍 N + 1 문제 N + 1 문제는 내가 예상했던 것보다 훨씬 많은 쿼리가 나가는 문제를 뜻한다. 여기서 1은 내가 예상한 (당장 보이는) 하나의 쿼리이고, N은 데이터의 개수 N만큼 발생하는 예상치 못한 쿼리이다. 다양한 예시 Member 엔티티와 Team 엔티티가 있다고 가정하자. 이들은 다대일 관계이며, Member에서 Team을 참조할수있다. 이런 상황에서 Member를 조회해보자. 1. em.find()로 조회 연관관계 매핑 시, 즉시 로딩으로 했는지, 지연 로딩으로 했는지가 중요하다. 즉시 로딩으로 설정시, 쿼리가 나갈때 즉시 로딩으로 설정된 엔티티들을 전부 조인해서 가져온다. 지연로딩으로 설정시, 쿼리가 나갈때 일단은 조회한 엔티티 자체만 가져온다. ..

Dev/JPA

[강의정리] 영속성 전이, 고아객체, 생명주기

출처: 자바 ORM 표준 JPA 프로그래밍 영속성 전이 영속성 전이(cascade)를 사용하면 말그대로 영속성을 전이시킬수 있다. A 엔티티를 영속화하면, 그에 연관된 B 엔티티도 자동으로 영속화 하는것이 가능해진다. 예시) @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) 종류도 다양하다. CASCADE의 종류 • ALL: 모두 적용 • PERSIST: 영속 • REMOVE: 삭제 • MERGE: 병합 • REFRESH: REFRESH • DETACH: DETACH 오해하면 안되는점은, 이건 연관관계 매핑과 아무상관이 없다. 그저 편하라고 있는 기능을 제공해줄 뿐이다. 고아 객체 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 고아 객체라고 한다. ..

Dev/JPA

[강의정리] 프록시와 연관관계 관리

출처: 자바 ORM 표준 JPA 프로그래밍 프록시 객체는? 엔티티를 조회할때, 프록시 객체를 생성하여 그것을 대신 조회할수있다. em.find() 말고 em.getReference()를 호출하면, 일어나는 일들이다: 1. 진짜 엔티티를 상속하고 구조도 같은 프록시 객체가 만들어짐. 이 안에 실제 데이터는 없다. 2. 이렇게 얻은 객체에서 필드를 호출함 3. 그 순간 영속성 컨텍스트로 초기화 요청이 오고, 진짜 엔티티를 생성함 4. 프록시 객체가 진짜 객체로 요청을 다시 보내고 받아온 후 반환함. 한번만 초기화 되며, 프록시 객체 생성 전에 이미 영속성 컨텍스트에 진짜 엔티티 객체가 들어와 있으면, 그냥 진짜를 반환함. . . . 이런 프록시 객체는 어디에 사용될까? 지연로딩(lazy loading)에 사..

Dev/JPA

[강의정리] 상속관계 매핑

출처: 자바 ORM 표준 JPA 프로그래밍 계속 언급했지만 객체지향 언어와 관계형 DB는 패러다임의 불일치가 있다. 관계형 데이터베이스는 상속관계가 없고, 이와 유사한 슈퍼타입 서브타입 관계를 자바에 매핑해야한다. 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) • JOINED: 조인 전략 • SINGLE_TABLE: 단일 테이블 전략 • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 상속관계 매핑의 종류 1. 조인전략 장점 - 테이블 정규화가 잘됨 - 저장공간 효율적임: 각 엔티티 클래스가 필요한 필드만 가지고 있어서 null로 채워줄 필요 없음 - 외래 키 참조 무결성 제약조건 활용 단점 - 조회시 조인이 많이 발생(조회 쿼리가 복잡함)->성능..

Dev/JPA

[강의정리] 연관관계 매핑

출처: 자바 ORM 표준 JPA 프로그래밍 객체와 테이블을 매핑하기위해서 페러다임의 불일치를 해결해야 한다. 객체의 참조와, 테이블의 외래 키를 매핑해야 하는것이다. JPA의 @JoinColumn를 사용하면 이를 쉽게 해결할수있다. 용어 정리, 설명 • 방향(Direction): 단방향, 양방향 -객체는 참조의 방향이 있다. A 객체가 B 객체를 참조하면 단방향 매핑이 하나 있는것이며, B 객체가 A 객체를 참조하면 단방향 매핑이 두개 있는것이고, 이를 양방향 매핑이라 부른다. 양방향 매핑을 하면, 1. 연관관계의 주인을 설정해주어야 한다. 2. 연관관계 편의 매소드를 작성해야 한다. 양방향 매핑은 나중에 필요하면 추가하는 식으로 작성하는것이 바람직하다. • 다중성(Multiplicity): 다대일(N:..

Dev/JPA

[강의정리] 엔티티 매핑

출처: 자바 ORM 표준 JPA 프로그래밍 ㅇ 자주 쓸것같은것만 아주 간단하게 정리해보겠다. • 객체와 테이블 매핑: @Entity, @Table • 필드와 컬럼 매핑: @Column @Enumerated @Temporal @Lob @Transient • 기본 키 매핑: @Id @Entity 테이블과 매핑할 클래스에 사용. JPA 관리하에 두게함. 기본 생성자 필수. @Table (name = blabla)통해 테이블 이름 설정가능 @Column (name = blabla)통해 칼럼 이름 설정가능 insertable 옵션도 있음 @Enumerated EnumType.STRING으로 해야 나중에 대참사 예방가능 @Temporal :LocalDate, LocalDateTime 쓰면 안해도 괜찮음 @Lob 지..

Dev/JPA

[강의정리] 영속성 컨텍스트의 동작

출처: 자바 ORM 표준 JPA 프로그래밍 PersistenceContext: 영속성 컨텍스트 영속화의 의미는 데이터를(엔티티) 영구 저장하는 것. 그것에 사용되는 논리적인 환경이 영속성 컨텍스트이다. EntityManager를 통해 접근할수 있다. 세부적으로는 EntityManagerFactory에서 EntityManager를 만들고, 그걸 트랜잭션 단위로 클라이언트가 사용한다. 생명주기 • 비영속 (new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 • 영속 (managed) 영속성 컨텍스트에 관리되는 상태 • 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 • 삭제 (removed) 삭제된 상태 영속성 컨텍스트의 이점 1차캐시 - 영속성 컨텍스트에 포함되..

Dev/JPA

[강의정리] SQL 중심적인 개발의 문제점

출처: 자바 ORM 표준 JPA 프로그래밍 주된 이유: 패러다임의 불일치 . . . ===객체지향 언어와 관계형 데이터베이스의 차이에서 오는 어려움=== -객체를 테이블에 맞추어 모델링 해야함: 객체는 상속관계, 테이블은 슈퍼타입 서브타입 관계, 객체는 참조 사용, 테이블은 외래키 사용 -진정한 의미의 계층분할이 어려움: DAO 작성자와 service 작성자가 다를때, 서비스에서 DAO를 맘놓고 못쓴다. 쿼리가 실제로 어떻게 나가는지 일단 확인해야하기 때문이다. -객체를 자바 컬렉션처럼 디비에 저장하고 사용하고싶음: 그래야 다형성, 객체 그래프 탐색 등이 쉬움 종합하면, 프로그래머는 객체지향 프로그래밍의 장점을 살려서 프로그래밍 하고싶다. 그러나 패러다임의 불일치로 인해서 급한 불을 끄는 식으로 sql ..

ChoiBulldog
'자바 ORM 표준 JPA 프로그래밍' 태그의 글 목록