일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- spring
- mvc
- c#
- 인프런
- 완전탐색
- 파이썬
- popleft
- 프로그래머스
- python3
- appendleft
- Python
- 합 구하기
- 백준
- deque
- DP
- 소수찾기
- 1일1솔
- unity
- LCM
- 우선순위큐
- C#강의
- BFS
- 브루투포스
- JPA
- 연관관계
- 소수판별
- 누적합
- Java
- 그리디 알고리즘
- pypy3
- Today
- Total
jae_coding
[Spring JPA] SQL 개발의 단점 및 JPA 본문
목차
- SQL 중심적인 개발의 문제점
- JPA 소개
1. SQL 중심적인 개발의 문제점
배경: 21세기는 객체를 관계형 DB에 관리하기때문에 SQL을 중심적으로 개발하였다. 하지만 이는 반복되는 쿼리가 발생한다는 단점이 생긴다. 물론 요즘에는 JDBC 템플릿, 마이바티스 같은 메퍼들이 있기때문에 일이 줄었지만 아직 반복되는 점들이 많이 존재한다.
반복적인 예) CRUD 자바 객체를 SQL로 SQL을 자바객체로 반복해야한다.
관계형 DB를 사용하는 상황에서는 SQL에 의존적인 개발을 피하기는 어렵다.
또한, 객체와 관계형 데이터베이스의 패러다임의 불일치가 존재한다는 단점이 있다.
'객체 지향 프로그래밍': 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
현실적인 대안은 관계형 데이터베이스를 사용하는 것이다.
개발자는 SQL mapper가 아니다.
객체 vs 관계형 데이터베이스
- 상속
객체: 상속관계를 지닌다.
RDB: 상속관계를 지니지 않는다.
--객체의 상속관계와 유사한 타입 관계--
객체를 조회한다고하면, 각각의 테이블에 따른 Join SQL작성, 각각의 객체 생성... 상상만해도 복잡한 반복이 일어난다.
그렇기때문에, DB에 저장할 객체에는 상속관계를 쓰지 않는다.
만약 자바 컬렉션을 사용한다면
list.add(album);
과 같이 심플하게 DB를 생성하고 조회할 수 있다.
- 연관관계
객체: Reference를 가지고 연관된 객체를 가질 수 있다. (참조 사용)
RDB: PK, FK를 통해서 Join을 통해서 관계를 가질 수 있다. (외래 키 사용)
객체를 테이블에 맞추어 모델링을 진행한다면 ?
저장에는 문제가 없지만 조회를 할때, DB에서 필요한 정보를 만들어서 연관관계를 이용해야한다는 복잡한 과정이 일어난다.
하지만 객체 모델링을 자바 컬렉션에서 관리를 한다면?
자바 코드를 이용해서 자유롭고 간단하게 생성, 조회 가능
계층형 아키텍처에서는 진정한 의미의 계층 분할이 어렵다.
(주소값이 다를 수 있다)
결론: 객체답게 모델링할수록 Mapping작업만 늘어나기때문에 이를 자바 컬렉션에서 저장하듯이 DB를 저장할 수 없을까하는 배경에서 JPA가 나오게 되는 것이다.
2. JPA 소개
JPA: Java Persistance API, 자바 진영의 ORM 기술 표준
ORM
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존
애플리케이션과 JDBC사이에서 동작
JPA에게 개발자가 명령하면 JDBC API를 사용하면 SQL명령을 내려 결과를 반환하는 형식이다.
JPA저장
MemberDAO에서 객체를 저장하고 싶다면?
JPA에게 Member 객체를 넘기면 JPA가 적절한 쿼리를 생성하고 JDBC API를 통해서 DB에 보낸 후 결과를 받게 됩니다.
이는 패러다임의 불일치를 해결해준다. 조회의 경우도 마찬가지로 쿼리를 만들어낸다.
JPA 표준 명세
- JPA는 인터페이스의 모음이다
- 표준 명세를 구현한 하이버네이트, EclipseLink, DataNucleus
JPA를 왜 사용해야되는가?
- SQL 중심적인 개발 👉 객체 중심 개발
- 생산성
- 유지보수
- 패러다임 불일치 해결
- 성능 우세
- 데이터 접근 추상화와 벤더 독립성
- ORM 표준
CRUD (생산성)
- Create: jpa.persist(member)
- Read: Member member = jpa.find(memberId)
- Update: member.setName("변경 이름")
- Delete: jpa.remove(member)
유지보수 (기존: 쿼리 수정 필수)
class의 column을 추가 또는 삭제만 하면된다.
상속
- 저장
- 조회
- 연관관계, 객체 그래프 탐색
성능 최적화 기능
- 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환
- DB Isolation Level이 Read commit이라도 애플리케이션 안에서 Repeatable Read 보장
- 트랜잭션을 지원하는 쓰기 지연
- 트랜잭션 커밋할 때까지 Insert SQL을 모음
- JDBC BATCH SQL기능을 사용해서 한번에 SQL 전송
- 지연 로딩 (Lazy Loading)
- 수정, 삭제로 인한 ROW락 시간 최소화
- 트랜잭션 커밋 시 수정 삭제 SQL을 실행하고 바로 커밋
지연로딩 ? 즉시로딩?
지연로딩: 객체가 실제로 사용될 때 로딩
SELECT * FROM MEMBER
SELECT * FROM TEAM
즉시로딩: Join SQL하나로 연관된 객체까지 조회
SELECT M.*, T.*
FROM MEMBER
JOIN TEAM
ORM이라는 기술은 객체와 RDB의 기술이 필요한 두 기둥위에 있는 기술이다.
그렇기때문에 객체도 잘해야하고 RDB도 잘해야한다.
JPA를 공부하더라도 RDB에 대한 공부를 꾸준하게 해야한다!!
'Spring, java > Spring_JPA' 카테고리의 다른 글
[Spring JPA] 다양한 연관관계 매핑 (N:1, 1:N, 1:1, N:M) (0) | 2022.09.10 |
---|---|
[Spring JPA] 연관관계 매핑 (0) | 2022.09.10 |
[Spring JPA] 엔티티 매핑 (0) | 2022.09.08 |
[Spring JPA] 영속성 관리 (영속성 컨텍스트) (0) | 2022.09.08 |
[Spring JPA] Hello 순수JPA (0) | 2022.09.08 |