BackEnd/JPA 11

[JPA] 영속성 전이 - CASCADE & 고아 객체

이번에는 영속성 전이에 대해서 보겠습니다. cascade 라는 옵션으로 설정을 하게 될텐데, 먼저 "영속성 전이" 에 대한 개념부터 짚고 넘어가겠습니다. 영속성 전이라는 개념이 왜 필요한지에 대해서 이해를 하면 쉽습니다. JPA는 엔티티를 DB에 저장할 때 (flush) 영속성 컨텍스트에 엔티티가 올라가 있는 상태여야 된다는 것은 이제 알고있는 사실입니다. 그렇다면 부모 엔티티가 있고 자식 엔티티가 있다고 가정할 때, DB에 저장하고 싶으면 이들 모두가 영속 상태여야 하죠. 이런 경우에 영속성이 전이가 된다면, 다르게 표현해서 부모를 영속 상태로 만들 때 자식까지 영속 상태로 만들 수 있다면 더 편하겠죠. @Entity public class Parent { ... @OneToMany(mappedBy="..

BackEnd/JPA 2022.06.05

[JPA] 프록시(Proxy) - 즉시 로딩 & 지연 로딩

이번에는 즉시 로딩과 지연 로딩에 대해서 이야기해보겠습니다. JPA를 처음보면 모든게 낯선 개념이지만 이 지점부터는 점점 생각할게 많아지는 영역이라고 생각합니다. 최적화와 관련이 있고 N+1 문제 등 이슈와 관련이 있는 내용입니다. 물론 나중에 작성할 내용이지만 관련이 있다는 생각을 하고, 이 주제에 대해 공부를 시작하면 도움이 된다고 생각합니다. 즉시 로딩(Eager Loading) 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다. 지연 로딩(Lazy Loading) 연관된 엔티티를 실제 사용할 때 조회한다. 간단한 특징이자 정의입니다. 이름 그래도 동작하기 때문에 사실 정의라고 할 것이 없습니다. 필요할때 조회해오느냐 아니면 먼저 조회해서 가지고 있느냐 의 차이입니다. 먼저 즉시 로딩을 보겠습니다...

BackEnd/JPA 2022.06.03

[JPA] 프록시(Proxy) 기초 (2)

저번 글에 이어서 프록시에 대해서 더 알아보겠습니다. JPA에서 식별자로 엔티티를 조회할 때는 EntityManager.find() 를 사용합니다. 그런데 이렇게 조회하면 조회한 엔티티를 사용하든 사용하지 않든 데이터베이스를 조회하게 됩니다. 그런데 저번에 봤듯이 항상 연관된 객체들이 모두 필요한 것은 아니죠. EntityManager.getReference() 를 사용하면 JPA 는 데이터베이스를 조회하지 않고 실제 엔티티 객체도 생성하지 않습니다. 바로 프록시 객체를 반환하죠. 위의 그림처럼 프록시 객체를 리턴해줍니다. 본격적으로 프록시 객체가 어떤건지 알아보겠습니다. 전에 작성한 글에서 프록시 서버, 리버스 프록시 와 같은 이야기도 했는데요, 여기서 다룰 프록시는 프록시 패턴에 관련되어 있습니다. ..

BackEnd/JPA 2022.05.18

[JPA] 프록시(Proxy) 기초 (1)

연관관계를 마무리하고 프록시로 넘어가려고 합니다. 상속이나 고급매핑 등을 더 다루려고 했으나, 제 경험상으로는 JPA를 사용하면서 연관관계를 너무 복잡하게 맺으면 유지보수나 개발 측면에서 어려움이 있었습니다. OOP를 염두해두고 개발을 하다보면 안그래도 객체간의 관계에 집중을 하게되고, 어떻게 캡슐화를 시킬지 은닉할지 메시지를 주고받게 할지 많은 고민을 하게됩니다. 그런데 연관관계가 너무 복잡하면 OOP의 난이도도 너무 많이 올라간다고 생각합니다. 적당한 선에서 코드 품질을 유지하고, 꼭 필요한 매핑이 있다면 저도 그때그때 찾아가면서 개발을 하는 편입니다. 그러면 이번부터는 프록시에 대해서 알아보겠습니다. Proxy proxy 는 사전적 의미로 다른 사람을 대신 할 권한이 있는 대리인, 다른 사람을 위해..

BackEnd/JPA 2022.05.17

[JPA] 양방향 연관관계 & 연관관계의 주인 (2)

이번에는 양방향 연관관계에서의 저장과 편의메소드를 다뤄보겠습니다. 왜 이 주제를 따로 다뤄야 하는지는 저번에 이야기 했었던 연관관계의 주인과 연관이 있습니다. 연관관계의 주인이 아닌 쪽은 읽기만 할 수 있다고 적었었는데요, 그 말은 연관관계의 주인 쪽에서 저장을 할 수 있다는 말과 같습니다. public void testSaveNonOwner() { Member memebr1 = new Member("member1", "회원 1"); em.persist(member1); Member memebr2 = new Member("member2", "회원 2"); em.persist(member2); Team team1 = new Team("team1", "팀 1"); team1.getMembers().add(m..

BackEnd/JPA 2022.05.14

[JPA] 양방향 연관관계 & 연관관계의 주인 (1)

이번에는 양방향 연관관계와 연관관계의 주인에 대해서 작성해보겠습니다. 기본(3) 으로 넣을까하다가 그렇기에는 중요한 개념인 것 같아서 따로 뺐습니다. 앞에 작성했던 글에서는 모두 단방향 연관관계만 다루었습니다. 양방향 연관관계부터 시작해보겠습니다. 양방향 연관관계 DB의 테이블에서는 단방향이라는게 없었습니다. 외래 키를 통해서 항상 양쪽 모두에게서 접근이 가능했죠. 하지만 객체간의 관계에서는 어떻게 해야할까요? 위의 예시에서 먼저 생각할 점은 다대일 관계라는 것 입니다. 다시 코드를 통해서 보겠습니다. 먼저 Member 의 경우에는 이전의 예시와 다를게 없어보입니다. @Entity public class Member { @Id @Column(name="MEMBER_ID") private String id..

BackEnd/JPA 2022.05.09

[JPA] 연관관계 매핑 : 기본 (2)

지난 글에 이어서 연관관계 매핑 기본이라고 생각되는 부분을 이어서 작성하겠습니다. 이번에는 연관관계를 매핑한 엔티티를 어떻게 저장,수정하는지 알아보려고 합니다. public void save() { Team team1 = new Team("team1", "팀 1"); em.persist(team1); Member member1 = new Member("member1", "회원 1"); member1.setTeam(team1); em.persist(member1); Member member2 = new Member("member2", "회원 2"); member2.setTeam(team1); em.persist(member2); } 위의 코드를 보겠습니다. 코드를 보면 두개의 Member 엔티티에 Team..

BackEnd/JPA 2022.05.08

[JPA] 연관관계 매핑 : 기본 (1)

JPA 에서 첫번째로 넘어야 할 산이라고 생각되는 연관관계 매핑입니다. 연관관계 매핑은 단순히 방향을 정하는 것과 다중성을 생각하는 것이 아니라 어플리케이션의 설계와 관련이 있어서 더 어렵기도 하고 중요하다고 생각이 드는 지점입니다. 그 전에 패러다임의 불일치라는 말을 많이 사용했는데, 그 전까지 이해가 잘 안되었다면 연관관계 매핑을 공부하면서 왜 패러다임의 불일치라는 말이 사용되는지 이해하게 될거라 생각합니다. 먼저, RDB 의 경우, 테이블끼리의 외래키로 매핑을 하는 형태입니다. JPA는 이걸 객체의 참조로 해결해야 하기 때문에 패러다임의 불일치가 생기죠. 이 그림을 보면 알 수 있듯이, RDB의 테이블은 외래키를 중심으로 양방향으로 참조가 가능합니다. 하지만 객체의 경우는 다릅니다. 참조하고자 하는..

BackEnd/JPA 2022.05.08

[JPA] 영속성 컨텍스트의 특징

저번 게시물에서 영속성 관리에 대해 이야기 하면서 마지막에 특징이자, 장점을 간단히 보고 넘어갔습니다. 이번에는 각각을 좀 더 자세히 알아보겠습니다. * 1차 캐시 영속성 컨텍스트는 내부에 캐시를 가지고 있는데, 이것을 1차 캐시라고 합니다. 영속 상태의 엔티티는 @Id 로 매핑한 식별자를 키 값으로 모두 이곳에 저장이 됩니다. Member member = new Memner(); member.setId("member1"); member.setUsername("name1"); em.persist(member); 위의 코드를 실행하면 아래의 그림처럼 1차 캐시에 Member 엔티티를 저장합니다. 앞에서 이야기가 나왔던 flush 가 일어나지 않았으므로 실제 데이터베이스에는 저장되지 않은 상태입니다. 1차 ..

BackEnd/JPA 2022.05.04

[JPA] 영속성 관리

이번에는 영속성 관리에 대한 이야기를 해보겠습니다. 영속성이라는 것은 영어로 표현했을 시, Persistence 입니다. JPA 가 Java Persistence API 인 것을 보면 이 개념이 중요하다는 것을 알 수 있습니다. 영속성 컨텍스트 엔티티를 영구 저장하는 환경. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관, 관리한다. 영속성 컨텍스트를 개발을 하면서 직접 볼 일은 없다고 생각됩니다. 엔티티 매니저를 통해서 접근하고 관리할 수 있지만, Spring Data JPA 를 사용한다면 이것마저도 개발자가 크게 신경쓸 일이 없습니다. 하지만 엔티티의 생명주기와 1차 캐시, 변경 감지, 지연 로딩 등 여기서 부터 출발하는 개념이 상당하고, JPA 를 이해하..

BackEnd/JPA 2022.05.03