스프링 DB 접근
| topics | 300-백엔드개발 301 Spring |
| types | 이론 |
| tags |
JDBC
자바에서 데이터베이스에 접근할 수 있도록 하는 자바 API
low level standard임
SQL 중심 기술임(직접 작성해야 한단 소리임)
therefore DBMS에 종속적임
아래 기술은 내부적으로 JDBC를 사용함(JPA는 대부분..)
- JDBC Template
- JDBC를 쉽게 사용하기 위한 JDBC의 래퍼임
- MyBatis
- SQL과 자바 객체간 매핑을 지원하는 프레임워크
- 개발자가 SQL 작성하면 mybatis가 jdbc의 부분을 처리
- JPA
- java orm의 표준임
- SQL 안 쓰고 객체중심으로 DB를 다룰 수 있게 해줌
- DataNucleus JPA JDBC 사용 ㄴㄴ
- https://stackoverflow.com/questions/11881548/jpa-or-jdbc-how-are-they-different
orm
OOP <-> RDB 연결
객체지향과 관계형을 매핑한다
패러다임의 불일치가 존재함
| 불일치 | 설명 |
|---|---|
| 상속성 | RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없다. |
| 일치 | RDBMS는 기본 키(primary key)를 이용하여 동일성을 정의한다. 자바는 객체 식별과 동일성(=, equals)을 모두 정의한다. 즉, RDBMS는 PK가 같으면 동일한 record로 정의하지만, Java에서는 주소값이 같거나 내용이 같은 경우를 구분해서 정의한다. |
| 연관성 표현 방식의 차이 | 객체지향 언어는 방향성이 있는 객체의 참조(reference)를 사용하여 연관성을 나타내지만, RDBMS는 방향성이 없는 외래키(foreign key)를 이용해서 나타낸다. |
| 데이터 접근 방법의 차이 | 자바와 RDBMS에서 객체를 접근하는 방법이 근본적으로 다르다. 자바는 그래프 형태로 하나의 연결로 이동하며 탐색하지만, RDBMS는 일반적으로 SQL로 조회, JOIN을 통해 여러 엔티티를 로드하고 원하는 대상 엔티티를 선택하는 방식으로 탐색한다. |
- RDB의 model을 entity형태로 투영함
- 관계를 지정하면 orm이 자동으로 sql을 생성함
- dbms 종속이 적어짐
- JPA의 대표 구현체 : Hibernate
- 장점
- 종속성 적어짐
- 간단한거 구현 개 쉬움
- 객체지향적
- 단점
- 모든 쿼리 대체불가
- 쿼리가 괴랄하면 난이도 급상승
- 잘못 구현되면 속도랑 일관성이 무너짐
JPA
java 의 orm
엔티티 생명주기
- 영속 : 객체 생성후 em.persist(entity)를 호출하여 영속성 컨텍스트에 들어감
- 비영속 : 객체생성후 영속성 컨텍스트와 관계 없음
- 준영속 : 영속성 컨텍스트에 저장되었다가 분리되어 나옴
- 삭제 : 객체를 삭제한 상태
영속성 컨텍스트
persistence context
db 영속성과 저장
어플리케이션과 DB사이서 객체를 보관하는 가상 DB
- 엔티티 매니저를 통해 엔티티를 저장, 조회 시 엔티티 매니저는 연속성 컨텍스트에 저장하고 관리함
- 내부에 캐시를 갖음 (이를 1차 캐시라함)
- Map형식임
- 1차에 있으면 DB까지 조회안함
- 쓰기 지연을 할 수 있음
- 미리 변경사항을 갖고 있다가 트랜잭션이 커밋되면 한번에 쿼리 날릴 수 있음
- DB커넥션 수와 시간을 줄일 수 있음
플러시
- 영속성 컨텍스트의 변경내용을 db에 반영하는 작업(일종의 동기화 작업)
- 영속성 컨텍스트에 저장된 엔티티의 변경사항이 실제 db에 전달
- 플러시가 발생해도 1차 캐시(영속성 컨텍스트)는 그대로 유지됨
- 동작과정
- 변경감지
- 수정된 엔티티 등록
- sql db 전송
- 언제 발생?
- 트랜젝션 커밋
- (Java Persistence Query Language)로 쿼리를 실행할 때 자동으로
- 직접 flush() 호출
- 모드
- auto
- 트랜잭션 커밋이나 쿼리 실행 시 플러시가 자동으로 동작
- commit
- 트랜잭션 커밋 시에만 플러시가 동작
- auto