본문 바로가기

스프링 부트/JPA

(6)
[Spring Batch] JpaPagingItemReader + JpaItemWriter를 사용했 때겪었던 문제점 (2) (수정중) 다시한번 언급하지만, 이 글의 전제는 '애초에 이렇게 배치를 구현하면 안된다'로, JpaPagingItemReader, JpaItemWriter를 가지고 이것 저것 실험하면서 경험한 내용을 정리한 글이다. 앞 글에서 아직 다 다루지 못한 문제가 남아있다. 바로 "마지막 청크는 5개 쿠폰에 대한 history는 정상적으로 한개씩만 쌓이고 있다" 라는 것이다. (어느정도 감이 왔을 수도 있지만...) 이에 대한 원인은 다른 예제로 설명해보려 한다. JpaItemWriter에서 Dirty Checking으로 엔티티 변경사항을 DB에 반영할 때 문제점 앞 글에서 발생한 자식엔티티 중복 저장에 대한 문제는 결국 reader와 writer에서 서로 다른 entityManager를 사용하고 있었기 때문이었..
JPA Auditing과 제대로 알아야 할 @PreUpdate JPA Auditing? 서비스를 운영하다보면 데이터가 변경되었을 때 누가 값을 변경했고, 언제 변경했는지를 남겨야할 때가 있다. Spring Data Jpa 에서는 이에 대해 어노테이션으로 편리하게 Audit(감시) 기능을 제공해주고 있다. 엔티티를 영속성 컨텍스트에 저장하거나 조회를 수행한 후 수정하게 되면 이에 대한 변경 시간 등을 자동으로 매핑하여 데이터베이스에 반영해주게 된다. 사용 방법 1. @EnableJpaAuditing 추가 해당 어노테이션을 main 메서드가 있는 애플리케이션 클래스에 추가한다. @EnableJpaAuditing @SpringBootApplication public class NoltoApplication { public static void main(String[] a..
[JPA] 기본 키 생성 전략과 각 전략의 차이 - GenerationType JPA에서 Entity 객체를 정의할 때 @Id 속성을 함께 정의하여야 한다. 이 Id를 정의할 때에는 직접 할당하는 방법과 자동 생성하는 방법이 있다. 직접 할당하는 방법 @Id 어노테이션만으로 id를 지정한다. 자동 생성 @Id와 @GeneratedValue를 같이 사용한다. GenerationType 옵션으로 전략을 지정한다. GenerationType 종류 TABLE 특정 벤더에 의존적이지 않다. 시퀀스 테이블을 만들어서 데이터베이스 시퀀스를 흉내낼 Id를 할당한다. 이 전략을 사용할 시, jpa ddl auto 설정이 되어 있지 않았다면 해당 시퀀스 테이블 생성이 선행이 되어야한다. @TableGenerator(테이블 생성 어노테이션)과 함께 사용할 수 있다. 만약 jpa ddl auto 설정이..
[JPA 프로그래밍 기본기 다지기] JPA 내부구조 노트 2021-05-29글 영속성 컨텍스트 엔티티를 영구히 저장하는 환경 영속성 = 영구히 저장하는 속성 EntityManager.persist(entity) 영속성 컨텍스트는 논리적인 개념 (눈에 보이지 않음) 엔티티 매니저를 통해 영속성 컨텍스트에 접근 스프링 프레임 워크에서의 영속성 컨텍스트 엔티티 매니저와 영속성 컨텍스트가 N:1 같은 트랜잭션이면 같은 영속성 컨텍스트에 접근 엔티티 매니저 팩토리와 엔티티 매니저 요청이 들어와 이걸 처리하는 스레드가 하나 생성될 때마다 새로운 엔티티 매니저를 만든다. 엔티티 매니저에서 내부적으로 데이터베이스 커넥션 풀에서 JPA를 사용 엔티티의 생명 주기 비영속 (New) 객체를 생성한 상태 Team team = new Team(); team.setName("teamA..
[JPA] Cascade 간단 노트 2021-07-08글 JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다. 부모 엔티티를 영속 상태로 만들 때 연관된 자식도 한번에 영속 상태로 만들 수 있다. Cascade란? 영속성 전이 연관관계에 있는 엔티티에 작업이 이루어져 상태 변화가 이뤄질 시 동일한 작업이 연결된 엔티티에 전이되는 옵션 일반적으로 부모 엔티티에서 cascade 옵션을 걸어줌 자식에서 부모로 옵션을 거는 것은 의미가 없다고함 즉시로딩, 지연로딩, 연관관계 세팅과 관계 없음 부모, 자식 엔티티와 연관관계 주인(외래키 관리자)는 다름 Entity의 상태 Transient : JPA가 모르는 상태 (단순 객체 생성) Persistent : JPA가 관리중인 상태 (1차 캐시, Dirty Checking, Writ..
[JPA 프로그래밍 기본기 다지기] 양방향 매핑 노트 2021-05-29글 양방향 매핑 반대방향으로도 그래프 조회가 가능해야함 연관 관계의 주인과 왜 mappedBy를 해주는 건지? 객체는 서로를 포함하고 있어야 함 (2개가 필요) 객체와 테이블이 관계를 맺는 차이 객체 연관관계 회원 -> 팀 연관 관계 1개 (단방향) 팀 -> 회원 연관관계 1개 (단방향) 테이블 연관관계 회원 팀의 연관관계 1개 (양방향) 이 차이를 어떻게 극복할거냐?? 객체의 양방향 관계 객체는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개이다. 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 함 테이블의 양방향 관계 테이블은 외래키 하나로 두테이블의 연관 관계를 관리 둘 중 하나로 외래키를 관리해야 한다 객체는 두 곳에서 연관관계에 있는 객체를 다루고 있음 그러..