목록JPA (15)
DevKim

[ 프록시 Proxy ] 즉시로딩과 지연로딩을 제대로 이해하기 위해선, 프록시에 대한 이해가 필요하다. 프록시 객체는 실제 클래스를 상속 받아서 만들어진 가짜 객체라고 생각하면 된다. 진짜 객체는 em.find( )로 불러오지만, 프록시 객체를 조회할 땐 em.getReference( )를 통해 불러온다. 프록시 객체는 실제 객체와 겉 모습은 같고, 실제 객체의 참조(target)을 보관하고 있다. 만약 여기서 프록시 객체의 getName()을 호출한다면, target에 있는 (진짜 객체) getName( )을 대신 호출해준다. Client가 getName( )을 요청하면 내부적으로 영속성 컨텍스트에게 진짜 멤버 객체를 가져오라고 요청한다. 영속성 컨텍스트에서 DB를 조회해서 실제 엔티티를 생성해주고, ..

관계형 DB는 상속관계가 없지만, 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하기 때문에 이것을 이용하여 객체의 상속과 구조와 관계를 매핑할 수 있다. [ JOINED 전략 ] @Getter @Setter @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn public abstract class Item { @Id @GeneratedValue @Column(name = "ITEM_ID") private Long id; private String name; private int price; } 조인 전략을 사용하기 위해 Inheritance를 설정해주었고, Movie만 임의로 저장해서 확인하니 알맞게 저장된..

[ 연관관계 매핑시 고려사항 ] 1. 다중성 1-1. DB와 매핑하기 위함이므로, DB의 관점에서 다대일,일대다..등을 보고 매핑해주면된다. @ManyToOne,@OneToMany.. 2. 단방향,양방향 2-1. 테이블 - 테이블은 FK 하나로 양쪽 join 가능해서 사실 방향이라는 개념이 없다. 2-2. 객체 - 객체는 한쪽만 참조하면 단방향, 양쪽 서로 참조하면 양방향이지만, 사실 양방향도 단방향이 2개인 것 이다. 3. 연관관계의 주인 3-1. 주인을 왜,언제 설정해야하는가? - 테이블은 FK 하나로 두 테이블이 연관관계를 맺을 수 있지만, 객체의 양방향은 참조가 2군데이므로 둘중에 FK를 관리할 곳을 지정해야한다. 3-2. 주인 설정 - 결론적으론 '다'의 위치에 있는 객체가 연관관계의 주인이 된..

01. [ 객체 설계를 테이블 설계에 맞춘 방식의 경우 ] 다음과 같이 연관관계 매핑을 하지않고, Member가 외래키 값을 그대로 들고 있는 경우엔 member에서 외래 키 식별자를 직접 다루게 된다. 이렇게 되면, member를 저장할 때 다음과 같이 team에서 id를 받아와서, 그 id를 가지고 teamid를 설정해주어야한다. 이러한 방법은 전혀 객체지향스럽지 않고.. 바로 getTeam( )을 해야 속이 시원할 것 같은 느낌이다. 더불어, 조회시에도 이슈가 있다. Team을 조회하기 위해선, member id로 원하는 member를 find하고, 찾은 member.getTeamId로 team의 id값 찾고..그 id값으로 다시 또 팀을 찾아줘야한다. 이렇게 되면 연관관계가 없으므로 계속 DB에 ..
1. 객체와 테이블 매핑: @Entity,@Table 2. 필드와 컬럼 매핑: @Column 3. 기본 키 매핑: @Id 이 세가지에 대해 정리해보려고한다. 프로젝트 할 때 기계적으로 사용했던 애들인데, 깊게 생각해볼 시간이 없었던 것 같다. [ 객체와 테이블 매핑 ] 1. @Entity - @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. * 주의 * - 기본 생성자 필수 - final,enum,interface,inner 클래스 사용 X * 속성 * (1) name => 헷갈리니까 웬만하면 기본값으로 그냥 클래스 이름을 그대로 사용하는게 좋지만, 만약 다른 패키지에 같은 클래스명이 있는데 그게 또 JPA에 매핑된 경우에, name을 지정하여 JPA가 구분할 수 있게 지정할 수 있다. 2. ..

[ 엔티티의 생명주기 ] 1. 비영속 (new/transient) - 비영속은 말 그대로, 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다. = 그냥 객체만 생성했을 때 - JPA와 관계 X 2. 영속 (managed) - 영속 상태가 되어 관리되어지는 상태를 이야기한다. em.persist( ) 3. 준영속 (detached) - 영속 상태였던 애를 , 영속성 컨텍스트에서 분리한 상태 => 분리한 후에 commit을 해도 update 쿼리가 나가지 않는다. em.detach( ) ****************************** 참고 ******************************** 준영속 상태로 만드는 방법은 직접 쓸 일은 없고 원리만 이해하면 된다! 1> 특정 엔티티만 준영속 상태..

[ Entity Manager & Factory ] 영속성 컨텍스트에 들어가기 전에, 엔티티 매니저 팩토리와 엔티티 매니저 동작과정을 간단하게 정리해보자 1.고객의 요청이 올때마다 팩토리가 EntityManager을 생성하고 2. EntityManager은 내부적으로 데이터 connection을 사용해서 DB를 사용하게된다. [ 영속성 컨텍스트란? ] "엔티티를 영구 저장하는 환경"이라는 뜻이다. -> DB에 저장하는게 아니라, entity를 영속성 context에 저장한다는 뜻 -> EntityManager.persist(entity); 영속성 컨텍스트는 논리적인 개념이기에 당연히 눈에 보이지 않는다. 엔티티매니저를 통해 영속성 컨텍스트에 접근한다. 풀어서 이해해보면, 엔티티 매니저가 생성될 때 그 안..