Spring JPA
-
[Spring JPA] JPA N+1 문제Spring JPA 2024. 10. 13. 20:07
N + 1 문제는 하나의 쿼리를 통해 데이터를 조회할 때, 연관된 엔티티들을 지연 로딩(Lazy Loading) 또는 즉시 로딩(Eager Loading)으로 추가 조회하면서, 의도하지 않은 N개의 추가 쿼리가 실행되는 현상을 의미한다. 언제 발생할까? JPA Repository를 사용하여 엔티티 조회 메서드를 호출할 때, 주로 SELECT(READ) 쿼리에서 발생합니다. 누가 발생 시킬까? 1 대 다(1:N) 또는 다 대 1(N:1) 연관 관계를 가진 엔티티를 조회할 때 발생합니다.주로 Fetch 전략에 의해 발생합니다. 특히 EAGER와 LAZY 로딩 전략에 따라 다르게 발생합니다. 어떤 상황에서 발생할까? 1. EAGER Fetch 전략을 사용하여 데이터를 조회하는 경우:연관된 엔티티를 즉시 조회..
-
[Spring JPA] entity의 생성일, 수정일 어떤식으로 할까Spring JPA 2024. 9. 11. 10:49
ERD 설계 하고 entity 매핑을 하려고 한다 테이블에는 생성일, 수정일 칼럼이 있다 나는 이번 Solitour 프로젝트를 하면서 이 칼럼들을 자동으로 관리 할 수 있는 방법이 없을까? 라는 궁금증이 들었다 이런 궁금증이 들었던 이유는 다음과 같다일반적으로생성일은 create API 요청에 만들어지는데 해당 entity 객체를 생성할때 마다 LocalDateTime.now()로 생성자에서 설정한다 수정일은 보통 update API 요청 시 수정일을 setter를 통해 LocalDateTime.now()로 갱신 한다 이러한 반복적인 코드들을 줄일 수 있는 방법이 없을까? 라는 고민을 하였고 JPA에서 이를 어떻게 처리하는지 공부하게 되었다 방법은 아래와 같다 방법 설정 1 @EntityListene..
-
[Spring] 즉시(Eager) 로딩 과 지연(Lazy) 로딩Spring JPA 2024. 8. 11. 21:54
Spring jpa 에서 연관관계 매핑을 할때 설정하는 문제이다 JPA 에서 데이터를 조회 할때 eager loading(즉시 로딩), lazy loading(지연 로딩) 으로 하는 두가지 방식이 있다이 두개의 차이점은 한개의 테이블을 조회할때 그 테이블에 연관된 테이블까지 불러오냐 안 불러오냐의 차이점이다 여기서 즉시 로딩(eager)은 연관된 데이터까지 한 번에 불러오고지연 로딩(lazy)은 필요한 시점에 연관된 데이터를 불러온다 어떻게 설정을 하냐?@Entity@Setter@Getter@NoArgsConstructor@AllArgsConstructor@Table(name = "post")public class Post { @Id @GeneratedValue(strategy = Genera..
-
[Spring] DB 상태 테이블, Enum 관리 Converter 사용해보자Spring JPA 2024. 7. 4. 11:40
이 글은 프로젝트를 진행하면서 공부한 내용이다들어가기erd 테이블 예시이다 위와 같이 회원 Table 에서 user_status_id 는 값이 정해져 있다 (휴먼, 활성화, 삭제 등등)user_sex 도 정해져 있다 (남자, 여자)image_status 도 정해져 있다 (썸네일, 본문, 회원) ddl 문을 보면 다음과 같다 CREATE TABLE `user` (... `user_status_id` ENUM('휴먼', '활성화', '삭제') NOT NULL, `user_sex` ENUM('남자', '여자') NULL, ... );이와 같이 값이 정해져 있는 데이터들은 Spring에서 어떻게 해야할까?=> Enum Converter를 사용하면 된다 사용법 UserStatus enum 클래스import ..
-
[Spring] OSIV 란?Spring JPA 2024. 5. 24. 15:10
영속성 컨텍스트를 뷰까지 열어두는 기능뷰에서도 지연 로딩이 가능하도록 하는 것컨트롤러 계층에서도 데이터를 변경할 수 있다스프링에서는 defualt로 OSIV 값이 true로 설정 되어 있다영속성 컨텍스트 : 엔티티를 영구 저장하는 환경이라는 뜻, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 함 동작 방식요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스트를 생성한다서비스 계층에서 @Transactional으로 트랜잭션을 시작하게 되면 전에 생성한 영속성 컨텍스트를 찾아온다서비스 계층이 끝나고 반환하면 트랜잭션을 커밋하고 영속성 컨텍스트를 flush 한다 이때 트랜잭션은 끝나지만 영속성 컨텍스트는 끝내지 않는다컨트롤러와 뷰까지 영속성 컨텍스트가 유지되므..