김찬진의 개발 블로그

JPA 데이터 타입 Collection Type 값 타입 중 Collection type 을 쓸 때 일대다 관계로 풀 수 밖에 없다 컬렉션에 값들이 들어갈텐데 이 여러 값들을 한번에 DB에 저장할 수 없기 때문이다 예를 들어 Member 엔티티가 좋아하는 음식을 담은 Set favoriteFoods 과거에 방문했던 주소들을 담은 List addressHistory 라는 컬렉션 타입을 갖는다고 가정한다면 다음과 같이 연관관계 매핑이 만들어질 것이다 코드로 보면 다음과 같이 작성할 수 있다 @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @ManyToOne // 엔티티 타입. @XXXTo..

JPA 데이터 타입 값타입은 왜 쓰는가? 엔티티는 서로 공유하는 것이 목표이다 그래서 엔티티 필드를 다른 엔티티 필드와 연관관계 매핑(@ManyToOne 등)을 하는 것이다 하지만 모든 엔티티 필드를 서로 공유한다고 하면 너무 복잡하지 않겠는가? 필드가 해당 엔티티에만 소속되어 다른 엔티티와는 연관(공유)되지 않는 값이 있으면 조금이라도 단순해질 수 있지 않을까? 그래서 값타입을 사용하는 것이다! [기본값 타입] 기본값 타입 : primitive type (기본타입) int, long, boolean 은 그냥 값 자체이다. 값은 그냥 값 그 자체이다 값 변경(공유)는 불가능하다 public static void main(String[] args) { int i1 = 111; int i2 = i1; i1 ..

지연로딩 Member 클래스의 team 필드를 fetch = FetchType.LAZY 로 설정하면 엔티티 객체 member 조회할 때 (1차 캐시에 엔티티 객체가 없다면) team 프록시 객체 생성해 1차 캐시에 저장하여 반환한다. 실제 엔티티 객체가 아니라 프록시 객체를 사용하므로 team 에 대한 SELECT 쿼리를 보내지 않는다 이후 실제로 엔티티 객체를 사용해야 할 때, 영속성 컨텍스트에게 프록시 객체의 target 필드를 초기화하도록 요청하고 team 에 대한 SELECT 쿼리를 보낸다 동시에 실제 엔티티 객체를 생성하여 1차 캐시에 저장하고 반환한다. 그래서 실제 엔티티 객체를 사용할 수 있게 된다 즉시로딩 Member 클래스의 team 필드를 fetch = FetchType.EAGER 로 ..
@Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; // getter, setter 생략 } @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany(mappedBy = "team") private List members = new..