JPA 이해
💡ORM이란?
ORM : Object - Realational Mapping
-객체와 모델 사이의 관계를 기술하는 도구
-MVC 패턴에서 모델(Model)을 기술하는 도구
-객체와 데이터베이스의 관계를 매핑해주는 도구
Object : "객체"지향 언어(자바,파이썬)
Relational : "관계형" 데이터베이스 (H2,MySQL)
- 백엔드 개발자(Backend Developer) : 웹 서버를 개발하는 개발자
- DBA (Database Administration) : 데이터베이스 관리자,데이터베이스를 설계하는 일을 맡은 사람
ORM 사용 이유
- OOP(Object-Oriented Programming),객체 지향 프로그래밍 vs Relational Database,관계형 데이터베이스
- 객체 지향 프로그래밍은 클래스를 이용하고 관계형 DB는테이블을 이용하는데 객체 모델과 관계형 모델 간의 불일치가 존재
- 데이터베이스 접근을 프로그래밍 언어의 관점에서 맞출 수 있다
- 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다
- SQL 문을 직접 작성하지 않고 Entity를 객체로 표현할 수 있다
- ORM을 이용해 객체를 통해 간접적으로 데이터베이스를 다룬다
- 이를 통해 DB 세계와 프로그래밍 언어 사이의 개념의 간극을 줄여준다
- 느슨하게 연결된,테스트에 용이한 애플리케이션을 만들 수 있다.
ORM 장점
💡직관적인 코드 (가독성) + 비즈니스 로직 집중 가능(생산성)
- SQL QUERY가 아닌 메서드로 데이터를 조작가능
- 프로그래머가 객체 모델로 프로그래밍 하는 것에 더 집중할 수 있게 도와준다
- 각 객체에 대한 코드를 별도로 작성해 코드 가독성을 높인다
- SQL의 절차적,순차적인 접근이 아닌 객체 지향적인 접근으로 생산성이 증가한다
💡재사용 및 유지보수 편리성 증가
- ORM은 디자인 패턴을 견고하게 하는데 유리
- ORM은 독립적으로 작성되었고 해당 객체들을 재활용 할수 있다
- ERD를 보는 의존도를 낮출 수 있다
💡DBMS에 대한 종속성 저하
- 객체 간 관계를 바탕으로 SQL을 자동으로 생성하기 때문에 RDBMS의 데이터 구조와 프로그래밍 언어의 객체 모델 사이의 간격을 좁힌다
- 대부분 ORM 솔루션은 DB에 종속적이지 않다
- 프로그래머는 Object에 집중하여 DBMS를 다루는 큰 작업에도 비교적 적은 리스크와 시간만 소용한다
ORM 단점
💡ORM이 모든 걸 해결해줄 수 없다
ORM이 편리하나 그만큼 신중하게 설계해야한다. 부족한 설계로 잘못 구현할 경우 속도 저하 및 일관성을 무너뜨리는 문제가 발생할 수 있다. 자주 사용되는 대형 SQL문은 속도를 위해 별도의 튜닝이 필요하여 결국 SQL문을 써야할 수도 있다.
💡객체-관계 간의 불일치
다음과 같은 특성에서 객체-관계 간의 불일치가 생긴다
💡세분성(Granularity)
경우에 따라 DB에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있다
💡상속성 (Inheritance)
RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없다
💡일치(Identity)
RDBMS는 기본키(primary key)를 이용하여 동일성을 정의한다. 그러나 자바는 객체 식별(a==b)과 객체 동일성(a.equals(b))를 모두 정의한다
💡연관성(Associations)
객체 지향 언어는 방향성 있는 객체의 참조를 사용해 연관성을 나타내나,RDBMS는 방향성 없는 외래키만을 사용한다
💡탐색(Navigation)
자바와 RDBMS에서 객체 접근 방법이 근본적으로 다르다
자바는 그래프형태로 하나의 연결에서 다른 연결로 이동하며 탐색한다.
그러나 RDBMS는 일반적으로 SQL문을 최소화하고 JOIN을 통해 여러 엔티티를 로드하고 원하는 대상 엔티티를 선택하는 방식으로 탐색한다.
언어별 ORM 프레임워크 종류
- JAVA - JPA/Hibernate
- Node.js - Sequalize
- Django - 내장 ORM
- Flask - SQLAlchemy
JPA
JPA : Java Persistence API / 자바 ORM 기술에 대한 표준 명세(인터페이스 모음)
- JPA가 없어도 SQL문을 통해 작성이 가능하다
- 자바 ORM에 대한 API 표준 명세이다
- 인터페이스의 모음이다
- 구현체가 없고, 사용하기 위해서는 ORM프레임워크를 선택해야한다.실제 동작하는 것이 아니다
Hibernate
- ORM 프레임워크, Open Source SW
- JPA 는 표준 명세이고, 이를 실제 구현한 프레임워크 중 사실상 표준
- 스프링 부트에서 기본적으로 "하이버네이트" 사용 중
💡사실상 표준 (de facto, 디팩토)
보통 기업간 치열한 경쟁을 통해 시장에서 결정되는 비 공식적 표준이다
출처: 위키백과
JPA 영속성 컨텍스트
JPA
> 객체 - ORM - DB
> 객체 - 영속성 컨텍스트 매니저(entity context manager) - DB
영속성 컨텍스트 매니저
> 객체 < - > DB의 소통을 효율적으로 관리
PK(Primary Key)
>테이블에서 각 row마다 가져야 하는 유일무이한 값 (Null 허용되지 않음)
> 샘플
>자연키 , 인조키
- 자연키 : USERNAME,EMAIL
- 인조키 : ID
일반적으로 테이블 ID를 PK로 설정(인조키)
'1차 캐시' 사용의 장점
1. DB 조희 횟수를 줄임
2. '1차 캐시'를 사용해 DB row 1개 당 객체 1개가 사용되는 것을 보장(객체 동일성 보장)
> 만약 Entity 업데이트 실패시
-Entity 객체를 수정해도 DB에는 update가 되지 않는다
- 1차 캐시 Entity 객체에만 업데이트 반영
- User DB 에는 반영되지 않음
- 객체와 DB 값 불일치 확인
> Entity 업데이트 방법
1. userRepository.save() 사용
2. - @Transactional을 추가
- userRepository.save() 함수를 호출하지 않아도,함수가 끝나는 시점에 변경된 부분을 알아서 업데이트 해줌
(이를 "Dirty check" 라고 함)
- 간단히 함수가 종료되는 시점에 각 Entity 에 save( )가 호출된다라고 이해
@Transactional
public User updateUser2() {
// 테스트 회원 "user1" 생성
// 회원 "user1" 객체 추가
User user = new User("user1", "진", "꽃등심");
// 회원 "user1" 객체를 영속화
User savedUser = userRepository.save(user);
// 회원의 nickname 변경
savedUser.setNickname("월드와이드핸섬 진");
// 회원의 favoriteFood 변경
savedUser.setFavoriteFood("까르보나라");
return savedUser;
}
> DB의 연관관계 이해
- JPA가 제공하는 연관관계는 DB의 연관관계를 표현하기 위함
- 따라서 먼저 DB의 연관관계를 이해해야한다
- DB의 연관관계는 비즈니스 요구사항에 맞춰 이뤄진다
DB 설계 방법
1. 각 주체의 테이블 설계가 필요
2. 연관 관계 고민
> 회원 1명은 주문 N개를 할 수 있다.
- 회원 : 주문 = 1 : N 관계
> 음식 1개는 주문 N개에 포함될 수 있다
- 음식 : 주문 = 1 : N 관계
> 결론
- 회원 : 음식 = N : N 관계
Spring Data JPA는?
- JPA를 편리하게 사용하기 위해,스프링에서 JPA를 Wrapping
- 스프링 개발자들이 JPA를 사용할 때 필수적으로 생성해야 하나,예상 가능하고 반복적인 코드들
=> Spring Data JPA가 대신 작성
'Language & Framework & GIT > Spring' 카테고리의 다른 글
[Spring] SpringMVC_3 # Hello 서블릿 (0) | 2022.08.19 |
---|---|
Spring MVC_2#HTML ,HTTP API ,CSR ,SSR (0) | 2022.08.17 |
SprignMVC_1 #웹서버/WAS/서블릿 (0) | 2022.08.14 |
[Spring]@NotNull @NotEmpty @NotBlank 의 차이 (0) | 2022.08.09 |
[Spring] @RequestParam (0) | 2022.08.04 |
댓글