2024. 3. 26. 00:12ㆍ[Way to PM] 백 엔드
Over View
해당 글은 백엔드 프로젝트를 위해 JPA로 비즈니스 로직을 구현하던 중 배운 관계형 DB의 연관 관계 매핑에 대해 다룹니다.
연관 관계란 두 개 이상의 사물, 사건, 개체들 간에 서로 영향을 미치거나 서로 관련되어 있는 것을 의미합니다. 객체 지향 프로그래밍에서의 연관 관계는 객체 간의 참조가 될 것이고, 관계형 데이터베이스에서의 연관 관계는 테이블 조인이 될 것입니다.
관계형 DB는 조인을 통해 두개 이상의 테이블를 엮을 수 있고, 이를 자바 객체로 표현하기 위해 JPA의 어노테이션을 사용합니다.(@OneToOne, @ManyToOne)
사실 데이터베이스에는 방향이라는 개념이 없습니다. 테이블을 조인하면 양쪽 테이블에 있는 데이터 모두 접근이 가능하기 때문입니다. 반면 객체는 연관된 객체만 참조할 수 있습니다. 객체 관계에서 한 쪽만 참조하는 것을 단방향, 양쪽이 서로 참조하는 것을 양방향이라고 합니다.
기본적으로 단방향 참조를 사용하고, 필요에 따라 양방향 참조를 기용하며 추가로 다대다 매핑 사용은 지양합니다.
보통 외래키를 통해 객체간의 연관 관계를 관리하며, 외래래키를 관리할 주인을 정하게 됩니다. 보통 외래키를 보유한 쪽이 주인이 되며, 주인은 데이터를 조회, 저장, 수정, 삭제를 할 수 있습니다. 주인이 아니면 조회만 가능합니다.
출처: 이스트소프트
다음과 같이 @OneToMany 관계인 두 테이블은 하나의 게시판에 여러개의 post가 가능하다는 것을 나타냅니다.
여기서 주인은 외래키로 board_id를 보유한 post입니다.
@Entity
public class Post {
@Id
@GeneratedValue
@Column(name = "Post_ID")
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "BOARD_ID")
private Board board;
}
@Entity
public class Board {
@Id
@GeneratedValue
@Column(name = "BOARD_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "board")
private List<Post> post = new ArrayList<post>();
}
코드로는 다음과 같이 표현할 수 있으며 양방향 참조를 구현했습니다. (단뱡향 참조시 Board Class의 List 필드 제거)
실제 테이블 간에 조인이 이뤄지면 서로 데이터에 접근할 수 있지만, 자바 객체는 참조하는 쪽에서만 데이터에 접근할 수 있습니다.
'[Way to PM] 백 엔드' 카테고리의 다른 글
[Way to PM] 백 엔드(스프링부트) - 스프링 시큐리티 인증된 유저 정보 가져오기 (0) | 2024.04.15 |
---|---|
[Way to PM] 백엔드(스프링부트) - CRUD 테스트 코드 (0) | 2024.03.22 |
[Way to PM] 백엔드(스프링부트) - JPA Update Method (0) | 2024.03.20 |
[Way to PM] 백엔드(스프링부트) - .yml 파일에 MyBatis 적용 시 띄어쓰기의 중요성 (0) | 2024.03.09 |
[Way to PM] 백엔드(스프링부트) - MVC (3) | 2024.03.09 |