Computer Science/OOP

JPA 연관관계 매핑, 상속관계 매핑

TLdkt 2022. 9. 4. 17:30
728x90
반응형


🚩들어가며

연관관계 매핑이 좀 헷갈려서 심화내용과 함께 정리하면 좋을 것 같다. 

특히 양방향 단방향이  너무 헷갈린다 

문법적인 암기사항만 정리해봤다 

 

🌱연관관계 매핑

N : 1 단방향

N쪽 테이블과 매칭할 클래스에 

@ManyToOne

@JoinColumn(name ="매핑하려는 컬럼명")

 

 

N : 1 양방향

단방향

+

1쪽 테이블과 매칭할 클래스에 

@OneToMany(mappedBy  = "N쪽의 FK 가진 필드명")

 

mappedBy 를 쓰는 이유는 읽기전용으로만 활용하기 위함이다

실제로 mappedBy 쪽에 데이터를 넣어도 저장되지 않는다

그러나 객체지향적 설계에서 1쪽에 객체를 넣는 것이 자연스러우므로

연관관계 편의 메서드를 생성해 

1)Setter보다는 직접 작성으로

2) N, 1객체 모두에 입력할 수 있도록 작성 

실제로 컬럼의 값을 수정하는 것은 @JoinColumn을 가진 쪽이기 때문

 

N : M

중간 클래스를 하나 만들고

N:1 관계를 설정한 뒤,

필요에 따라 N:1양방향을 추가한다 

 

상속관계 매핑

상위 클래스에

1) @Inheritance(strategy =InheritanceType.전략이름)

전략에는 JOINED, SINGLE_TABLE이 있음

2) @DiscriminatorColumn(name = "설정하고 싶은 컬럼 이름")

 

하위클래스에 

1)extends (당연한 거지만..)

2) (option)DiscriminatorValue("설정하고 싶은 키값 이름"

 

중복, 반복멤버 귀찮다면

등록일, 수정일, 등록자, 수정자 같은 비즈니스적인 공통 사항은 아니지만 

매번 작성해야 하는 필드가 번거로웠다면 

@MappedSuperclass

public abstract class 작성해주고 

하위클래스는 extends만 써주면 

상속하는 모든 클래스와 매핑된 테이블에 공통 컬럼이 생긴다 

 

 

 

추가사항

위와 같이 관계를 맺는 테이블에 있어서 

매번 데이터를 즉시 다 가져올지, 혹은 일부 지연로딩을 할지 여부는

데이터의 빈도에 따라 다르지만, 일반적으로 LAZY로딩을 기본설정으로 하는 것을 추천한다고 한다.


LAZY로딩을 하고 싶다면

@ManyToOne(fetch =FetchType.LAZY) 를 적으면 된다 

 

💻마치며 

내용이 정말 많지만 반복하다보면 익숙해지겠지..? 

 

728x90
반응형