programming study/B-JPA 9

JPA 관련 메모

Pageable 인터페이스 : 페이징 처리에 사용되는 인터페이스입니다. 페이지 번호, 페이지 크기, 정렬 조건 등을 설정하는 역할을 합니다. Sort 클래스 : Pageable 인터페이스이스에서 사용 되는 클래스입니다. 페이징 처리 결과를 정렬할 때 사용합니다. Order 클래스 : Sort 클래스의 내부 클래스입니다. 정렬 정보를 가지고 있는 클래스입니다. package org.springframework.data.domain; . . public class Sort implements Streamable, Serializable { private static final long serialVersionUID = 5737186511678863905L; private static final Sort UN..

JPA fetch 전략 - 왜 LAZY가 성능상 이점인지?

JPA에서는 엔티티를 가져오는 방식에 대해 fetch 전략을 설정할 수 있습니다. Fetch 전략은 엔티티와 관련된 연관 관계의 데이터를 어떤 시점에 가져올지를 결정하는 것입니다. JPA에서는 기본적으로 두 가지 fetch 전략을 제공합니다. EAGER Fetch 전략 EAGER fetch 전략은 엔티티를 조회할 때 연관된 엔티티도 함께 조회합니다. 즉, 엔티티와 연관된 엔티티들이 모두 로딩됩니다. 이 방식은 필요한 모든 데이터를 한 번에 가져올 수 있어서 편리하지만, 불필요한 데이터를 가져오게 되면 성능 이슈가 발생할 수 있습니다. LAZY Fetch 전략 LAZY fetch 전략은 엔티티를 조회할 때 연관된 엔티티를 로딩하지 않고, 실제로 사용될 때 로딩합니다. 이 방식은 필요한 데이터만 가져오기 때..

JPA - N+1 문제에 대해서

서론 JPA에서 대표적으로 겪는 이슈로 N+1 현상이 있다고 한다. 토이 프로젝트로 만들었던 곳에서도 이 현상이 일어나는지 확인해보고 수정을 해보고자 한다. [10분 테코톡] 수달의 JPA N+1 문제 - YouTube 에서 설명한 내용이 이해하기에 좋은 것 같아서 정리해보고 내 프로젝트에 관련된 내용을 추가로 정리한다음 적용해보자. 본론 N+1 이란? 요청이 한개의 쿼리만 실행하기를 기대했는데, N개의 쿼리가 추가로 발생하는 현상 따라서 1+N이라고 생각하면 쉽다. @OneToOne, @oneToMany, @ManyToOne 등 여러 상황에서 발생할 수 있다. @OneToMany 지연로딩일 때 1. findAll()로 크루 목록을 조회 참고) JPQL Java Persistence Query La..

JPA란?

Java Persistence API - 자바 애플리케이션에서 ORM 을 사용하는 방식을 정의한 인터페이스입니다. - 주로 hivernate를 객체로 사용함 - 관계형 데이터베이스와 객체의 패러다임 불일치 문제를 해결할 수 있다는 점과 영속성 컨텍스트(엔티티를 영구 저정하는 환경) 제공이 큰 특징입니다. Hivernate - 자바 언어를 위한 ORM 프레임워크 Object Relational Mapping - 객체와 관계형DB를 맵핑해주는 기술 Spring Data JPA, Query DSL - JpaRepository 을 상속받아 repository 생성 -> 기본적인 CRUD 쿼리를 사용할 수 있게 해줌 - 쿼리 메서드, @Query 어노테이션을 이용한 JPQL, 네이티브 쿼리 사용, Query DS..

JPA 기초지식

출처 - [Spring/JPA] JPA 기초지식 (tistory.com) 위 글은 김성렬 교수님의 KOCW강의를 보고 작성한 글로 자세한 내용은 해당 강의를 통해 확인하시길 권장합니다. http://www.kocw.net/home/cview.do?cid=5e6aec4a9ae2dd45 스프링과 JPA를 이용한 웹개발 본 강의는 JPA와 스프링프레임워크를 이용한 웹 개발 방법을 설명하고 있습니다. www.kocw.net Persistence.xml a box holding all the needed information for creating an EntityManagerFactory instance JPA 설정을 구별하는 구별자 일반적으로 연결한 데이터베이스당 하나의 영속성 유닛을 등록 실제 개발에서는 여..

Jackson으로 발생한 순환 참조 문제 해결(JPA Entity)

N:N 관계에서 직렬화를 하면 순환참조 하여 무한으로 getter가 호출되는 문제다. 해결책 일반적으로 @JsonIgnore를 이용해 해당 필드의 직렬화를 막거나, @JsonManagedReference - @JsonBackReference 쌍을 이용해 단방향으로만 직렬화가 가능하게 한다. 하지만 순환참조 없이 양뱡항 직렬화가 필요한 경우 @JsonIgnoreProperties을 사용한다. @JsonIgnoreProperties을 사용하면 직렬화 대상 필드에게 직렬화하지 않을 필드를 지정해 줄 수 있다. 예시 @RestController에서 Board를 조회하여 반환하면 Board 안의 Reply를 호출하고 또 Reply 안에 있는 Board가 호출 되고 이 과정이 무한적으로 반복 되는 순환참조가 발생한..

SpringBoot, JPA - '톰캣 시작' 및 'http request 요청' 흐름

1. 톰켓 시작 2. 필터, 디스패처, DataSource, 세션, 인터셉터, viewResolver 를 메모리에 띄운다 3. 서버에 http 요청이 오면 디스패처가 http 요청을 받아 해당하는 url이 맵핑된 컨트롤러를 메모리에 띄우고 http body에 있는 데이터를 컨트롤러에서 사용할 수 있게 해준다. 컨트롤러에서 db session이 시작된다. [로그인 요청] 4.서버 내부 로직에 의해 service단까지 가서 JPA Repository를 통해 영속성 컨텍스트에 해당 오브젝트(user)가 존재하는지 조회한다. 1) 없으면 DB에 쿼리를 날려서 받은 데이터를 영속성컨텍스트에 저장하고 service단으로 가져온다. 2) 있으면 바로 service 단까지 데이터를 가져온다. 5. service단에서 ..

영속성 컨텍스트와 OSIV

[JPA] 영속성 컨텍스트와 OSIV(Open Session In View) (tistory.com) [JPA] 영속성 컨텍스트와 OSIV(Open Session In View) 개요 JPA를 사용하면서 개발하다보면 간혹 LazyInitializationException 이라는 예외를 접하게 될 것이다. 이번에 포스팅할 OSIV는 해당 예외와 밀접한 관련이 있다. 또한 OSIV의 활성화 여부에 따라 JPA를 xzio.tistory.com 개요 JPA를 사용하면서 개발하다보면 간혹 LazyInitializationException 이라는 예외를 접하게 될 것이다. 이번에 포스팅할 OSIV는 해당 예외와 밀접한 관련이 있다. 또한 OSIV의 활성화 여부에 따라 JPA를 사용해서 개발하는 애플리케이션 성능에 ..

JPA 영속성 컨텍스트(Persistence Context)의 5가지 특징

JPA 영속성 컨텍스트(Persistence Context)의 5가지 특징 — devoong2 (tistory.com) 영속성 컨텍스트 특징 1차 캐시 변경 감지 (Dirty Checking) 동일성 보장 지연 로딩(Lazy Loading) 쓰기 지연 1차 캐시 영속성 컨텍스트 내부에서 엔티티를 캐시로 저장하는 것 일반적으로 @Transactional 어노테이션과 라이프사이클이 동일함 OSIV(Open Session In View) 가 true 라면 ServiceLayer 에서 @Transactional 이 종료되어도 PresentationLayer 까지도 1차 캐시는 유지됨 Jpa 는 데이터 조회시 캐시를 우선적으로 조회하고 캐시에 데이터가 없으면 DB를 조회함 @Transactional public ..