[SPRING:이론] 8 : Entity 연관 관계 - 1

김승수·2024년 5월 28일
0

SPRING

목록 보기
9/27

⏰ 2024. 05. 28 화

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. Entity 연관 관계
  2. 1:1 관계

Entity 연관 관계

⚡ 들어가지 전에... DB에서의 연관 관계

  • 관계형 데이터베이스에서는 테이블 간의 외래키(Foreign key)로 연관 관계를 맺고, JOIN 문을 통해 테이블을 조회할 수 있다.

  • JOIN 문을 통해 어느 테이블에서든 양쪽 테이블의 데이터를 조회할 수 있다.

  • 결론 => 관계형 데이터베이스 테이블 간의 연관 관계에는 방향의 개념이 없다.

  • 그러면 스프링부트 JPA의 Entity를 통해 테이블을 표현하기 때문에 데이터베이스의 테이블 간의 연관 관계를 Entity의 연관 관계로 표현해야 한다.

Entity 연관 관계

  • DB 테이블에서는 JOIN을 통해 테이블 간의 정보를 바로 조회 가능하지만, Entity 입장에서 다른 Entity의 데이터를 조회하려면 다른 Entity의 정보를 가지고 있어야 한다.
@Entity
@Table
public class Entity1 {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    private Entity1 entity1;		// #
}



@Entity
@Table
public class Entity2 {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    private Entity2 entity2;		// #
}
  • #: 이 처럼 각각의 Entity 안에 다른 Entity를 참조함으로 써 Entity 간의 연관 관계를 맺을 수 있다.
  • 위의 예시에서는 양쪽 Entity에서 서로를 참조하고 있는데, 이 경우를 양방향 관계라고 하고, 한쪽에서만 참조하고 있는 경우를 단방향 관계라고 한다.
  • 단방향 관계에서는 한쪽에만 참조를 했기 때문에, 참조 하지 않은 Entity는 다른 Entity를 조회할 수 없다.
  • DB의 테이블 간의 연관 관계는 방향성이 없지만, Entity 간의 연관 관계는 방향성이 존재한다.

1:1 관계

1:1 관계(@OneToOne)

1:1 단방향 관계

⚡ 외래키 주인 정하기

  • 일반적으로 외래키 주인은 다(N) 관계인 Entity 이지만, 1:1 관계에서는 외래 키 주인을 직접 지정해야 한다.
  • 외래키 주인만이 외래키를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능하다.
  • @JoinColumn() : 외래키 주인을 설정하는 애너테이션, 속성(컬럼명, null여부, unique 여부 등)
@Entity
@Table(name = "entity1")
public class Entity1 {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToOne
    @JoinColumn(name = "entity2_id")
    private Entity2 entity2;
}
@Entity
@Table(name = "entity2")
public class Entity2 {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	private String name;
}
  • Entity1이 외래키 주인이고 단방향(Entity1 -> Entity2)인 1:1 관계

1:1 양방향 관계

  • 양방향 관계에서 외래키의 주인이 아닌 다른 Entity에서 외래키의 주인을 mappedBy 옵션을 사용한다.
  • mappedBy의 속성 값은 외래키의 주인인 상대 Entity의 @JoinColumn()으로 설정된 필드명을 넣는다.

@JoinColumn(), mappedBy 둘 다 생략 가능하지만, 의도하지 않은 중간 테이블이 생성되는 경우가 있어 생략하지 않는 편이 좋다.

@Entity
@Table(name = "entity1")
public class Entity1 {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToOne
    @JoinColumn(name = "entity2_id")
    private Entity2 entity2;
}

    
@Entity
@Table(name = "entity2")
public class Entity2 {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	private String name;
    
	@OneToOne(mappedBy = "entity2")
	private Entity1 entity1;
}
    
  • Entity1이 외래키 주인이고 양방향(Entity1 <-> Entity2)인 1:1 관계

📑 다음 포스팅 글에서 이어집니다.

profile
개발하는 미어캣

0개의 댓글