연관관계란?

객체와 테이블인 두 도메인이 서로 논리적인 의미를 가지며 양쪽을 참조하는 관계이다.

 

그렇다면, 연관관계 매핑은 객체의 참조와 테이블의 외래 키를 매핑하는 것을 말한다.

 

 

연관관계의 다중성

1. 일대다(1:N, OneToMany)

2. 다대일(N:1, ManyToOne)

3. 일대일(1:1, OneToOne)

4. 다대다(N:N, ManyToMany)

 

 

그림을 통해 연관관계 이해와 FK 정하는 기준을 알아보려고 한다.

 

1. N : 1 (다대일의 관계)

- 게시판에 글을 유저는 1개 이상 작성이 가능하지만, 유저 1명이 글을 올릴 때는 1개씩 가능하기 때문에 게시판 대 유저는 N대 1이라고 할 수 있다. 

- user 테이블에 ssar이라는 유저가 올리는 게시글을 여러개 저장한다면, 원자성이 어긋난다.

- 그렇게 때문에 Board 테이블에 user의 정보를 입력한다.

=> 따라서 유저 한 명이 여러 개의 게시물을 올릴 수 있게 때문에 Board를 FK라고 지정한다.

 

위의 내용을 참고하며 N : N의 관계에서는....

2. N : N (다대다의 관계)

 

- 유저 한 명이 영화를 N개 볼 수 있고, 영화 1개가 여러 명의 유저가 볼 수 있기 때문에 N : N 관계이다.

- N : N 관계일 때는 새로운 중간 테이블을 생성한다.

- 중간테이블인 예매라는 테이블을 만든다.

- 유저와 예매의 관계는 유저 한 명이 예매를 N개 할 수 있지만, 하나의 예매는 1명의 유저가 가지고 있기 때문에 유저 대 예매는 1 : N의 관계이다.

- 영화와 예매 관계도 위의 언급한 방식과 같다.

- 그래서 중간 테이블이 N이고 이와 연관된 테이블은 1된다.

 

 

이런 내용을 바탕으로 유저와 유저가 서로 구독하는 관계를 설정해보자!

- 1명의 유저가 N명의 유저를 구독할 수 있듯이, 다른 1명의 유저도 똑같이 N명의 유저를 구독할 수 있기 때문에 N : N의 관계이다.

- 그래서 새로운 중간 테이블을 생성한다.

- 구독하는 유저와 구독받는 유저를 구분하여 저장하는 데, 위의 그림처럼 1 유저가 2 유저를 2번 구독할 경우, 중복이 발생하게 된다.

- 따라서, Uinque 제약조건을 적용하여 동일한 유저는 두 번 이상 저장하는 것을 방지해야 한다. (이는 데이터 무결성을 보호하고 데이터의 신뢰성을 유지하는 데 도움이 되기 때문이다.)

 


 

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(
	uniqueConstrains = {
   	    @UniqueConstraint(
            name = "subscribe_uk",
            columnNames = {"fromUserId", "toUserId"}
        )
    }
)
public class Subscribe{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @JoinColumn(name="fromUserId")
    @ManyToOne
    private USer fromUser;
    
    @JoinColumn(name = "toUserId")
    @ManyToOne
    private User toUser;
    
    private LocalDateTime createDate;
    
    @PrePersis
    public void createDate(){
    	this.createDate = LocalDateTime.now();
    }
}

 

  • @Entity : 테이블과의 매핑 -> @Entity가 붙은 클래스는 JPA가 관리하는 것 ____ (JPA : 데이터베이스 스키마를 자동으로 생성하는 기능을 지원)
  • @Table : 엔티티와 매핑할 테이블을 지정
  • uniqueConstraints(DDL) : DDL(데이터 정의어) 생성 시에 유니크 제약조건을 만든다. 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다.
  • @uniqueConstraint : 객체 관계 매핑(ORM)을 사용하는 기술에서 데이터베이스의 테이블에 대한 유니크 제약 조건을 정의할 때 사용  -> 두 개 이상 칼럼을 묶어 UNIQUE 설정할 때 사용된다. 

 

한 개의 칼럼에 UNIQUE를 설정

@Column(name="column", unique=true)
ing column;

@Column 애너테이션에 unique= true를 넣어 유니크를 설정하면 된다. 

 

 


 

 

결론적으로 

  1. FK는 Many를 가진 것이다.
  2. N : N의 관계는 중간 테이블이 생기는 데, 중간테이블이 N이 되고 연관 테이블은 1이 된다. 그렇기 때문에 중간 테이블이 FK가 된다.

 

+ Recent posts