스프링/JPA 9

지피지기 백전불태(부제 : JPA의 오해와 사실)

사내 팀 내 개발 문화를 도입하면서 공유한 내용입니다.  간단하게 어떤 개발문화를 도입했는지에 설명하자면 다음과 같습니다. - 팀원들 개인의 경험 공유 및 지식 나눔으로 매주 목요일 번갈아가며 진행- 발표자는 자유 주제로 팀원들과 소통- 무거운 주제도 괜찮지만 되도록 가벼운 주제로- 다른 개발의 영역이라도 자유롭게 참가 가능- 주 목적은 같이 성장하기 이미 여러 다른 회사들에서는 이러한 개발문화를 도입했을겁니다.이는 팀 내의 역량을 증진하고 더 나아가 발표를 하기 위해, 발표를 듣기 위해 자신의 지식을 점검하며 같이 성장하기에 주 목적이 있습니다   간단한 설명은 이쯤에서 끝내고 발표 준비한 내용을 공유도록 하겠습니다. 목차N+1 문제의 흔한 착각여러분은 Page와 Slice를 아시나요?DirtyChec..

스프링/JPA 2024.10.20

Cascade Type의 종류, 그리고 의도

JPA에서는 영속성 전이(CASCADE)라는 개념을 지원해줍니다. 그럼 과연 영속성전이(CASCADE)란? 무엇인가요? 해석하자면 대상 엔티티에 대해 수행하는 작업들이 관련 엔티티에서도 작업이 적용된다는 것이다. JPA에서는 영속성 전이 타입 5가지를 지원해줍니다. ALL 상위엔티티에서 하위 엔티티로 모든 작업을 전파합니다. ( 모든 Cascade를 적용 ) PERSIST 하위 엔티티까지 영속성을 전달합니다. ( 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지 ) MERGE 엔티티 상태를 병합할 때, 연관된 엔티티도 모두 병합 REMOVE 연결된 하위 엔티티까지 제거함 REFRESH 연결된 하위 엔티티까지 인스턴스 값 새로고침 ( 데이터베이스로부터 인스턴스 값 다시 읽어오기 ) DETACH 영속성 컨텍..

스프링/JPA 2023.03.22

JPA 데이터베이스 초기화 전략 (5가지 )

jpa에서는 애플리케이션 구동시 JPA 데이터 베이스의 전략을 설정할 수 있습니다. 총 5개의 전략을 지원해줍니다. create : 기존 테이블 삭제 후 테이블 생성 create - drop : create와 같지만, 종료 시점에 테이블을 삭제 none : 사용하지 않음 update : 기존의 테이블과 비교해서 변경된 내용이 있으면 수정 (SessionFactory와 연결된 DB를 비교해서 추가된 항복은 추가, 같은 변수명이면 오류 발생 ) validate : 엔티티와 테이블 정상 매핑 확인 ( SessionFactory 시작 시 객체 구성과 스키마가 다르면 예외가 발생) 이렇게 5가지의 전략이 있습니다. 일반적으로 초기 개발이나 테스트 할 떄는 create, update, create-drop을 주로 ..

스프링/JPA 2023.03.22

@Transactional 복습 그리고 더 나아가기 (readOnly)

복습 과거에 10분 테코톡을 보고 트랜잭션에 관련된 내용을 정리한 적이 있었다. 그 내용을 우선 다시 복기해보자. 일단 트랜잭션은 한 요청에 대한 작업 단위라고 생각하면 쉽다. 이 트랜잭션이 수행될 때, 중요한 부분이 내부 동작이였는데 DB 커넥션 풀을 이용해서 커넥션 객체를 가지고 오게되고, 이 객체를 이용해서 DB에 요청을 보낸다고 했다. DB 입장에서는 이 커넥션을 하나의 세션으로 생각할텐데 한 기능의 작업 단위를 묶지않으면, 결국 제 각각의 다른 커넥션으로 생각할 것이고, 이는 세션을 처리할 때, 개별 작업으로 처리해버릴 것이다. 그래서 우리가 원하는 기대 값이 나오지 아니할 가능성이 높다. 여기서 가장 중요한 점은 결국 우리가 만들고자 하는 기능을 작업 단위 즉 트랜잭션으로 묶어야 한다는 점이 ..

스프링/JPA 2023.03.11

count 그리고 성능과 서브쿼리(SubQuery)

사건의 발단은 이랬다. 내가 조건에 맞춰 queydsl을 이용해서 원하는 데이터를 DTO로 뽑아서 조회하고싶었다. DTO로 뽑아오는 도중 많은 오류를 만났었고, 어떤 오류인지, 어떻게 해결하는지 직접 검색하고 찾아보면서 문제를 해결해 나가고 있다. 그러던 와중에 문득 데이터를 어떻게 뽑아오지? 라는 생각을 했다. 예를들어서 post 와 recommend 라는 테이블들이 각각 있으면 이들은 1:M // M:1 (양방향) 관계를 맺고 있다. 내가 원하는 것은 각각의 post에 맞춰서 recommend를 count 해오는 것이였는데, 어떻게 이를 count 해올 수 있을까? 라는 생각이 들었다. 먼저 where 조건절에 post.id.eq(recommend.post.id) 이렇게 조건을 주니 내가 원하는 데이..

스프링/JPA 2023.02.15

만약 대량의 데이터를 지워야 할 일이 있다면??? (JPA)

들어가기 본론 마무리 들어가기 만약 우리가 게시물을 지워야 한다면? 게시물과 연관된 테이블의 데이터를 먼저 지운 후 게시글을 지워야 한다. 게시물은 하나만 지우면 끝이지만, 게시물에 작성된 댓글이 만약 무수히 많다면? 게시글 - 사용자 : Many to One (다대일) 게시글 - 댓글 : Many to One (다대일) 만약 윗 코드처럼 댓글을 지우게 된다면 댓글의 갯수많큼 delete 쿼리가 발생할 것이다. 댓글이 많이 존재하지 않으면 괜찮은데, 이 댓글이 무수히 많다면? 성능상에 이슈가 발생할 여지가 생길 것이다. 어떻게 이를 해결할 수 있을까? 본론 이 글의 시작은 게시물에서 시작되었다. 예를 들어서 1번 게시물을 지우고자 할때, 윗 그림에서 확인할 수있는 것처럼, 연관관계가 맺어져 있기에 연관괸..

스프링/JPA 2023.01.14

cascade = CascadeType.REMOVE ? orphanRemoval = ture?

목차 들어가기 JPA CascadeType.REMOVE orphanRemoval = ture 마무리 들어가기 우리는 JPA에서 양방향 매핑시 cascade 전략을 이용해 부모가 자식 객체의 생명 주기를 관리할 수 있다. 이 때 전제 조건은 양방향관계를 맺고 있다에서 출발되는데, 양방향 전략 사용 시 둘 중 하나를 하나로 외래 키를 관리해야 한다. 문득 궁금했다. 이 Cascade 전략에 관련해서, 그러다 지식을 습득하는 과정에서 orphanRemoval이라는 키워드도 얻게 되었는데, 이 둘의 차이점이 무엇인지 정리함으로써 내 것으로 만들기 위해 이렇게 글을 정리하는 시간을 갖게 되었다. JPA CascadeType.REMOVE 이 CasCaseType.Remove를 지정했을 때, 부모 엔티티가 삭제되면 ..

스프링/JPA 2023.01.06

JPA - 영속성 컨텍스트 (2022.12.11 추가)

전에 JPA가 무엇인지 간략하게 짚고 넘어갔고, 이번엔 왜 JPA가 중요한지에 대해 짚고 넘어가고자 한다. JPA가 부여받은 임무는 다음과 같다. 객체와 관계형 데이터베이스 매핑하기(Object Relational Mapping) 영속성 컨텍스트 객체와 RDB를 Mapping? 영속성 컨텍스트? 대체 이 것들이 무엇일까? 왜 JPA에서 이 두가지가 중요한지 궁금증이 생길 것이다. 우선 영속성 컨텍스트에 대해 짚고 넘어가야 한다. 1. 영속성 컨텍스트란 무엇인가? 2. Entity 생명 주기 3. 영속성 컨텍스트의 장점이자 이점 1. 영속성 컨텍스트? 영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에 데이터를 보관하는 논리적 개념인데, 쉽게 설명하면 "엔티티를 영구 저장하는 환경" 이라는 뜻..

스프링/JPA 2022.12.09

What is JPA(Java Persistence API)?

if(백엔드 개발자를 희망하는 사람 中) if(Spring Framework를 사용하는 사람이라면) known JPA 웃고자 대충 만들었다. 그 정도로 Spring을 사용해본 경험이 있으면 JPA를 모를수가없다. 오늘은 이 JPA와 관련해 이야기를 나눠보려고 한다. 이 글은 인프런-김영한 자바 ORM 표준 JPA 프로그래밍을 참고한 내용입니다. 우리는 Spring JPA를 사용하면서 이 JPA가 무엇인지, 왜 사용하는지를 여러 번 고민해본 적이 있을 것이다. JPA는 그냥 어마무시한 놈이다 이 JPA를 사용하는 이유는 바로 이 것이다 객체와 관계형데이터베이스(RDB)간의 패러다임의 불일치를 해결 - 목차 - 1. JPA란? 2. JPA를 왜 사용해야 하나? 3. JPA의 동작과정 1. JPA란? JPA(..

스프링/JPA 2022.12.09