스프링 DB 접근

topics 300-백엔드개발 301 Spring
types 이론
tags

JDBC

자바에서 데이터베이스에 접근할 수 있도록 하는 자바 API
low level standard임

스프링 DB 접근-1748788030972.png

SQL 중심 기술임(직접 작성해야 한단 소리임)
therefore DBMS에 종속적임
아래 기술은 내부적으로 JDBC를 사용함(JPA는 대부분..)

  • JDBC Template
    • JDBC를 쉽게 사용하기 위한 JDBC의 래퍼임
  • MyBatis
    • SQL과 자바 객체간 매핑을 지원하는 프레임워크
    • 개발자가 SQL 작성하면 mybatis가 jdbc의 부분을 처리
  • JPA

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
      • 트랜잭션 커밋 시에만 플러시가 동작