JPA - 1대1 단방향 연결

Chang Hyeon Kim·2024년 3월 14일

인터넷 쇼핑의 고객(Member)과 장바구니(Cart)를 가정해 보자.
고객 1명은 1개의 장바구니를 가지며, 장바구니 입장에서도 1개의 장바구니는 1명의 고객과 대응된다. 때문에 1대1 관계이다.
여기서는 Cart가 Member를 조회하는 단방향 연결만을 다룬다.

아래는 Cart Class에 대한 코드이다.
Entity는 id와 member 객체를 갖지만,
DB에서는 id와 member_id(foreign key - int 타입)를 갖는다.

@Entity
public class Cart {
    @Id
    @Column(name="cart_id")
    private Long id;
    
    @OneToOne
    @JoinColumn(name="member_id")
    private Member member;

    @Override
    public String toString() {
        return "Cart{" +
                "id=" + id +
                ", member=" + member +
                '}';
    }
    ... Getter(),Setter() 생략
}

아래는 Member Class에 대한 코드이다.
Entity는 id,password,name,email을 갖고,
DB에서도 동일한 Attribute를 갖는다.

@Entity
public class Member {
    @Id
    private Long id;
    private String password;
    private String name;
    private String email;

    @Override
    public String toString() {
        return "Member{" +
                "id=" + id +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
    ... Getter(),Setter() 생략
}
  • @Entity가 붙은 Class의 필드에는 기본형(int,String,char 등등)을 제외한 참조형은 올 수 없다.
  • 그러나 @OneToOne과 같이 관계를 맵핑하는 에노테이션이 있다면, 참조형이 올 수 있다.
  • @OneToOne 붙어있는 객체(참조형)의 필드 값 중 하나를 Foreign Key(FK)로 가져온다.
  • 이 때 객체에 @Id 가 붙은 필드값(기본형)을 가져와 Fk로 사용한다.
  • @Id 에너테이션은 클래스에 한 번만 사용 가능하다.
  • DB Table의 Attribute는 @Id가 붙은 값을 갖는다. (아래 Table 참고)
  • Attribute이름은 [ @OneToOne 변수 이름_@Id 변수 이름 ]으로 자동 생성된다.
  • Entity는 Table과 다르게 기본형 값(@Id)이 아닌, 객체를 갖는다.
cart_idmember_id
11
  • @JoinColumn이 붙은 필드값이 FK임을 개발자에게 알리며 name, nullable, unique 등등 다양한 설정을 할 수 있다.
  • @JoinClumn에서 nullalbe을 설정하지 않으면 default로 true가 된다. 따라서 Cart를 중심으로 outer join이 된다.
  • @JoinClumn에서 nullalbe = false 로 설정하면 inner join이 된다.
  • Cart가 member_id를 참조하지만(@JoinColumn), Entity 입장에서 Cart는 member를 Set 해야 한다.
        cart.setMember(member);
  • toString()을 할 경우, Cart와 Member가 서로의 toString()을 호출하여 무한루프에 빠지는 경우를 주의하자
profile
생각을 구현 하자

0개의 댓글