본문 바로가기

JPA

(14)
[JPA] 영속성 전이 (CASCADE), 고아객체 제거 (ORPHAN) 영속성 전이 (CASCADE) JPA는 CASCADE 옵션을 제공함으로써 부모 객체와 자식 객체의 영속성을 함께 관리할 수 있다. 즉 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. @Entity @Getter @Setter @NoArgsConstructor public class Parent { @Id @GaneratedValue @Column(name = "PARENT_ID") private Long id; @OneToMany(mappedBy = "parent") private List children = new ArrayList(); } @Entity @Getter @Setter @NoArgsConstructor public class Child { @Id @GeneratedValue..
[JPA] 프록시, 즉시로딩, 지연로딩 프록시란? 아래와 같은 상황을 가정해보고 프록시가 무엇인지 어떤 상황에서 사용되는지 한번 알아보자 회원 엔티티와 팀 엔티티가 존재하고 두 엔티티는 다대일 단방향 매핑 되어있다. @Entity @Getter @Setter @NoArgsConstructor public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; } @Entity @Getter @Setter @NoArgsConstructor public class Team { @Id @GeneratedValue..
[JPA] 연관관계 매핑 단방향 연관관계 @Entity @Getter @Setter @NoArgsConstructor public class Member { @Id @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; public void setTeam(Team team) { this.team = team; } } @Entity @Getter @Setter @NoArgsConstructor public class Team { @Id @Column(name = "TEAM_ID") private Long id; private String name; } 데이..
[JPA] 영속성 컨텍스트란(Persistence Context)? 영속성 컨텍스트란? 영속성 컨텍스트(Persistence Context)란 해석하면 엔티티를 영구 저장하는 환경이라는 뜻으로 엔티티 매니저를 사용해 데이터를 저장하거나 조회하면 엔티티 매니저는 영속성 컨테스트에 엔티티를 보관하고 관리한다. em.persist(member); 위 코드에서 persist() 메소드는 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장한다. 조회 기능 메소드인 find()도 마찬가지이다. 동일한 memberId로 Member 객체를 두번 조회할 때 sql문으로 조회했을때는 select 쿼리가 두번 나갔지만 JPA의 find() 메소드를 이용하면 첫 번째 조회때 select 쿼리를 보내 데이터를 조회한 후 영속성 컨텍스트에 저장해놨다가 두 번째 조회부터는 데이터베이스..
[JPA] JPA 란? JPA 란 무엇인가? JPA 란 Java Persistence API의 줄임말로 자바 진영의 ORM 기술 표준이다. 여기서 ORM 이란 Object-Relational Mapping의 줄임말로 객체와 관계형 데이터베이스를 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다. 즉 사용하는 언어가 다른 객체와 데이터베이스 사이에서 중간 매개체 역할을 해주는 고마운 친구이다. 덕분에 개발자는 데이터 중심인 관계형 데이터베이스를 사용해도 객체지향 애플리케이션 개발에 집중할 수 있다. JPA 를 사용하는 이유 - 생산성 JPA를 사용하기 전에는 지루하고 반복적인 CRUD를 구현할때도 개발자가 직접 sql문을 짜서 개발을 해야 했다. 하지만 JPA를 사용하면 아래 코드와 같이 자바 컬렉션에 객체를 저장하듯이 ..
[JPA] LazyInitializationException 개인 프로젝트로 e-commerce 서비스를 개발하던 중 LazyInitializationException 에러가 발생하였다. LazyInitializationException 발생 이유 서비스단에서 @Transactional을 선언한 method가 종료되면 트랜잭션을 커밋한 후 트랜잭션과 영속성 컨텍스트가 종료된다. 영속성 컨텍스트가 종료되었으므로 조회한 엔티티가 준영속 상태가 되었고 그렇기 때문에 더이상 영속성 컨텍스트의 특징 중 하나인 지연로딩을 사용할 수 없다. 이때 컨트롤러단에서 FetchType.LAZY로 매핑된 테이블을 조회해오면 LazyInitializationException이 발생한다. LazyInitializationException 해결 과정 영속성 컨텍스트가 닫히기 전 서비스단에서..