JPA
-
첫 사진부터 놀래켜드려서 죄송하구요 JPA에서 ID를 할당하는 방법이 여러가지가 있죠, 뭐 수동 할당, 자동 할당, IDENTITY, SEQUENCE, TABLE, AUTO 등이 있는데요 이거 잘 보지 않으면 진짜 헷갈립니다같이 한번 정리해보죠 스따뜨수동 할당수동 할당은 직접 ID를 채워 넣어주는 방식인데요, 한번 해보겠습니다@Entity@Getter@NoArgsConstructor@AllArgsConstructorpublic class Study { @Id private String id; private String name;} 이 엔티티를@Transactional@SpringBootTestpublic class StudyTest { @Autowired StudyReposit..
잘 보지 않으면 헷갈리는 ID 에 대한 고찰첫 사진부터 놀래켜드려서 죄송하구요 JPA에서 ID를 할당하는 방법이 여러가지가 있죠, 뭐 수동 할당, 자동 할당, IDENTITY, SEQUENCE, TABLE, AUTO 등이 있는데요 이거 잘 보지 않으면 진짜 헷갈립니다같이 한번 정리해보죠 스따뜨수동 할당수동 할당은 직접 ID를 채워 넣어주는 방식인데요, 한번 해보겠습니다@Entity@Getter@NoArgsConstructor@AllArgsConstructorpublic class Study { @Id private String id; private String name;} 이 엔티티를@Transactional@SpringBootTestpublic class StudyTest { @Autowired StudyReposit..
2025.08.15 -
N+1 문제 해결 후기두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (OneToMany) -- Question dockerel.tistory.com 정확하게 반년 전에 N+1 문제를 맞닥뜨렸습니다이때 당황한 기억이 아니 그 당황했다기보다는 그 유명한 N+1 문제를 직접 겪었단 사실에 가슴이 두근두근 했던 기억이 나네요 반년이 지난 지금 저는 N+1 문제에 대해 얼마나 더 자세히 알게 됐을지 알아보겠습니다스따뜨 우선 N+1 문제의 정의는 그거죠JPA에서 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수 N만큼 연관관계의 조회 쿼리가 추가로 ..
반년 만에 다시 이해한 N+1 문제N+1 문제 해결 후기두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (OneToMany) -- Question dockerel.tistory.com 정확하게 반년 전에 N+1 문제를 맞닥뜨렸습니다이때 당황한 기억이 아니 그 당황했다기보다는 그 유명한 N+1 문제를 직접 겪었단 사실에 가슴이 두근두근 했던 기억이 나네요 반년이 지난 지금 저는 N+1 문제에 대해 얼마나 더 자세히 알게 됐을지 알아보겠습니다스따뜨 우선 N+1 문제의 정의는 그거죠JPA에서 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수 N만큼 연관관계의 조회 쿼리가 추가로 ..
2025.08.06 -
안녕하세요 문제는 그렇게 시작된 건 아니고 그냥 엔티티의 상태에 한번 정리해보려고 합니다 렛츠고 일단 영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로 1차 캐싱, 쓰기 지연, 변경 감지를 통해 영속 로직을 효율적으로 할 수 있게 해줍니다 그리고 엔티티 매니저는 이 영속성 컨텍스트를 관리하는 작업을 도와주는 역할로, 영속성 컨텍스트와 상호작용함으로서 영속 로직을 수행하는 역할을 가지고 있습니다 엔티티 매니저에 의해 관리되는 엔티티는 영속성 컨테이너에 대해 세 가지 상태를 갖습니다 비영속엔티티 객체가 새로 생성되었지만 아직 영속성 컨텍스트와 연관되지 않은 상태입니다 public void create(String id, String name) { Study study = new Study(id, nam..
엔티티가 비영속이었다가 영속됐다가 준영속됐다가 다시 영속됐다가 ...더보기안녕하세요 문제는 그렇게 시작된 건 아니고 그냥 엔티티의 상태에 한번 정리해보려고 합니다 렛츠고 일단 영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로 1차 캐싱, 쓰기 지연, 변경 감지를 통해 영속 로직을 효율적으로 할 수 있게 해줍니다 그리고 엔티티 매니저는 이 영속성 컨텍스트를 관리하는 작업을 도와주는 역할로, 영속성 컨텍스트와 상호작용함으로서 영속 로직을 수행하는 역할을 가지고 있습니다 엔티티 매니저에 의해 관리되는 엔티티는 영속성 컨테이너에 대해 세 가지 상태를 갖습니다 비영속엔티티 객체가 새로 생성되었지만 아직 영속성 컨텍스트와 연관되지 않은 상태입니다 public void create(String id, String name) { Study study = new Study(id, nam..
2025.08.05 -
안할래 농담이고요. 해결기 보시죠. 레지고 문제는 그렇게 발생했습니다. 일단 엔티티간 연관관계부터 보시죠. 지금 개발하고 있는 챗봇 서비스는 회원 한명이 여러 히스토리를, 히스토리 하나가 여러 질문을, 한 질문에는 하나의 답변이, 하나의 답변에는 여러 이미지가 딸려있는 괴랄한 구조를 가집니다. 쉽게 생각하자면 지피티의 구조를 생각하시면 될 것 같습니다. 그래서 회원이 저 히스토리를 딱 클릭하면 히스토리 정보와 거기에 딸린 질문, 답변, 그리고 이미지를 다 불러와야 할 것 같은데요. 연관관계를 다 Lazy Loading으로 설정해놓았기 때문에 그냥 사용했다가는 N+1 폭격을 맞을 것 같네요. 그래서 시원하게 fetch로 다 묶어버렸습니다. public interface HistoryRepository e..
MultipleBagFetchException 해결할래 말래안할래 농담이고요. 해결기 보시죠. 레지고 문제는 그렇게 발생했습니다. 일단 엔티티간 연관관계부터 보시죠. 지금 개발하고 있는 챗봇 서비스는 회원 한명이 여러 히스토리를, 히스토리 하나가 여러 질문을, 한 질문에는 하나의 답변이, 하나의 답변에는 여러 이미지가 딸려있는 괴랄한 구조를 가집니다. 쉽게 생각하자면 지피티의 구조를 생각하시면 될 것 같습니다. 그래서 회원이 저 히스토리를 딱 클릭하면 히스토리 정보와 거기에 딸린 질문, 답변, 그리고 이미지를 다 불러와야 할 것 같은데요. 연관관계를 다 Lazy Loading으로 설정해놓았기 때문에 그냥 사용했다가는 N+1 폭격을 맞을 것 같네요. 그래서 시원하게 fetch로 다 묶어버렸습니다. public interface HistoryRepository e..
2025.06.28 -
두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (OneToMany) -- Question 그리고 저장 및 테스트를 용이하게 하기 위해 Member에dockerel.tistory.com N+1 문제 해결 후기는 위 글과 이어집니다. 엔티티 영속성 전이 문제를 어찌어찌 해결한 후 한시름 놨다고 생각할 때쯤 쿼리 로그를 보니 뭔가 이상했다. 무수한 SELECT 요청이 날아가고 있었고, 딱 보자마자 N+1 문제라는 느낌이 확 왔다. 그런데 사실 그도 그럴 것이 기존에 멤버가 질문한 개수를 구하는 로직은 이렇게 작성되어 있었다. 멤버의 history를 구하..
N+1 문제 해결 후기두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (OneToMany) -- Question 그리고 저장 및 테스트를 용이하게 하기 위해 Member에dockerel.tistory.com N+1 문제 해결 후기는 위 글과 이어집니다. 엔티티 영속성 전이 문제를 어찌어찌 해결한 후 한시름 놨다고 생각할 때쯤 쿼리 로그를 보니 뭔가 이상했다. 무수한 SELECT 요청이 날아가고 있었고, 딱 보자마자 N+1 문제라는 느낌이 확 왔다. 그런데 사실 그도 그럴 것이 기존에 멤버가 질문한 개수를 구하는 로직은 이렇게 작성되어 있었다. 멤버의 history를 구하..
2025.02.06 -
현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (OneToMany) -- Question 그리고 저장 및 테스트를 용이하게 하기 위해 Member에서 Question까지 CascadeType.ALL을 통해 영속성 전이를 설정해 놓았다. 그리고 Member, History 그리고 Question을 저장하고 Member가 올린 총 Question의 수를 구해오는 테스트를 작성하였다. @DisplayName("유저가 존재하면 유저의 이메일, 닉네임, 가입날짜, 해당 유저의 질문 개수를 반환한다.")@Testvoid getMyInfoWithExistMemberId() { // given Stri..
두 엔티티 간에 영속성 전이가 제대로 이루어지려면?현재 진행하고 있는 개인 프로젝트에서 다음과 같이 엔티티들의 연관관계가 설정되어 있다. Member -- (OneToMany) -- History -- (OneToMany) -- Question 그리고 저장 및 테스트를 용이하게 하기 위해 Member에서 Question까지 CascadeType.ALL을 통해 영속성 전이를 설정해 놓았다. 그리고 Member, History 그리고 Question을 저장하고 Member가 올린 총 Question의 수를 구해오는 테스트를 작성하였다. @DisplayName("유저가 존재하면 유저의 이메일, 닉네임, 가입날짜, 해당 유저의 질문 개수를 반환한다.")@Testvoid getMyInfoWithExistMemberId() { // given Stri..
2025.02.06