오늘 과제를 빠르게 끝마치고 Spring Data JDBC 액세스 구현을 처음부터 다시 해보고자 하였다.
그래서 콘텐츠를 처음부터 살펴보았는데 JDBC의 개념부터 설명이 나왔다.
그리고 JDBC API의 사용 흐름, Connection Pool, 그러다 갑자기 Spring Data JDBC로 넘어가서 Spring Data JDBC 의 개념을 설명하기 시작했고 Spring Data JDBC vs JPA vs Spring Data JPA 의 차이점에 대해 설명하기 시작했다.
지난 주에는 API계층과 서비스 계층, 예외처리에 대한 이해를 하느라 JDBC가 눈에 잘 안들어왔던 건지.. 🤔
오늘에서야 지난 주 질의 응답 시간에 현직자 선배님께서 JDBC vs Spring JDBC vs Spring Data JDBC 도 다 다르다고 말씀 해주신 것이 생각이 났다.
그러면서 콘텐츠를 다시 읽는데 JDBC랑 Spring Data JDBC도 서로 다른데 왜 갑자기 JDBC를 설명하다 차이점에 대해서는 이야기를 하지 않고 바로 Spring Data JDBC로 넘어가는 것인가에 대한 의문과 함께 Spring JDBC는 뭐가 다른 것인지 그리고 어떨 때 뭘 쓰는 게 좋은 것인지에 대한 의문이 마구 생기기 시작했다...
구글링을 해봐도 사실 JDBC vs JPA vs Spring Data JPA vs Hibernate vs Mybatis 에 대한 비교는 많이 나오는데 Spring Data JDBC에 대한 비교는 많이 나오지 않아서 찾기가 쉽지 않았다.
🔗 9분 안에 JDBC vs JPA vs Hibernate vs Spring Data JPA
🔗 직접-코딩으로-느껴본-Spring-Data-JPA와-Spring-Data-JDBC-의-차이점
차이점이라기 보다 그냥 내가 나중에 궁금할 때 보려고 정리 해놓는 각각의 특징 정리!
🔴 JDBC (Java Database Connectivity)
JAVA 에서 데이터 베이스에 접속할 수 있도록 하는 저수준 자바 API 이다.
JDBC 드라이버를 제공하는 한 거의 모든 주요 데이터베이스 시스템과 함께 작동할 수 있다.
- JDBC를 사용하여 데이터베이스에 접속하고 SQL 쿼리를 실행할 수 있음
- 기본적인 데이터베이스 액세스 기능 제공
- SQL 작성과 결과 매핑에 대한 책임은 개발자에게 있음
✔️ 사용 고려 사항
- 복잡한 쿼리와 데이터베이스 특정 기능을 활용해야 할 때
→ 세밀한 제어와 최적화가 필요한 경우 - 저수준의 데이터베이스 엑세스 기능이 필요한 경우
❓ 저수준의 데이터베이스 엑세스란❓
개발자가 직접 SQL 쿼리를 작성하고 데이터베이스와의 상호 작용을 처리하는 기능
🔴 Spring JDBC
Spring JDBC는 이름에서 알 수 있듯이 스프링 프레임워크에서 제공하는 기술이다. 직접 상속받지 않고 추상화된 JDBC API를 제공한다.
- JDBC의 모든 저수준 처리를 스프링 프레임워크에 위임함으로써 반복적인 작업을 간소화, 개발 생산성 향상
- JdbcTemplate과 같은 추상화된 API 제공
- JdbcTemplate을 사용하여 SQL 쿼리 생행
→ 결과를 객체로 매핑하거나 컬렉션으로 반환할 수 있음 - JDBC를 기반으로 스프링의 트랜잭션 관리 및 예외처리 등의 기능과 통합되어 개발 생산성을 높임
✔️ 사용 고려 사항
- JDBC의 저수준 처리를 스프링의 추상화 계층을 통해 간소화하고 싶을 때
- 스프링의 기능이 필요할 때
🔴 Spring Data JDBC
Spring Data JDBC는 스프링 프레임워크와 통합된 JDBC 기반의 데이터 액세스 기술이다. Spring Data JDBC는 JdbcTemplate보다 더 추상화된 ORM(Object-Relational Mapping) 기능을 제공한다.
- 객체-관계 매핑을 자동화하여 개발자가 객체 중심으로 DB를 다룰 수 있다.
- 테이블과 객체 간의 매핑을 위한 애노테이션과 규칙사용
- SQL 쿼리를 직접 작성하지 않음
✔️ 사용 고려 사항
- DDD(도메인 주도 개발)과 잘 결합될 수 있는 기술
- 단순한 구현을 제공하는 ORM
- 단순한 쿼리와 CRUD 작업에 집중하고자 할 때
아래는 각 기술을 사용하여 구현한 예제들이다. 서로 동일한 것을 구현하고 있지는 않지만 차이점을 알아보기에는 충분한 자료 같았다.
(🔒비록.. 아직 구현도 안 해봤고 코드를 완벽하게 해석할 줄도 모르지만...)
🟢 구현 예제 사이트
JDBC 🔗 Baeldung - Introduction to JDBC
Spring JDBC 🔗Baeldung - Spring JDBC
Spring Data JDBC 🔗 Baeldung - Spring Data JDBC
코드를 보면서 느낀 점
사실 지금은 JDBC에 대한 장점이 와닿지 않았다. 직접 쿼리문 작성이 필요한 (복잡한 DB작업을 요구하는) 작업에서는 충분히 장점이 있을...지 몰라도 ... 직접 개발자가 DB와의 매핑을 처리하고 코드를 작성해야하는 번거로움이 매우 커질 듯 하다는 생각이 많이 들었다. 그래서인지 코드를 보는데 자꾸 머리가 복잡해지는 건.. 기분 탓이었을까..?
JDBC에 비해 Spring JDBC는 확실히 간소화된 느낌이 들었다. 그리고 스프링의 특징들과 템플릿을 통해 JDBC에 비해 많이 간결해 진 느낌을 받았다. 하지만 쿼리문과 매핑을 직접해야한다는 것이 단점 ..🥲 객체가 하나라 그래도 괜찮았지만 많아졌을 때, 복잡해졌을 때는... 흠... 비효율적일 듯 하다.
그리고 지금까지 배운 Spring Data JDBC 는 셋 중 가장 효율적이어 보였다. 가장 간결했고 자동화된 매핑을 통해 ORM 방식의 장점을 볼 수 있었던 것 같다. 사실 아직은 다른 방식을 써보지 못해 Spring Data JDBC에 대한 단점을 모르겠다. 하지만 오늘 본 글에 의하면 분명한 장점도 존재했고 이와 함께 불필요한 쿼리를 생성해 복잡성을 증가시킨다거나 간소화를 위해 유연성을 제한하는 것과 같은 단점도 있다고 한다.
정리하면서 궁금했던 것
나는 진짜 멍청한 것 같다...
사실 정리하기 전에는 세 개가 서로 다르다면서 왜 JDBC를 알려주고 차이점은 안 알려주는거지? 그리고 다르다면서 왜 굳이 알려주는 거지? 라고 생각했다...ㅎㅎ
왜냐하면 콘텐츠 어디에도 상속, 추상화 이런 이야기는 없었고 질의응답시간에 서로 다른 것이다 라는 이야기는 들었고 콘텐츠에는 갑자기 JDBC 이야기하다가 넘어가고 완전 띠용이었다?!🥲
그래서 내 질문은 "Spring JDBC, Spring Data JDBC는 JDBC를 상속받는가?" 였다.
➡️ Spring JDBC와 Spring Data JDBC는 JDBC를 직접 상속받는 것이 아니라, JDBC를 기반으로한 기술을 활용하고 추상화하여 사용한다.
- JDBC는 모든 데이터베이스와 직접적으로 상호 작용할 수 있는 Java API
- Spring JDBC는 Spring 프레임워크와 통합된 간편화된 JDBC API
- Spring Data JDBC는 Spring Data 프로젝트의 일부로 JDBC를 기반으로 ORM
답은 이렇게 결론지을 수 있었다.
나는 진짜 콘텐츠 하나 보면서 자꾸 다른 거에 꽂혀서 하루를 낭비하게 된다.. 이거 좀 고쳐야하는데.. 큰일이다..
오늘도 이거때문에 지금 벌써 네시 반이라니 😱....
블로그 정리를 안하자니 기억에 안남아서 안 하면 안 되겠고 개념정리하는 건 굳이 할 필요 없다는 이야기를 너무 많이 들어서 ... 속상...ㅜ 보여주려고 하는 건 아닌데 또 보여주려고 하는 것 처럼 보일까봐 그것도 신경쓰여 죽겄고... 미춰 버리겠당...흑 ... 딜레마..
🔴 JDBC
- [위키백과 JDBC] https://ko.wikipedia.org/wiki/JDBC
- [Oracle 공식문서] https://docs.oracle.com/javase/tutorial/jdbc/index.html
🔴 Spring JDBC
- [Spring 공식 문서] https://docs.spring.io/spring-framework/reference/data-access/jdbc.html
🔴 Spring Data JDBC
- [Spring Data JDBC 공식문서] https://spring.io/projects/spring-data-jdbc
- [Spring Data JDBC 공식문서 뽀개기 | 블로그] https://velog.io/@janeljs/Spring-Data-JDBC-1