본문 바로가기

JPA22

JPA - 값 타입의 비교 값 타입: 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야한다. int a = 10; int b = 10; a == b // true Address a = new Address(“서울시”) Address b = new Address(“서울시”) a == b // false 동일성(identity) 비교: 인스턴스의 참조 값을 비교, == 사용 동등성(equivalence) 비교: 인스턴스의 값을 비교, equals() 사용 값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야 한다. 값 타입의 equals() 메소드를 적절하게 재정의해주어야 한다. (주로 모든 필드 사용) equals 메서드를 오버라이드 하지 않았을 경우 Address address1 = new Address("city.. 2022. 5. 2.
JPA - 값 타입과 불변 객체 1. 값 타입과 불변 객체 왜 복잡하게 값 타입을 나눴을까? 값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이다. 따라서 값 타입은 단순하고 안전하게 다룰 수 있어야 한다. 개발자는 Entity에 대해서 신경을 많이 쓰지만 값에 대해서는 크게 신경쓰지 않는다. 그 이유는 값 타입이 안전하게 설계가 되있기 때문이다. 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. 부작용(side effect) 발생 임베디드 타입을 여러 엔티티에서 공유할 시 부작용 예) main{ Address address = new Address("city", "street", "1000"); Member member1 = new Member(); member.setUsername(.. 2022. 4. 12.
JPA - 기본값 타입과 임베디드 타입 1. 기본값 타입 이번내용은 JAVA의 데이터 타입에 대한 간단한 내용입니다. JPA의 데이터 타입 분류 JPA 최상위 데이터를 크게 2가지로 분류한다. 1. 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 2. 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 (기본적으로 공유가 되지않거나 되더라도 불변함으로 개발자가 안전하게 마음껏 사용할 수 있다.) • 자바 기본 타입(int, double) • 래퍼 클래스(Int.. 2022. 4. 12.
JPA - 영속성 전이(CASCADE)와 고아 객체 1. 영속성 전이(CASCADE) 영속성 전이는 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때 사용한다. ex) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장 ※ 참고로 영속성 전이(CASCADE)는 연관관계나, 즉시로딩(지연로딩)과 전혀 관계가 없다. ※ 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함 을 제공할 뿐이다. 영속성 전이: 저장 public class Parent{ ... @OneToMany(mappyBy = "parent", cascade = CascadeType.ALL) private List childList = new ArrayList(); public void addChild(child child){ childList.add(.. 2022. 4. 11.
JPA - 즉시 로딩과 지연 로딩 1. 지연 로딩 (LAZY) Member를 조회할 때 Team도 함께 조회해야 할까? 단순히 member 정보만 사용하는 비즈니스 로직 println(member.getName()); 지연 로딩 LAZY을 사용해서 프록시로 조회 @Entity public class Member { @ManyToOne(fetch = FetchType.LAZY) //** @JoinColumn(name = "TEAM_ID") private Team team; ... } 이렇게하면 Member는 DB에서 가져오고 Team은 프록시 객체로 가져온다 된다. 그리고 Team을 사용하는 시점에 DB에서 가져온다. ※ getTeam()에서는 Team을 가져오지 않고, Team의 필드나 메서드를 터치했을때 초기화된다. 2. 즉시 로딩 (.. 2022. 4. 11.