ORM이란?
객체 지향 언어를 이용하여 서로 호환되지 않는 타입 간의 데이터를 변환하는 기술
- DB 테이블 데이터를 (자바) 객체와 매핑하는 기술
- RDBS -> 객체 지향 DB로 가상화
목적
DB의 추상화 : SQL 구현을 없애고 DB 변경에 유연해지는 것
객체의 이점을 활용 : 객체간 참조 (type - safety)
관심사 분리 : 비즈니스 로직에 좀 더 집중하게 하는 것
Jakarta(JAVA) Persistence API
RDBMS를 다루기 위한 인터페이스 표준 명세
1. 기본적으로 관계형 DB의 영속성만을 규정
2. API + JPQL + metadata(+ Criteria API)
Persistence(영속성)
프로세스가 만든 시스템의 상태가 종료된 후에도 사라지지 않는 특성
- 구현 방법 : 시스템의 상태를 데이터 저장소에 데이터로 저장한다
- 사라지는 데이터 - 주기억장치(휘발성 스토리지)에 저장된 데이터
프로세스 메모리 안의 데이터(변수, 상수, 객체, 함수 등) - 사라지지 않는 데이터 : 보조기억장치(비휘발성 스토리지)에 저장된 데이터
하드디스크, SSD에 기록된 데이터(파일, DB 등)
영속성 프레임워크?
영속성을 관리하는 부분을 persistence layer로 추상화하고 프레임워크에게 관리를 위임
그렇다면 JPA 에서 Persistence 란?
프로세스가 DB로부터 읽너나 DB에 저장한 정보의 특성
Jakarta(JAVA) Persistence Query Language
- JPA 표준의 일부로 정의됨
- RDBMS의 Entity 를 다루는 쿼리를 만드는데 사용
- SQL의 영향을 받아서 형식이 매우 비슷함
Hibernate란?
자바생태계를 대표하는 ORM 프레임워크
스프링 부트에서 채택한 메인 ORM 프레임워크
고성능, 확정성, 안정성을 표방
하이버네이트의 장점
생산성
- Hibernate는 SQL을 직접 사용하지 않고, 메서드 호출만으로 쿼리가 수행돼요. 즉, SQL 반복 작업을 하지 않음으로 생산성이 높아져요
- SQL을 몰라도 되는 건 아니에요. (내부 동작에 대해 알아야 하기 때문)
유지보수
- 테이블 컬럼이 변경되었을 때, 테이블과 관련된 DAO의 파라미터, 결과, SQL 등을 대신 수행해줘요. 이로 인해 유지보수 측면에서 높아져요
특정 벤더에 종속적이지 않음
- JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않아요.
- 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지를 알려주기만 하면 얼마든지 DB를 바꿀 수 있어요.
패러다임 불일치 해결
- 상속, 연관 관계, 객체 그래프 탐색, 비교 등 객체와 관계형 데이터베이스와의 패러다임 불일치를 해결할 수 있어요.
하이버네이트의 단점
성능
- 메서드 호출만으로 쿼리를 수행하는 것은 직접 SQL을 작성하는 것보다는 성능상 좋지 않아요
세밀함
- 메서드 호출만으로 DB 데이터를 조작하기에는 한계가 있어요. 이를 보완하기 위해 JPQL을 지원해요
- NativeQuery를 지원하여 SQL 자체 쿼리도 작성할 수 있어요
러닝커브
- 공부할게 너무 많다..개념 참고
https://defineall.tistory.com/1029
Hibernate Query language
hibernate가 사용하는 SQL 스타일 비표준 쿼리언어
객체 모델에 초점을 맞춰 서계되어있고 JPQL이 바탕이됨(JPQL은 HQL의 subset)
단, JPQL은 완벽한 HQL문장이지만 반대로는 성립안됨
Critetria query
type-safety를 제공하는 JPQL의 대안 표현법
JPA란?
스프링에서 제공하는 JPA 추상화 모듈
Spring Data JPA를 사용한다면?
- JPA, 하이버네이트를 몰라도 되어야함
- EntityManager 직접 사용하지 않는다
- JPQL을 직접 사용하지 않는다
- persist(), merge(), close()를 직접 사용하지 않는다
- 트랜잭션을 getTransaction(), commit(), rollback()으로 관린하지 않는다
추상화의 이점을 포기하게 되는 셈! 기껏 다 추상화 해놨잖아요~
이번주는 게시글과 댓글, 대댓글에 좋아요 기능을 구현해야 한다..
API, JPA 두개를 정말 자유자재로 언젠가는 다룰 날이 있겠지.. JWT도 복습해야겠다
한달동안 평균 수면시간이 4시간 정도인데 뭔가 배운 것 같은데 느낌이 애매하게 와있는 상황..
코이팅하자
References :
'프로그래밍 > Spring' 카테고리의 다른 글
첫 미니프로젝트 종료 (0) | 2022.08.18 |
---|---|
Spring Boot Validation (0) | 2022.08.08 |
AOP & Logging (slf4j) (0) | 2022.08.05 |
[SPRING BOOT]JWT, Thymeleaf, form (2/2) (0) | 2022.08.04 |
[SPRING BOOT]JWT, Thymleaf, form (1/2) (2) | 2022.08.04 |