티스토리 뷰
JPA란?
이 관계를 알아보기 위해 JPA를 쓰는 이유에 대해서 알아봐야합니다. JPA는 ORM 기술 중 하나로 hibernate를 기반으로 자바의 객체와 DB 테이블 간의 패러다임 불일치 문제를 해결해주는 기술입니다.
RDB와 Object는 엄연히 다른 존재이지만 이 불일치를 해결하기 위해 여태 많은 개발자들은 RDB 중심의 애플리케이션 개발을 주로 했습니다. 하지만 JPA가 나오면서 부터 이 불일치 문제를 해결하는 장점을 바탕으로 객체 중심의 개발이 이루어지기 시작했는데 이것이 바로 JPA의 장점이라 할 수 있습니다.
public class Member {
private Long id;
private String email;
private String password;
private String name;
}
이렇게 설계된 DB를 객체에 저장하려면 다음과 같은 SQL문이 필요하다.
INSERT INTO MEMBER(MEMBER\_ID, EMAIL, PASSWORD, NAME) VALUES(.....);
전혀 객체지향 스럽지 않습니다. SQL 문에 맞는 값을 작성하기 위해서 저 값들을 일일히 가져와야합니다. 하지만 JPA에서는?
entityManager
클래스의 persist(member);
로 좀 더 객체지향스럽게 저장할 수 있습니다.
뿐만 아니라 JPA는 Entity 클래스를 객체로써 볼 수 있게 됩니다. 설계할 때 내장 타입이나 상속구조도 JPA가 매핑을 해줌으로 좀 더 객체를 객체답게 사용할 수 있도록 해줍니다.
뿐만아니라 객체 기반으로 TypeSafe한 쿼리를 날리기 때문에 개발자의 실수를 사전에 방지할 수 있게 되는 큰 메리트가 존재합니다.
연관관계 매핑에 대한 문제점
하지만 연관관계는 다양한 문제를 야기한다. 연관관계 패러다임을 일치 시키기 위해 연관관계를 맺으면 다음과 같이 해줘야한다.
public class Member {
private Long id;
private String email;
private String password;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "board_id")
private Board board;
}
이와 같은 방식으로 매핑을 하였을 때 여기서는 비록 관리 포인트가 적어보이지만 연관관계가 좀 더 복잡해 진다면 달라질 수 있습니다.
대표적으로 N + 1 문제라던지 아니면 고아 객체 문제등 각종 관리포인트가 많아짐으로써 생기는 문제가 발생할 수 있습니다. 뿐만 아니라 객체를 저장해주기 위해서 select를 해와야 하는 경우도 생깁니다. (물론 getReferenceById를 통해 해결 가능합니다.) 그렇기 때문에 트레이드 오프를 통해서 이 문제를 해결하는 방식을 사용하는 방법이 있습니다.
public class Member {
private Long id;
private String email;
private String password;
private String name;
private Long boardId;
}
이를 통해서 객체 그래프 탐색과 영속화의 장점은 사라졌지만 확실히 관리 포인트가 많이 준 것을 알 수 있습니다. 이젠 지연 즉시 로딩으로 인한 N + 1 또는 불필요한 Join 문제를 해결하였습니다. 또한 객체를 저장하지 않기 때문에 고아 객체같은 문제가 발생하지 않을 것입니다.
이 외에도 직관적이기 때문에 코드를 이해하는데 있어 훨씬 수월해 집니다.
MicroService로 가기 위한 전략
microServiceArchitecture에서는 도메인 단위로 모듈이 분리되어 서버가 여러 개 구축이 됩니다.
위 사진처럼 MicroService는 각각 다른 DB를 바라보고 있기 때문에 연관관계가 분리됩니다. 하지만 분리되어있는 서버끼리도 객체를 참조할 수 있는 경우가 생깁니다. 이 때 보통 feign client/webClient
를 이용하여 Id만으로 서로의 정보를 서버간 호출을 통해 정보를 가져오는데
scale out을 해야할 때 모놀리스한 구조에서 객체 참조를 통해 연관관계가 맺어져 있다면 scale out시 객체 참조 형식을 모두 변경해 줘야 합니다. 이는 하나의 feature단위로 볼 정도로 규모가 커집니다.
이러한 scale out에 대비하기 위해 실질적으론 연관관계를 제거하고 Id를 저장하는 방식의 일종의 트레이드 오프가 유지보수에 큰 이점을 가져올 수 있습니다.
Ref.
[[Tech] MSA(Microservice Architecture)란?
Monolithic Architecture MSA에 대해 이해하기 위해서는 먼저 그에 상반된 모놀리틱 아키텍처에 관해 이해할 필요가 있다. 모놀리틱 아키텍처란 전통적인 소프트웨어 아키텍처 스타일로써 하나의 서버
ooeunz.tistory.com](https://ooeunz.tistory.com/52)
[JPA 정의(Java Persistence API) / JPA 사용이유 / JPA 장단점
JPA (JAVA PERSISTENCE API) 란? 애플리케이션의 데이터를 객체지향 관점으로 바라보고 다룰 수 있게 해주는 자바 진영의 ORM 기술표준인 객체지향 기술 ORM(Object Relational Mapping) = 객체와 관계형 데이터베
mkil.tistory.com](https://mkil.tistory.com/526)
'Spring Framwork & JPA > JPA' 카테고리의 다른 글
프로젝트 JPA 성능 개선기(2) - 불필요한 Join 삭제 (0) | 2022.06.04 |
---|---|
프로젝트 JPA 성능 개선기 (1) - 로그인 시 성능을 올려보자~! (1) | 2022.06.04 |
JPA에서 발생하는 생성, 수정, 삭제 시간을 추적해보자 (2) | 2022.05.14 |
JPA란 무엇인가? (0) | 2021.10.28 |
JPA에 시작 (0) | 2021.10.10 |
- Total
- Today
- Yesterday
- docker
- CS
- JPA
- 백엔드
- DevOps
- 프로젝트
- Spring
- 코드
- 코딩
- 취준
- Redis
- 인터뷰
- 면접 준비
- 취업준비
- IT
- Kotlin
- MySQL
- DB
- 개발자
- 프로그래밍
- 동시성
- java
- 게시판
- 면접준비
- swarm
- 개발
- 자바
- thread
- 취업
- 면접
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |