JPA 4

연관관계에 관한 다양한 생각들(+지양해야할것)

ManyToOne 현재 인사 내역 하나당 여러명의 사람이 평가할 수 있게끔하는 서비스를 개발하고 싶다. 즉 1:N의 상황으로 객체 연관관계를 구성해야한다. 그냥 개발하지말고 why를 물으며 개발하기 위해 포스팅해보자 객체의 연관 관계 객체는 객체를 참조하여 연관된 객체를 찾는다. 초반에 가장 헷갈렸던 개념인것 같다.외래키가 왜 없지?하던 시절이 있었다. JPA에서는 상대방의 PK를 멤버 변수로 갖지 않고 엔티티 객체 자체를 통째로 참조한다 단방향 vs 양방향 그리고 다중성 단방향 : 두 엔티티가 관계를 맺을 때, 한쪽의 엔티티만 참조하는 것을 의미한다. 양방향 : 양쪽이 서로 참조하는 것을 의미한다. 데이터 모델링에서는 자동으로 양방향 관계 매핑이 되지만, 객체지향 모델링에서는 구현하고자 하는 서비스에 ..

JPA 2022.11.17

[JPA] 값 타입과 불변 객체

값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이다. 개발자는 Entity에 대해서 신경을 많이 쓰지만 값에 대해서는 크게 신경쓰지 않는다. 그 이유는 값 타입이 안전하게 설계가 되있기 때문이다. 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. 부작용(side effect) 발생 임베디드 타입을 여러 엔티티에서 공유할 시 main{ Address address = new Address("city", "street", "1000"); Member member1 = new Member(); member.setUsername("member1"); member.setHomeAddress(address); em.persist(member1); Member me..

JPA 2022.08.02

[JPA] 지연 로딩(Lazy Loading)

글을 위해 알아야 할 사항 - 프록시 지연 로딩 @OneToOne(fetch = FetchType.LAZY) //Member 엔티티 안의 필드 Team team FetchType.Lazy로 설정한다는 것이은 Team 객체를 프록시로 부른다고 하는 것이다. 이러한 것을 지연로딩이라고 한다. 프록시의 성질로 Member Entity를 부를 때 Team의 구구절절한 데이터를 부르지 않고 껍데기만 가지고 있다가 실제 Team을 호출하는 시점에 실제 값을 DB에서 가져오게 된다. 즉시 로딩 @OneToOne(fetch = FetchType.Eager) //Member 엔티티 안의 필드 Team team 기존의 방식처럼 Member 부를 때 Team안의 데이터까지 다 가지고 오는 것 한마디로 프록시가 적용되지 않은..

JPA 2022.07.29

[JPA] 프록시

글을 이해하기 위한 지식 - 영속성 컨텍스트 실제로 잘 안 쓰이기는 개념이기는 하지만 나중에 지연 로딩을 위해 알아본다. 예를 들어 Member Entity안에 Name, Team 필드가 있는데 Member의 Name을 조회할 때 굳이 Team도 함께 조회해야 할까? 즉 member객체를 전체 가져오고 그 안에서 member.getTeam()을 꼭 해야 할까? 아니다 꼭 다 가져올 필요는 없다 이걸 프록시로 해결한다. 프록시 기초 데이터베이스 조회를 미루는 가짜 엔티티 객체 em.getReference를 사용하면 호출한 시점에는 쿼리가 안 나가고(member 객체 전체를 불러오지 않고) 사용되는 시점(em.getUserName)에 쿼리가 나간다. 실제 클래스를 상속받아서 만들어지며 프락시 객체는 실제 객..

JPA 2022.07.28
728x90