ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Spring Data
    Backend/공부,개념 2023. 2. 27. 04:34
    반응형

    회사에서 신규 프로젝트에 도입할 기술들을 정하고 있어서 개념정리할 겸 적어본다.

     

    JDBC (Java DataBase Connectivity) 

    - Java와 데이터베이스를 연결하기 위한 Java 표준 인터페이스

    - 다양한 DB미들웨어의 드라이버 제공, JVM기반에서 어디든지 사용 가능 

    - class.forName(driver), driverManager.getConnection, con.prepareStatement, pstmt.executeQuery 그 완전 기본 형태

    - 커넥션 종료시 일일이 close 해주어야 함

     

    Spring JDBC

    - 스프링에서 DB를 사용하기 위한 오리지널 디펜던시

    - JDBC사용 시 자주 사용하는 객체와 코드를 클래스 화하였음

    - Connection 열고 닫기, Statement준비 실행, ResultSet반복처리, Transaction 처리 등 

    - MVC패턴으로 구현할 때 DAO를 통해 DB에 접근, DataSource는 Spring 의존성주입으로 넣어줌 

    - 이거 이후에 MyBatis 같은 게 나옴 

     

    흐름 ) Java에서 DB를 연결하는 작업을 하려고 하는데 처음엔 JDBC -> Spring으로 옮겨가면서 Spring JDBC -> 관계형을 정의하기 어려운 단점 -> JPA 같은 게 나옴 

     

    JPA
    - Java Persistence API 자바에서 관계형 데이터베이스를 사용하기 위한 양식을 정의한 인터페이스 

    - 자바진영의 ORM 기술표준으로 애플리케이션과 JDBC 사이에서 동작 

      - ORM : SQL코드 구현 없이 객체지향프로그래밍 방식으로 DB를 사용하는 것 (ex. Hibernate)

     

    Hibernate

    - JPA의 구현체 

    - 장점

      - JDBC에서 중복된 코드가 발생했던 것 + 관계형 데이터베이스 매핑 불편함을 줄여줌 

      - 객체 수정에 따른 SQL 불필요

      - 캐싱, 데이터 접근 추상화 등 

    - 단점

      - 실제 쿼리 작성에 비해 성능이 좋지 않음

      - JPA의 엔티티 생명주기, 캐시, 쓰기 지연, 상속전략 등 잘 알고쓰지 않으면 더 안 좋을 수 있음

     

    Spring Data JPA

    - JPA를 Spring framework에서 편하게 사용할 수 있도록 만들어놓은 모듈

    - ex. @Entity, @Column 등으로 간단하게 엔티티를 정의하고 DDL을 수행하였음

     

    Spring Data

    - 스프링에서 일관된 DB접근을 위한 추상화된 모델을 제공하는 디펜던시 

    - 두 가지 베이스 1) ORM 표준 Hibernate 기반 JPA / 2) Java DB 커넥션 표준인 JDBC 

    - 레포지토리 패턴, 커스텀 객체 매핑 추상화, 도메인 기본 클래스 구현, 이벤트 상태 지원(생성, 마지막 변경), 등

     

    Spring Data Commons

    - Spring Data xx기반 디펜던시들은 Spring Data Commons기반으로 되어있음 

    - Repository(=PK지정) / CrudRepository(=PK를 이용해서 데이터를 찾고 CRUD수행을 간단히 할 수 있도록 추상화시켜 놓음)

    - vs JPA ) 실제 JPA사용한다면 Entity 클래스를 만들고 객체를 생성해 영속성 콘텍스트에 데이터를 넣고 커밋을 수행 / Spring Data JPA는 이를 하나의 메서드에 추상화했기 때문에 한 번에 수행할 수 있음

     

    Spring Data JDBC

    - 등장 배경 

      - JPA의 좋은 기능들의 단점 -> lazy loading 발생 시점을 명확하게 알 수 없어 원하지 않는 순간에 성능적인 영향을 초래할 수 있음. 객체 초기화 시 프락시 객체에 대한 오류처리가 필요함 

      - JPA가 가진 기술들로 인해 사용하기 어려운 요소를 제거하고 가능한 CRUD 기본작업에 충실한 모듈이 Spring Data JDBC

    - 일반적인 Spring JDBC랑 차이 있음

      - JDBC -> 쿼리를 직접 입력하고 함수 형태를 직접 인터페이스로 구현해야 하는 단점

      - 이를 Spring Data Commons를 바탕으로 재구성한 것이 Spring Data JDBC

    - 구조

      - 기본적인 JDBC 영속방식을 따름 (App -> JDBC API -> JDBC Driver manager -> JDBC Driver -> DB)

      - 구현

         - CrudRepository를 상속받은 Repository 인터페이스 생성 필요 (Spring Data 기반이라 이거는 같음)

         - 연관관계 JPA의 OneToMany 라면 여기서는 MappedCollection이라는 어노테이션 사용 

    - 데이터베이스의 버전관리기술을 사용하거나 수동으로 쿼리를 서버에 질의해서 DDL을 미리 실행시켜야 함 => 우리는 디비 이미 생성된 상태니까 이건 괜찮을 듯 

    - Spring Data JDBC에서는 단방향만 접근 허용됨. 깨끗하게 모듈화 된 도메인을 얻을 수 있음 

     

    Spring Data JDBC의 ID전략

    - Row에 해당하는 고윳값 ID를 생성해야 하는 경우 

      - 보통 Auto Increment사용하지만 직접 만들고 싶을 때 Spring Data Auditing과 호환되지 않는 경우가 있음 (우아한 테크 세미나 참고 https://www.youtube.com/watch?v=cflK7FTGPlg) 

    - JPA는 @GeneratedValue 사용하는데 JDBC에서는 이걸 지원하지 않음 

      - 설정에서 DB DDL에 auto_increment설정 넣어줌 

    - save 할 때 ID값과 Persistable의 isNew에 따라 작동하는데 이거 때문에 Auditing이 원하는 대로 작동하지 않을 수 있어서 주의필요함 

     

    R2DBC란

    - Reactive Relational Database Connectivity

    - 관계형 DB + Reactive Programming (관계형 DB에 논블로킹 접근이 가능하도록)

     

    출처

    - https://blog.neonkid.xyz/223 [Spring boot] JDBC와 Spring JDBC 그리고 MyBatis

    - https://blog.neonkid.xyz/224 [Spring Data] Hibernate, JPA 그리고 Spring Data JPA

    - https://blog.neonkid.xyz/274 [Spring Data] Spring Data module

    - https://blog.neonkid.xyz/275 [Spring Data] Spring Data JDBC를 이용한 DB연동

    - https://blog.neonkid.xyz/282 [Spring Data] Spring Data JDBC를 이용한 다양한 ID전략과 수동 ID전략 구현시 주의점 

     

    읽어볼 만한 문서

    - 이명현 님 강의자료 https://docs.google.com/presentation/d/1E7Y_L8TO6ZRZfFjBO6f_GBZxzdV0Klw0XNuH1Kv4JWA/edit#slide=id.p61

    댓글

Designed by Tistory.