[Spring] 스프링 DB 접근 기술

    Intro

    Spring을 이용하여 개발을 진행하면 백엔드에 관련된 코드를 작성하는 이상 필연적으로 DB와의 연동을 신경쓰게 된다.

    많은 기술들이 존재하지만 전부 알지는 못하고 Spring JDBC, Spring Data JDBC, JPA, Spring Data JPA정도만 알아보려고 한다. 또한 기존 JAVA의 DB연동 방식인 JDBC에 대해 조사하고, Mybatis 또한 많이 사용된다고 하는데 이에 대한 내용도 공부해보겠다.

    이 내용들은 설정 및 사용 방법에 대한 자세한 조사보다는 개념적으로 어떠한 차이들이 있고 어떠한 특징을 가지고 있는지에 중점을 두려고 한다.

    제목을 스프링 DB 접근 기술이라고 적었지만, 정확히는 JAVA에서 DB에 접근하는 기술이 더 옳은 것 같다.

    🔑 요약 : JDBC, Spring JDBC, Spring Data JDBC, Mybatis, JPA, Spring Data JPA에 대해 알아보자


    JDBC란?

    JDBC(Java DataBase Connectivity)란 Java에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다(출처 : 위키백과)

    Mysql, h2, Oracle.. 등등의 Database에 접속하여 데이터들을 조작(생성, 수정, 삭제 등)하기 위해 사용하는 것이다.

    즉 JDBC는 애플리케이션과 DBMS간의 통신을 중간에서 번역해주는 역할을 한다.

    출처: https://thefif19wlsvy.tistory.com/249

    DBMS란?
    D
    ataBase Manage System으로, 데이터베이스를 관리하기 위해 사용하는 소프트웨어를 뜻한다.(Mysql, h2, Oracle 등등이 DBMS임) DBMS에는 관계형 DBMS(RDBMS) 와 비관계형 DBMS로 나뉘게 된다.
    RDBMS 예시 : Myslq, Oracle
    비관계형 DBMS 예시 : NoSQL, MongoDB

    JDBC를 이용해서 Java와 DB를 연결하기 위해서는 JDBC 드라이버를 설치하고 JDBC 드라이버를 로딩하여야 한다.

    JDBC 드라이버란, DB와의 통신을 담당하는 인터페이스로 각 DB에 알맞는 드라이버가 존재한다.

    주요 클래스 및 인터페이스는 아래와 같다.

    • java.sql.Driver : DB와 연결하는 Driver class를 만들 때 반드시 필요한 interface
    • java.sql.Connection : 특정 데이터베이스와 연결정보는 가지는 interface, DriverManager로부터 Connection 객체를 가져온다
    • java.sql.Statement : SQL 쿼리문을 DB에 전송하는 방법을 정의한 interface
    • java.sql.ResultSet : Select 구문 실행 결과를 조회할 수 있는 방법을 정의한 interface
    • java.sql.PreparedStatement : Statement의 하위 interface. SQL문을 미리 컴파일하여 실행 속도를 높임
    • java.sql.CallableStatement : PreparedStatement의 하위 interface, DBMS의 Stored procedure을 호출함

    Spring JDBC

    Spring JDBC는, Spring 프레임워크의 일부로서 오리지널 JDBC를 사용할 때에 PreparedStatement, CreateStatement, ResultSet 등 자주 사용하는 객체와 코드들을 클래스화하여 이를 통해 더 간결한 코드로 DB에 접근할 수 있게 해주는 기술이다.

    Spring Data JDBC 특징

    • DataSource 추상화
      • DataSource란, 데이터베이스 연결 풀을 관리하기 위한 인터페이스이다.
      • DataSource를 사용하여 DB 연결 및 트랜잭션 관리를 편리하게 처리할 수 있다.
    • 예외 처리 및 자원 관리
      • JDBC 작업에서 발생하는 예외를 일관되게 처리하고, 연결 및 리소스 관리를 자동으로 처리함
    • SQL문 실행 및 매핑
      • 간단하고 직관적인 방식으로 SQL문을 실행하고, 결과를 자바 객체로 매핑하는 기능을 제공함
    • Transaction 관리
      • 트랜잭션 경계 설정, 롤백, 커밋 등의 작업을 편리하게 처리할 수 있음
    • 다양한 Callback 및 템플릿
      • JdbcTemplate, NamedParameterJdbcTemplate, SimpleJdbcTemplate등 다양한 템플릿과 콜백 기능을 제공
      • 이를 통해 반복적인 JDBC 코드 작성을 간소화하고, 일관성 있는 방식으로 DB 엑세스 작업을 수행할 수 있음

    JdbcTemplate의 기능

    • execute() 메서드 등을 사용하여 INSERT, UPDATE, DELETE 등의 데이터 변경 작업을 실행할 수 있고, query() 메서드를 사용하여 SELECT문을 실행하고 결과를 반환할 수 있음
    • PreparedStatement를 사용하여 SQL문을 실행한다. SQL 파라미터 값을 설정하기 위해 ?(placeholder)을 사용하고, JdbcTemplate이 자동으로 PreparedStatement를 생성하고 파라미터 값을 설정한다. 이를 통해 SQL Injection 공격을 방지함
    • ResultSet을 자동으로 자바 객체로 매핑함
    • 트랜잭션 경계 설정, 롤백, 커밋 등의 작업을 편리하게 처리할 수 있음
    • @Transactional 애노테이션을 사용하여 메서드 레벨에서 트랜잭션을 선언할 수도 있다.
    • JDBC 작업에서 발생하는 예외를 일관되게 처리하고, 연결 및 리소스 관리를 자동으로 처리한다. 또한 자원의 올바른 해제를 보장한다.

    JPA

    JPA(Java Persistence API)란 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다.

    ORM이란?
    Object-Relational Mapping 이라는 뜻으로, 애플리케이션의 Class 객체와 관계형 DB의 테이블을 매핑한다는 뜻이며, 기술적으로는 애플리케이션 객체를 RDB 테이블에 자동으로 영속화 해주는 것이다.

    JPA를 사용한다면, SQL 중심이 아닌 객체 중심으로 개발을 진행할 수 있다. 따라서 생산성 및 유지보수적인 측면에서 유리함이 있다.

    그렇다면 객체들 사이에 있는 상속 관계를 RDB는 지원하지 않는데, 이러한 부분을 JOINED 전략, SINGLE_TABLE 전략, CLASS_PER_TABLE 전략 등으로 해결을 하였다고 한다.


    MyBatis

    MyBatis란 자바 개발자들이 데이터베이스를 쉽게 다룰 수 있도록 도와주는 오픈소스 ORM 프레임워크이다.

    MyBatis를 이용하여 SQL문과 프로그래밍 언어코드를 분리하여 유지보수 및 생산성을 높일 수 있다.

    MyBatis 장점

    • 유연성: SQL쿼리를 직접 작성할 수 있다. 또한 동적 쿼리도 작성할 수 있다.
    • 간결성: SQL쿼리와 프로그래밍 언어 코드를 분리하기 때문에 코드가 간결해져 유지보수에 용이해진다
    • 성능: 캐시 기능을 제공하여 DB연산 속도를 높일 수 있다.
    • 다양한 DB 지원

    MyBatis 단점

    • 테이블 및 클래스가 변경될 때마다, 매핑에 대한 부분을 수정해야 하는 번거로움이 있다
    • 런타임을 해야 오류를 확인할 수 있다
    • 데이터베이스 변경 시 로직 또한 같이 수정하여야 한다

    MyBatis는 메서드가 있는 클래스를 만들고 나서, 클래스(인터페이스)와 연결될 Mapper 파일(XML)을 만든다. 그리고 Mapper 파일 내부에 메서드 별로 SQL쿼리를 작성하는 방식으로 사용할 수 있다.


    Spring Data Project

    자료에 관한 공부 및 조사를 진행하다 보니 Spring JDBC와 Spring Data JDBC 등 이름이 업그레이드 된 같은 것이라고 생각하였는데 아아니었다..! Spring Data ~ 에 관한 Module들은 스프링에서 일관된 DB접근을 위한 추상화된 모델을 제공하는 Dependency라고 한다.

    이러한 Dependency들은 Spring Data Commons를 기반으로 되어 있는데, 제공하는 기능 중 강력한 기능 중 하나가 바로 강력한 Repository패턴이다. 특히 CrudRepository는 데이터에서 가장 많이 사용되는 Create, Read, Update, Delete인 CRUD를 정의한 Repository이다. 또한 @Query 애노테이션을 통해 직접적으로 SQL문을 작성할 수도 있는데, 이러한 이유로 선택적인 ORM 기술이라고 한다.

    Spring Data의 특징

    • 강력한 저장소 및 사용자 정의 객체 매핑 추상화
    • 저장소 메소드 이름으로부터 동적 쿼리 파생
    • 기본 속성을 제공하는 Implementation domain 기본 클래스
    • transparent auditing을 위한 지원(created, last changed)
    • 사용자 정의 저장소 코드를 통합할 수 있는 가능성
    • JavaConfig 및 custom XML namespaces를 통한 손쉬운 Spring과의 통합
    • Spring MVC 컨트롤러와의 향상된 통합
    • cross-store persistence에 대한 실험적 지원

    주요 모듈로는 아래와 같은 모듈들이 존재한다


    Spring Data JDBC

    Spring Data JDBC는 Spring Data Commons를 바탕으로 JDBC를 적용한 것이다.

    Spring Data JDBC는 개념적으로 쉬운 것을 목표로 하기 때문에, 캐싱, 지연 로딩 등 JPA의 다른 많은 기능들을 제공하지 않는다.

    MyBatis 쿼리, @Query 애노테이션을 지원하며, @EnableJdbcRepositories를 통해 JavaConfig 기반 Repository를 구성할 수 있다.

    Spring Data JDBC는 기본적인 JDBC영속 방식을 따른다.

    Connection을 생성 -> Statement 객체를 이용해 쿼리 실행 방식을 따르게 된다.


    Spring Data JPA

    Spring Data JPA는 Spring 프레임워크에서 JPA를 편리하게 사용할 수 있도록 하는 프로젝트이다

    Spring Data Commons를 바탕으로 만들어졌기에 Spring Data 프로젝트의 특징을 그대로 가지고 간다.


    Outro

    처음에는 JDBC / Spring JDBC / Spring Data JDBC가 다 같은 것인 줄 알아서 간단하게 포스팅을 하려고 했는데 알아볼수록 다들 다른것이란 걸 알게 되었다. 그래서 조사하고 작성하는데 시간이 엄청 걸린 느낌이지만, 한 번 정리하고 나니 조금 더 머리속이 깔끔해졋다.

     

    JPA와 JDBC, Spring Data프로젝트를 적고나니 사용법이 아닌 개념적인 측면에서 Spring Data JDBC/JPA에 관해서 어떠한 것을 써야할 지 모르겠다. 사용법 및 다른 내용 등에 대한 부분을 추후에 별개로 포스팅할 생각이었기 때문에 너무 적어진 것 같다. 추후에 더 알게되거나 추가되는 부분이 있다면 그 때 가서 수정해야겠다.


    Reference

    https://shs2810.tistory.com/18

     

    JDBC란 무엇일까?

    Java를 공부하다보면 자연스레 JDBC 에 대한 내용도 공부해야하는데JDBC란 무엇일까?? 0. SQL에 대한 간단한 내용 - SQL : Structured Query Language, 데이터베이스 제어 언어 1) DML : Data Manipulation Language ① INSE

    shs2810.tistory.com

    https://blog.neonkid.xyz/223

     

    [Spring boot] JDBC와 Spring JDBC 그리고 MyBatis

    지난 포스트에서 MVC 패턴과 Spring Data Rest를 이용해 간단한 REST API 서버를 개발해보는 시간을 가졌었는데요. 그런데, 우리가 여기에서 DB와 연동하기 위해 사용했던 디펜던시가 있었죠. 바로 Spring

    blog.neonkid.xyz

    https://sharonprogress.tistory.com/194

     

    Spring JDBC의 정의와 특징

    Spring Framework의 특징중 Spring JDBC에 대해서 알아보자 1. Spring JDBC란 Spring JDBC는 스프링 프레임워크에서 제공하는 JDBC(Java Database Connectivity) 기반의 데이터 액세스 기술이다. JDBC는 자바 언어를 사용

    sharonprogress.tistory.com

    https://velog.io/@jh129047/JDBC-Spring-Data-JDBC

     

    [Section 3] JDBC, Spring Data JDBC

    어떠한 애플리케이션을 제작하더라도 데이터베이스와 같은 데이터 저장소와의 연동은 필수이다. 이번엔 서비스 계층에서 비즈니스 로직을 통해 처리된 데이터를 DB에 저장하고 비즈니스 로직

    velog.io

    https://dbjh.tistory.com/77

     

    [Spring JPA] JPA 란?

    이번 글에서는 JPA(Java Persistence API)가 무엇인지 알아보려고한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이

    dbjh.tistory.com

    https://ccomccomhan.tistory.com/130

     

    [JAVA] - MyBatis란?, 마이바티스란?(예제코드) 간단하고 쉽게 이해하기

    🧹 간단 정리 MyBatis를 사용하면 DB를 쉽게 다룰 수 있다. 예시) preparedstatement처럼 쿼리문을 복잡하게 입력하지 않고 실제 쿼리문과 유사하게 작성할 수 있다. preparedstatement : "UPDATE users SET name =?, e

    ccomccomhan.tistory.com

     

    댓글