⚡Spring JPA (Java Persistence API)
- JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다.
⚡ORM
- ORM(Object-Relational Mapping)은 객체와 관계형 DB를 매핑한다는 뜻
객체-관계 매핑의 줄임말이다
ORM을 이용하면, SQL문이 아닌 클래스의 메소드를 통해서 데이터베이스를 조작 가능하다.
개발자가 객체 모델만 이용해서 프로그래밍을 하는데 집중이 가능하다.
단점이 있다면, 신중하게 설계가 필요하다. 프로젝트의 복잡성이 커지는 경우
잘못된 구현으로 인해서 속도 저하 및 일관성이 없는 문제점이 생길수 있다.
구형 SQL문이라던지 대형 SQL문의 경우 속도측면에 따라서 별도의 튜닝이 필요하기 때문에 결국 SQL을 써야하는 경우가 생길수 있다.
⚡Hibernate (JPA의 구현체)
- 자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 프레임워크
- 장점
- 재사용성이 좋음.
- 객채로 쿼리 결과가 자동으로 맴핑되므로 편하다.
- DB의 종류가 바뀌어도 대응이 쉽다.
- 단점
- 잘이해하고 사용하지 않으면 어렵다.
JPA를 사용하는 이유는 뭘까❓❓
- 지금도 이렇게 개발을 진행하는 곳이 많겠지만, 기능 하나를 추가해서 테이블이 생성이 될때마다, CRUD SQL을 만들어야된다. 이러다보니 개발자 입장에서 SQL에 의존성이 높아질수밖에 없는 구조로 이뤄졌다.
현재 개발 트랜드에 따라서 객체 지향 개발을 하고 있다. 객체를 SQL로 변환해서 RDB에 저장 및 조회 변환과정을 개발자가 하고 있다....
문제에 대한 내용 확인
- 객체와 관계형 데이터 베이스의 차이
- 객체를 관계형 데이터 베이스에 저장하는 과정 이다.
해당 객체를 SQL로 변환해서 RDB에 저장하는 과정을 개발자가 해야한다... 이때부터 노가다가 시작이 된다.....
- 객체를 관계형 데이터 베이스에 저장하는 과정 이다.
- 왼쪽은 상속 관계이며, 오른쪽은 Table의 관계이다.
여기서 객체의 상속 관계에서는 extends와 implement로 상속을 맺고, 캐스팅도 자유롭다.
여기서 상속 받은 객체를 DB에 저장 하려면 어떻게 해야하는가?- 객체를 서로 분리한다.
- 부모와 자식의 객체별로 두개의 쿼리를 작성해서 저장해야한다.
# DB에 저장할 객체는 상속 관계를 쓰지 않는다.
- 연관 관계
- 아래의 객체들을 기준으로 봤을때, User -> Group 및 User -> Company 참조가 가능하다.
user.getCompay(); user.getGroup(); 를 통해서 가능하다.
하지만. Group 및 Company의 경우 참조할 객체가 없기 떄문에 불가능하다.
- 아래의 객체들을 기준으로 봤을때, User -> Group 및 User -> Company 참조가 가능하다.
위의 관계가 테이블이라고 생각해보자. 테이블의 연관 관계를 볼때 User의 경우 분명 companyCode 와 groupCode를 가지고 있을 것이다. 이렇게 되면 테이블의 경우, 서로 참조 가능한 key가 있기때문에 양측이 서로 참조가 가능하다.
결국 테이블과 같이 객체를 모델링 하게 되는 경우가 많고 이런 경우 객체 지향적이지 못한 상황이 발생한다.
객체의 경우 연결이 되어 있는 경우 자유롭게 접근이 가능해야한다. ex) user.getGroup()
처음 실행하는 SQL에 따라 탐색 범위가 결정.
SELECT
U.*,
G.*
FROM USER U
JOIN GROUP G ON U.GROUP_CODE = G.GROUP_CODE
user.getGroup(); // 존재
user.getCompany(); // null
엔티티의 신뢰 문제
class UserService {
public void testUser() {
User user = userDao.find(userId);
user.getUserName(); // ??
user.getGroup().getGroupName(); // ??
}
}
실제로 모든 코드와 쿼리를 분석 해야지 내용 분석이 가능하다.
그렇다고 모든 객체를 조회해서 가지고 있을수 없으니 상황에 따라서는 동일한 조회가 여러번 이뤄질수도 있게된다.
⚡생각
객체지향적으로 모델링을 하면 할수록 매핑 작업만 늘어나고 데이터에 대한 불일치가 늘어나서 사이드 이펙트가 커지기만 한다.
그렇다면, 객체를 자바 컬렉션에 저장하듯이 DB에 저장 할 수 없을까 ? 고민하다가 나온것이 JPA 이다.
반응형
'Spring' 카테고리의 다른 글
[JPA] QueryDSL에서 서브 쿼리 사용 정리 (0) | 2023.01.29 |
---|---|
[Spring] SpringBoot + RabbitMQ 연동 내용 정리. (0) | 2022.10.21 |
Spring Boot SPQR 개념 및 사용 방법 정리 (0) | 2022.09.15 |
Spring Boot JPA 사용 방법 정리 (0) | 2022.08.04 |
Spring Boot AOP 내용 및 사용 방법 정리 (0) | 2022.05.20 |