-
[Spring] Spring DataBackend/공부,개념 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
'Backend > 공부,개념' 카테고리의 다른 글
Local Cache, Rate Limiter (0) 2023.04.15 헥사고날 아키텍처 공부중.. (0) 2023.03.06 [Spring Boot] Validation 유효성 검증 (0) 2022.02.17 [Spring Boot] Controller의 Request data 받아오는 방식 (0) 2022.02.12 [Spring Boot] Dto와 Entity (0) 2022.02.12