Dev/JPA 16

OSIV 를 통한 성능 최적화 ( Connection 관리 관점 )

OSIV 란 뭘까? OSIV는 Open Session In View의 약자로 spring.kpa.open-in-view 옵션을 통해 application.properties 또는 yml 파일에서 On / Off 설정을 할 수 있다. OSIV의 기본값은 true 이다. ( on 상태를 의미한다. ) 기본적으로, 트랜잭션을 시작할 때 JPA의 영속성 콘텍스트는 데이터베이스 커넥션을 가져온다. OSIV는 트랜잭션이 끝나도 사용자에게 Response 가 반환 될 때까지 영속성 콘텍스트와 데이터베이스 커넥션을 끝까지 살려주는 역할을 한다. OSIV - On OSIV 가 On 이면 위 그림과 같이 요청에서 응답까지 이르는 모든 범위에서 영속성 콘텍스트와 데이터베이스 커넥션이 살아 있다. 이렇게 모든 범위에서 영속성..

Dev/JPA 2024.03.15

JPA 에서 Collection 조회시 주의점 및 성능 튜닝 방법

Entity -> Dto 변환 시 Collection 도 잊지 말고 변환해야 한다 Collection을 dto 로 변환하여 리턴할 경우에도 엔티티에 대한 의존도를 끊어야 한다. 예시 코드를 보자. 흐름도 Order 엔티티 정보 @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) // 지연로딩 @JoinColumn(name = "member_id") private Me..

Dev/JPA 2024.03.15

JPQL 의 개념과 간단한 사용 방법 ( 2 / 2 )

이전 포스팅에서 이어집니다. 2024.02.17 - [개발/jpa] - JPQL의 개념과 간단한 사용 방법 ( 1 / 2 ) JPQL 의 개념과 간단한 사용 방법 ( 1 / 2 ) 게시글을 하나로 통합할까 하다가, 이론적인 부분과 실제 사용하는 구문을 분리하는 게 좋겠다는 생각이 들어서 두 개로 나눴다. 이 게시글은 JPQL 의 개념에 대한 내용이 주가 되었으니 참고 바 zigo-autumn.tistory.com 4. JPQL 에서의 페이징은 어떨까? JPA 에서 페이징은 setFirstResult(in statPosition )과 setMaxResults(int maxResult)로 추상화할 수 있다. 각각의 API 의미는 다음과 같다. setFirstResult(int startPosition) ..

Dev/JPA 2024.02.17

JPQL 의 개념과 간단한 사용 방법 ( 1 / 2 )

게시글을 하나로 통합할까 하다가, 이론적인 부분과 실제 사용하는 구문을 분리하는 게 좋겠다는 생각이 들어서 두 개로 나눴다. 이 게시글은 JPQL 의 개념에 대한 내용이 주가 되었으니 참고 바란다. 1. JPQL 이 왜 필요한가? JPA는 엔티티 객체를 중심으로 개발한다. 이렇게 엔티티 객체를 대상을 검색하게 되면 데이터 검색 시에도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 한다. 애플리케이션에서, 검색 시 필요한 데이터만 DB에서 불러 오려면 결국 검색조건이 포함된 SQL 이 필요한데 이때 JPA 에서 SQL 을 추상화한 JPQL 이라는 객체 지향 쿼리 언어를 제공한다. JPQL을 사용하면 엔티티 객체 대상으로 쿼리를 실행해서 원하는 데이터를 뽑아올 수 있다! 참고 - SQL 은 DB 에서 테이블..

Dev/JPA 2024.02.17

JPA 데이터 타입 분류

1. 엔티티 타입이란? @Entity 로 정의 하는 객체를 의미하며 데이터가 변하더라도 식별자를 통해 지속적으로 추적할 수 있다. 2. 값 타입이란? int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본타입( 래퍼클래스, String 등 .. ) 이나 객체를 의미한다. 식별자가 없고 값만 존재하므로 변경시 추적이 불가능하다. 기본적으로 자반의 기본타입은 절대 공유 되지 않는다. 공유하지 않는다는 것의 의미를 코드로 설명하면 다음과 같다. 기본타입이 공유되지 않을 경우 int a = 10; int b = a; a = 20; // a 는 20, b 는 10 으로 출력 위 코드에서 int b = a 로 선언했음에도 기본타입이 공유 되지 않고 각각 출력되는 것을 볼 수 있다. 공유 될 ..

Dev/JPA 2024.02.15

영속성 전이와 고아 객체

이전 포스팅에서 이어집니다 2024.02.05 - [개발/jpa] - JPA 에서 프록시 객체와 지연 로딩 JPA 에서 프록시 객체와 지연 로딩 JPA 를 사용하면서 연관관계를 정의하고, 연관 관계 정의 시 사용하는 지연로딩에 대해 이해하기 위해서는 프록시라는 개념이 무엇인지 확실히 알아야 한다. 해당 게시글에서는 프록시에 대한 zigo-autumn.tistory.com 1. CASCADE, 영속성 전이 영속성 전이는 연관관계 세팅이나 즉시 로딩과는 전혀 관계가 없는 내용이다. 특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속 상태로 만들고 싶다면 영속성 전이를 사용할 수 있다. 즉, 영속성 전이를 사용하면 자동으로 자식 객체까지 persist 가 호출 된다. 여기서 헷갈릴 수 있는 부분..

Dev/JPA 2024.02.06

JPA 에서 프록시 객체와 지연 로딩

JPA 를 사용하면서 연관관계를 정의하고, 연관 관계 정의 시 사용하는 지연로딩에 대해 이해하기 위해서는 프록시라는 개념이 무엇인지 확실히 알아야 한다. 해당 게시글에서는 프록시에 대한 개념과 연관관계에 대해 정리하려고 한다. 들어가기 전에, 해당글에서 '프록시 객체'와 '프록시 엔티티'는 동일한 의미로 사용됨을 밝힌다. 이 글을 이해하려면 JPA 에서 제공하는 영속성의 의미를 알고 있어야 한다. 필요한 사람은 해당 글을 참고하면 좋을 것 같다. 2023.12.11 - [개발/jpa] - JPA에서 영속성의 의미와 사용하는 애노테이션 정리 1. 프록시 객체가 뭘까? EntityManager에서 제공하는 getReference()로 프록시 객체의 기본 개념을 알아보자 일반적으로 entityManager ..

Dev/JPA 2024.02.05

Repeated column in mapping for entity 오류 해결하기

오류 발생 상황 jpa 에서 상속관계 내용을 공부하던 도중 MappedSuperClass 에 해당하는 BaseEntity 를 생성하고, 이를 extends 하는 Member 코드를 작성 후 실행 오류 내용 Repeated column in mapping for entity 해결 방법 검색해보니 엔티티 설계 자체가 잘못되었을 때 발생한다고해서 BaseEntity 부분에 Member 의 @Id 부분이 중복되어 기재된 것을 확인 후 제거하니 정상적으로 잘 된다. 복사 붙여 넣기를 할 땐 항상 주의하자...

Dev/JPA 2023.12.27

JPA 상속관계 매핑 - 상속 전략과 MappedSuperClass

1. JPA 에서 상속관계매핑이란? 객체(Entity) 의 상속구조, 데이터베이스에서 Super/Sub 타입 관계를 매핑하는 것을 의미한다. 이처럼 부모 객체(Super)를 자식 객체(Sub)가 상속하게 되면 부모객체의 변수와 메서드에 접근 가능한 것처럼, JPA 에서도 상속관계 매핑을 사용하여 동일하게 구현할 수 있다. 예를 들어 판매자가 판매하려고 하는 상품(Item) 에는 서적(Book), 앨범(Album), 영화(Movie) 가 있다고 하자. 이 때 상품이 가지는 공통적인 특징을 묶어 Item 객체를 생성하고 서적과 앨범, 영화는 각각 Item 을 상속받는 Book, Album, Movie 객체로 생성할 수 있다. 이렇게 정의한 Item 과 Book, Item 과 Album, Item과 Movie..

Dev/JPA 2023.12.27