본문 바로가기

TIL

[TIL 2022-2-20] JPA 연관관계 매핑, 프로그래머스

다양한 연관관계 매핑

다중성

데이터베이스와 연관관개를 매핑하기 위해 존재하는 개념이다. 두 테이블간에 일대다, 다대일, 일대일, 다대다 로 나뉘는 상대적인 연관관계들 말한다. JPA 에선 아래의 어노테이션을 통해 엔티티의 연관관계를 매핑한다.

 

일대다: @OneToMany

다대일: @ManyToOne

일대일: @OneToOne

다대다: @ManyToMany

단방향과 양방향

테이블에선 외래키 하나를 통해 양쪽 두 테이블을 모두 Join할 수 있기 때문에 방향이라는 개념이 없다. 하지만 객체에서는 참조값 필드가 있는 방향으로만 조회가 가능 하기 때문에, 필요에 따라 연관관계 필드를 설정 해줘야만 조회가 가능하다.

 

연관관계의 주인

위에서 말한 것 처럼 엔티티 객체의 연관관계에서 한 객체를 통해 다른 객체를 조회하려고할 경우, 필드에 상대 객체에 대한 참조값을 가지고 있어야한다. 만약 두 객체 모두 상대 객체를 참조하도록 구현할 경우, JPA는 외래키를 어떤 엔티티가 관리할지 알 수 없기 때문에, 개발자는 연관관계의 주인을 설정해 외래키를 관리(등록, 수정, 삭제)하도록 한다. 연관관계의 주인의 반대편 객체는 조회만 가능하다. (조회만 가능하다는 것은 반대편 객체를 수정해도 외래키변경되지 않는다는 것을 말한다. 참조하고있는 주인 객체를 통해 수정하면 수정된다.)

 

 

고급 매핑

객체의 상속개념을 데이터베이스에서도 적용시키기 위해 JPA는 세가지의 상속관계 매핑 전략을 제공한다. (관계형 데이터베이스는 상속개념이 없다.)

 

각각의 전략은 부모 클래스 레벨에 @Inheritance(strategy = InheritanceType.XXX) 을 지정 해줌으로써 선택할 수 있다.

조인 전략 @Inheritance(strategy = InheritanceType..JOINED)

- 공통된 컬럼을 가진 부모 객체의 테이블을 생성하고, 각각의 자식 객체 또한 테이블로 생성된다.

- 자식 테이블은 부모의 pk를 pk 이자 fk 로 갖는다. 

- 부모를 조회하든 자식을 조회하든 두테이블 모두 Join을 통해 가져오기 때문에 성능 이슈가 발생할 수도 있다.

- 데이터를 저장할 때 두 테이블 모두에 Insert 해줘야하므로 두번의 쿼리가 발생한다.

 

단일 테이블 전략 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)

- 모든 자식 클래스의 필드를 하나의 테이블에 합쳐서 저장한다.(한테이블로 관리)

- 다른 자식클래스 필드에 대해서는 테이블에 NULL로 저장한다.

- 조인이 필요 없으므로 조회성능이 일반적으로 빠르고 쿼리가 단순하다.

- 단일 테이블에 모든 것을 저장하기 떄문에 테이블이 너무 커져 조회 성능이 오히려 느려질 수 있다.

 

구현 클래스마다 테이블 전략 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

- 부모 객체에 따로 매핑되는 테이블없이 자식 구현 클래스마다 테이블을 생성한다.

- 여러 테이블을 조회할 때 성능이 느리고 통합해서 관리하기가 힘들다. 예를 들어 10개의 자식 클래스가 있을 경우, 부모 타입으로 조회시 10개의 모든 테이블에 select를 호출한다. (union all 을 통해)

 

 

@MappedSuperclass

- 공통 매핑정보가 있을 때 사용한다.(등록일, 수정일 등)

- 공통부분을 클래스로 따로 빼네어 정의하고 클래스 레벨에 @MappedSuperclass 를 지정한다.

- 직접 생성해서 사용할 일이 없기 때문에 추상 클래스로 정의하는 것을 권장한다.

 

 

참고

https://www.inflearn.com/course/ORM-JPA-Basic/

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 


프로그래머스 level2 - 위장

https://programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장

 

programmers.co.kr

잊을만 하면 순열 조합문제를 만나는 것 같다. 이 문제에서는 조합의 수를 구하는 특정 공식을 알면 풀리는 문제였는데 대부분의 다른 문제들은 실제 순열과 조합 배열을 완성해야하는 경우가 많은 것 같다. 그래서 순열, 조합, 중복 순열, 순열 조합에 대해 한번씩 공부 하도록 해야겠다.