연관관계란?
객체와 테이블인 두 도메인이 서로 논리적인 의미를 가지며 양쪽을 참조하는 관계이다.
그렇다면, 연관관계 매핑은 객체의 참조와 테이블의 외래 키를 매핑하는 것을 말한다.
연관관계의 다중성
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를 넣어 유니크를 설정하면 된다.
결론적으로
- FK는 Many를 가진 것이다.
- N : N의 관계는 중간 테이블이 생기는 데, 중간테이블이 N이 되고 연관 테이블은 1이 된다. 그렇기 때문에 중간 테이블이 FK가 된다.
'WEB > spring' 카테고리의 다른 글
웹 페이지를 만들 때, 사진에서 엑박 생기는 이유와 UUIID 사용해서 이미지 이름 지정 (0) | 2023.12.14 |
---|---|
@AuthenticationPrincipal 애너테이션 방식 (0) | 2023.12.05 |
SecurityConfig 설정 (0) | 2023.12.02 |
AOP 관점지향 프로그래밍 - 전처리, 후처리 (0) | 2023.12.02 |
ResponseEntity 란? (0) | 2023.01.13 |