-
[Spring - JPA ORM 표준 JPA 프로그래밍 ] JPA 시작BACKEND/Spring 2022. 10. 3. 19:16
본 게시물은 인프런 김영한 선생님의 강의를 기반으로 작성되었습니다.
/* 강의 링크 */
https://www.inflearn.com/course/ORM-JPA-Basic
1. JPA 프로그래밍에 들어가기 이전에..
JPA의 필요성: 과거에는 객체를 데이터베이스를 저장하고 찾으려면, API와 sql을 직접 적었어야했다.
JPA를 사용하면 SQL(쿼리문)을 작성할 필요가 없다.
한땀 한땀 작성하는 것보다 훨씬 생산성을 높이고, 유지보수와 속도 측면에서 이전과는 확연하게 차이가 난다.
JPA를 가장 어려워하는 부분과, 중요한 부분이 객체와 테이블을 '잘' 매핑하는 것이다.
그래서 이 강의에서의 목표는 다음과 같다
- 객체와 테이블 설계 매핑! (복잡한 관계에서 JPA를 어떻게 매핑해야 하는지를 배워갈 예정임!)
- JPA가 내부적으로 어떻게 동작하는 지 정확하게 이해하기!
2. JPA 소개 (첫시간이 가장 중요함!)
SQL 중심적인 개발의 문제점은 관계형 DB에 저장해야 한다는 점인데, 관계형 DB에 저장하기 위해서는 SQL 쿼리문을 계속 작성해야 한다. => CURD의 반복..
(개발자로서 엄청 지루한 일이다.)- 문제
- 기획자가 회원을 설계 해달라고 해서 DB를 짜면, 객체를 짜고, Query를 작성하는데, 만일 변경사항이 생기면 처음부터 끝까지 다 수정해야함 => 관계형 DB를 써야할 때는 SQL에 의존적인 개발을 피하기가 어려움
- 패러다임의 불일치 : 객체지향 프로그래밍과 관계형 DB의 성질이 다르다. 객체를 저장한다고 생각해보면 다양한 저장소에 저장할 수 있지만, 현실적인 대안은 관계형 DB밖에 없다.
a. 상속관계에서의 차이점
- 상속관계를 DB에서 구현하려면 Table의 슈퍼타입과 서브타입 관계로 넣어야 한다.
- 객체 생성 코드를 작성한 후 DB에 저장하려고 하면 Insert 코드를 두번 써야하는데, 생성에도 쉽지 않지만, 조회에서도 복잡한 과정을 가지고 있다.
만일 DB가 아니고 자바 컬렉션에 조회한다고 하면? 되게 간단해지고 쉬워진다.
그러니까 백엔드를 개발할 때는 객체를 관계형 DB에 넣고 빼내는 순간 복잡해진다.
b. 연관관계에서의 차이점
- 객체는 참조를 사용하고, 테이블은 외래 키를 사용한다.
- 객체에서는 참조하는 테이블에만 접근할 수 있지만(양방향 접근 불가능) 테이블에서는 외래키를 통해 반대로도 Join할 수 있수도 있다. (양방향 접근이 가능)
- 객체에서는 참조로 연관관계를 맺는다. <=> sql문에서 foreign pk 사용
- 객체 모델링을 조회할 때는? 조인을 한다음에 관계를 설정하고 객체를 반환해준다.
c. 객체 그래프 탐색
- 객체는 객체 그래프를 탐색할 수 있어야하는데, 처음 실행하는 SQL에 따라 탐색 범위를 결정한다. 처음에 결정한 값이 아니면 값을 못 꺼낸다. => 엔티티 신뢰 문제가 발생할 수 있다. 쿼리와 조립을 눈으로 확인하지 않는 이상은 반환된 엔티티를 신뢰할 수가 없음!
- 모든 객체는 미리 로딩할 수는 없다 : 상황에 따라 동일한 회원 조회 메서드를 여러번 생성
자바 컬랙션에서 조회하고 객체를 두번 꺼낸다고하면, 참조값을 비교하면 같다고 나옴. SQL에서는 다르다(두번 리턴되기 때문에)객체답게 모델링을 할수록 매핑 작업만 늘어난다..
자바 컬렉션에 저장하듯이 DB에 저장하는게 JPA이다!
2-2. JPA 소개
- 객체 관계 매핑: 객체는 객체대로 설게하고 관계형 데이터베이스는 관계형 데이터베이스대로 설계한 다음 ORM 프레임워크가 중간에서 매핑해준다.
- JPA는 애플리케이션과 JDBC 사이에서 동작한다.
- JAVA 애플리케이션에서 개발자가 JPA에 명령을 하면 JDBC API를 사용해 SQL을 호출하고 DB에서 결과를 반환받는다.
JPA 패러다임의 불일치를 해결해 줌
- 개발자가 jpa.persist 코드를 짜면 나머지는 JPA가 처리해 준다. => Insert문을 JPA가 두개로 만들어서 처리해줌. 상속되는 것과, 상속을 해주는 쿼리를 생성해준다.
- 조회할 때도, find 코드를 넘기면 JPA가 조인을 한 후 가지고 옴.
- 개발자가 연관관계를 저장하면 JPA가 어렵지 않게 객체 그래프를 탐색함.
- 신뢰할 수 있는 엔티티: 기존에서는 객체 그래프를 신뢰할 수 없었는데, JPA가 있으면 자유롭게 객체 그래프를 탐색할 수 있다.
- JPA에서는 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
- 즉시 로딩과 지연 로딩
- 지연 로딩:
- memberDAO를 통해서 멤버 객체를 꺼냈으면, 멤버만 먼저 나옴.
- member.getTeam()에서 팀 객체를 가져오고 데이터를 채워서 채워진 결과를 반환해 줌
- 즉시 로딩:
- 지연 로딩에서 쿼리가 너무 많기 때문에, 조회할 때 바로 조인해서 member를 조회할 때 무조건 team을 가져옴 . 옵션을 조정해서 바로 튜닝이 가능함.
ORM은 객체와 RDB 두 기둥위에 있는 기술
- JPA와 RDB(관계형 데이터 베이스) 둘 다 잘해야 함!!
'BACKEND > Spring' 카테고리의 다른 글
[Spring Boot/JPA] JPA 의존성 추가, 도메인 개발 (0) 2023.02.15 [Spring / Spring Boot] 단위 테스트 코드 작성해보기 (0) 2023.02.13 자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션08 (0) 2022.11.14 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 : 섹션 2(작성 중) (0) 2022.11.13 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 섹션 1(작성 중) (0) 2022.11.13