[48일차]연관 관계 매핑

유태형·2022년 7월 6일
0

코드스테이츠

목록 보기
48/77

오늘의 목표

  1. 연관 관계 매핑



내용

연관 관계 매핑

연관 관계 매핑이란 엔티티 클래스 간의 관계를 만들어 주는 것입니다.

Spring Data JDBC에서의 클래스 간의 관계를 매핑해주는 점은 동일하지만 JPA방식으로 정의를 해야 합니다.

엔티티 간의 관계는 참여하는 객체의 수에 따라 일대일(1:1), 일대다(1:N), 다대일(N:1), 다대다(N:N)의 연관 관계로 정의할 수 있습니다.

또 JPA에서는 JDBC와 다르게 양방향 연관 관계를 지원 합니다.

JPA에서는 객체의 수 뿐만 아니라 클래스의 참조에 따라 단방향인지 양방향인지 구분할 수 있습니다.

엔티티 클래스 A,B가 일대다(1:N) 관계를 가지고 있을 때, 엔티티 클래스 A에서만 엔티티 클래스 B로의 참조 변수를 가지고 있으면 단방향이고, 엔티티 클래스 B에서만 엔티티 클래스 A로의 참조 변수를 가지고 있으면 단방향입니다.
엔티티 클래스 A,B 모두 엔티티 클래스 B,A로의 참조 변수를 가지고 있다면 양방향 입니다.



일대다, 다대일

객체의 수에 따라 일대일(1:1), 일대다(1:N), 다대일(N:1), 다대다(N:N)의 연관 관계를 정의할 수 있습니다.
하지만 다대일(N:1)은 기존의 관계형 데이터베이스와 JDBC에선 없던 명칭입니다. 일대다(1:N), 다대일(N:1)은 순서만 바꾸면 동일한 관계가 되기 때문에 혼란스러울 수는 있습니다.

  • 일대다(1:N)는 1인 테이블에서 N인 테이블로의 객체들을 담는 컬렉션을 변수로 가집니다.
  • 다대일(N:1)은 N인 테이블에서 1인 테이블로의 객체 변수를 가집니다.

분명히 데이터베이스에서 일대다(1:N) 관계를 정의할 때 테이블에 테이블의 기본키를 가지는 외래키를 정의하여 두 테이블간의 관계를 정의하였습니다.

일대다(1:N)만 가지는 엔티티 클래스 간의 관계는 테이블로 매핑 시 외래키를 가지지 못하는 문제가 발생하여 단독으로는 사용이 잘 되진 않습니다.

보통 다대일(N:1)관계를 사용하거나, 다대일(N:1)관계에서 양방향 소통이 필요한 경우 일대다(1:N)관계를 추가하여 사용합니다.



다대일 연관 관계

@NoArgsConstructor
@Getter
@Setter
@Entity(name="테이블1")
public class 엔티티1{
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long 엔티티1Id;
    
    @ManyToOne
    @JoinColumn(name = "외래키컬럼명")
    private 엔티티2 참조;
   	
   	public void add엔티티2(엔티티2 참조){
    	this.참조 = 참조;
    }
}

@ManyToOne 에너테이션으로 다대일 관계를 명시합니다.
@JoinColumn 에너테이션으로 해당 테이블에서 외래키에 해당하는 칼럼명을 지정합니다.
메서드를 추가하여 관계를 가질 객체를 추가하거나 수정할 수 있도록 합니다.

다대일 단방향 연관 관계만으로도 관계를 정의할 수 있으나 외래키를 가진 테이블과 매핑이 되는 엔티티 에서 기본키를 가진 테이블의 엔티티로 참조가 가능하지만 그 반대인 기본키를 가진 테이블의 엔티티에서 외래키를 가진 테이블의 엔티티를 참조하는 것이 불가능 하기 때문에 그 반대 방향도 필요하다면 일대다(1:N)관계를 추가하여 양방향 통신이 가능하도록 합니다.



일대다 연관 관계

@NoArgsConstructor
@Getter
@Setter
@Entity
public class 엔티티2{
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long 엔티티2Id;
    
    @OneToMany(mappedBy = "참조")
    private List<엔티티1> 리스트 = new ArrayList<>();
    
    public void add엔티티2(엔티티1 엔티티1){
    	리스트.add(엔티티1);
    }
}

List<엔티티1>의 리스트를 이용하여 여러개의 엔티티1의 객체들을 참조할 수 있도록 하였습니다.

@OneToMany에너테이션을 이용하여 일대다관계임을 명시하여 양방향 관계를 만들었습니다. 여기서 mappedBy 에트리뷰트를 주의깊게 보아야 합니다.

mappedBy에트리뷰트는 일대다관계만 단독으로 정의 시 사용되지 않습니다. 단방향 다대일관계를 양방향 다대일관계로 정의 시 사용됩니다.

mappedBy의 값으로는 테이블의 외래키와 매핑되는 변수이름을 지정합니다.



다대다 연관 관계

다대다 연관관계는 테이블과 마찬가지로 새로운 엔티티 클래스를만든 후 다대다를 2개의 다대일 관계로 재정의하여 사용합니다.
마찬가지로 그래프 탐색으로 원하는 객체를 조회할 수 없다면 그 때 일대다 양방향 매핑을 추가합니다.



일대일 관계

일대일 관계는 다대일 단방향 연관 관계 매핑과 방법이 동일합니다.
다만 @ManyToOne에너테이션이 ㅏ닌 @OneToOne에너테이션을 사용합니다.




후기

JPA에서 사용되는 연관관계에 대하여 익혔습니다. 아직 다대일이 특히나 낯설어서 그런지 어렵게 느껴집니다. 연습을 좀 해봐야 되겠습니다.




GitHub

private!

profile
오늘도 내일도 화이팅!

0개의 댓글