01. 값 타입의 비교 값 타입 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 한다. 변수 a와 변수 b의 값이 같으므로 true가 나온다. address1과 address2의 값은 같지만 참조가 다르므로 false가 나온다. public class ValueMain { public static void main(String[] args) { int a = 10; int b = 10; System.out.println("a == b : " + (a == b)); Address address1 = new Address("city", "street", "100"); Address address2 = new Address("city", "street", "100"); System.out.printl..
01. 값 타입 공유 참조 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. side effect가 발생할 수 있다. 예시 코드는 아래와 같다. member1과 member2에 주소값을 넣었다. try { Address address = new Address("city", "street", "100"); Member member1 = new Member(); member1.setUsername("member1"); member1.setHomeAddress(address); em.persist(member1); Member member2 = new Member(); member2.setUsername("member2"); member2.setHomeAddress(addr..
01. 임베디드 타입 임베디드 타입 새로운 값 타입을 직접 정의할 수 있다. 주로 기본 값 타입을 모아서 만들어 복합 값 타입이라고도 한다. 회원 엔티티 회원 엔티티는 다음과 같이 이름, 근무 시작일, 근무 종료일, 도시, 번지, 우편번호를 가진다. 근무 시작일, 근무 종료일이 비슷한 속성이고, 도시, 번지, 우편번호가 비슷한 속성이므로 회원 엔티티는 다음과 같이 이름, 근무 기간, 집 주소를 가질 수 있다. 02. 임베디드 타입 사용법 임베디드 타입 사용법 값 타입을 정의하는 곳에 @Embeddable 를 작성한다. 값 타입을 사용하는 곳에 @Embedded 를 작성한다. 기본 생성자는 필수로 있어야 한다. 예시 코드 Member 클래스가 다음과 같이 정의되었을 때, startDate와 endDate를..
JPA에서 데이터 타입의 분류는 엔티티 타입, 값 타입(기본값 타입, 임베디드 타입, 컬렉션 값 타입)으로 나타낼 수 있다. 01. JPA의 데이터 타입 분류 엔티티 타입 엔티티 타입이란 @Entity로 정의하는 객체이다. 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 예를 들어, 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능하다. 값 타입 값 타입이란 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체이다. 식별자가 없고 값만 있으므로 변경 시 추적이 불가능하다. 예를 들어, 숫자 100을 200으로 변경하면 완전히 다른 값을 대체된다. 추적 가능하다는 말이 중요하다. 02. 값 타입 분류 기본값 타입 자바가 기본적으로 제공하는 것들이다. 자바..
01. 영속성 전이: CASCADE 사용 목적 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. 예시로 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하고 싶을 때가 있다. 영속성 전이(CASCADE)를 사용하지 않는다면? 위의 Parent와 Child에 대한 예시로 코드를 작성해보겠다. Child와 Parent는 다대일 양방향 연관관계를 갖는다. 다음은 Child 클래스 코드이다. @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name = "parent_id") private Parent parent; //..
요구사항 BaseEnetity 클래스의 createdAt 필드와 lastModifiedAt 필드를 자동화 하는 것! 모든 테이블에 공통으로 들어가는 필드인 createdAt과 lastModifiedAt 필드를 다음과 같이 BaseEntity에 작성했다. @Getter @MappedSuperclass public abstract class BaseEntity { @Column(name = "created_at") private LocalDateTime createdAt; @Column(name = "last_modified_at") private LocalDateTime lastModifiedAt; } 그리고 이 필드들이 다른 테이블에 들어갈 수 있게 아래와 같이 작성했다. // 상위 어노테이션 생략 (e..
01. 지연 로딩 Member를 조회할 때 Team도 함께 조회해야 할까? 다음 그림과 같은 연관관계를 맺고 있는 엔티티가 있다고 할 때, 단순히 member 정보만 사용하는 비즈니스 로직은 println(member.getName()); 이다. 이 경우, Team도 조인해서 가져오면 손실이 있다. JPA는 지연 로딩이라는 것을 제공한다. 지연 로딩을 이용하면 이 문제를 해결할 수 있다. 지연 로딩 LAZY를 이용해서 프록시로 조회하는 예시 Member 클래스의 @ManyToOne에 속성 (fetch = FetchType.LAZY)을 추가한다. @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; 해당 속성을..
01. 프록시 개요 Member를 조회할 때 Team도 함께 조회해야 할까? Member와 Team은 다음과 같은 관계를 맺고 있다. 회원과 팀을 함께 출력하는 경우, 코드는 다음과 같다. public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름: " + member.getUsername()); System.out.println("소속팀: " + team.getName()); } 회원만 출력하는 경우, 코드는 다음과 같다. public void printUser(String memberId)..