ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] JPA vs JDBC
    Backend Dev/Spring Framework 2022. 12. 20. 17:39
    728x90

    JPA(Java Persistence API)란?

    자바 진영의 ORM(객체 관계 매핑) 기술에 대한 API 표준으로 SQL 중심적인 개발의 문제점을 해결해주기 위해 나온 기술이다.

     

    SQL 중심적으로 개발을 했을 경우의 문제점

    • 무한 반복, 지루한 코드 직접 작성 (CRUD)
    • SQL에 의존적인 개발 (필드 추가시 직접 SQL 수정, 객체와 SQL간 변환)
    • 패러다임의 불일치

     

    특히, 패러다임의 불일치는 객체와 관계형 데이터베이스의 차이에서 영향을 미쳐 객체 지향 프로그래밍에 맞지 않는 문제가 생기는데 상속, 연관관계, 데이터 타입, 데이터 식별 방법에서 차이가 생긴다.

     

    상속 -> 객체 상속 관계와 테이블의 슈퍼타입, 서브타입 관계에서 주키, 외래키 관리 차이

    연관관계 -> 객체는 참조를 사용하며 테이블은 외래 키를 사용

     

    결국, 객체답게 모델링 할수록 매핑 작업만 늘어나는데 이러한 객체들을 컬렉션에 저장하듯이 DB에 저장할 수는 없을까로부터 나온 기술이 JPA이다. 

     

    ORM(Object-relational mapping)은 무엇인가?

    - 객체는 객체대로 설계
    - 관계형 데이터베이스는 관계형 데이터베이스대로 설계
    - ORM 프레임워크가 중간에서 매핑
    - 대중적인 언어에는 대부분 ORM 기술이 존재

     

    JPA는 애플리케이션과 JDBC 사이에서 동작한다. ORM 기술을 통해 패러다임 불일치 문제를 해결할 수 있는 것이다.

    자바 코드를 사용해 DB에 접근할 수 있고 조작하는 기술이며 내부적으로는 JDBC API가 사용된다. JPA만 사용될 경우 EntityManager를 통해 API를 사용하여 데이터베이스에 접근하게 되는데 이를 더 편하게 모듈화시켜 모아놓은 것은 Spring Data JPA이다.

    JPA를 사용해야 하는 이유

    - SQL 중심적인 개발에서 객체 중심으로 개발
    - 생산성과 유지보수 용이
    - 패러다임의 불일치 해결
    - 성능 최적화 (1차 캐시와 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 지연 로딩)
    - 데이터 접근 추상화와 벤더 독립성
    - 표준

     

    그렇다면 JPA에서 JDBC API를 통해 어떻게 데이터베이스에 접근할 수 있는지 알아보자.

     

     

    데이터베이스 연결시 사용되는 JDBC API

     

     

    JDBC API는 자바 애플리케이션에서 데이터베이스를 연결하고 데이터를 제어하기 위한 인터페이스와 클래스들을 제공하는 API이다. JDBC DriverManager의 경우 응용 프로그램이 사용하는 데이터베이스에 맞는 드라이버를 찾아서 JDBC API가 동작하는 방식에 맞게 처리해준다. JDBC API는 변경할 필요없이 JDBC 드라이버만 변경해주면 어떤 DB든 연결 가능하다.

     

     

    순수하게 JDBC만 사용할 경우 DriverManager를 통해 쿼리 실행 전 연결하는 작업부터 시작해서 연결 생성, 명령문, ResultSet 저장 및 닫기 등과 같은 중복적인 코드들을 매 번 작성해야 하는 문제가 있었고, Connection 관리와 예외처리를 하는 데 불편함이 생겨 Spring JDBC가 나오게 되었다.

     

    SQL Mapper보다는 ORM

    Spring JDBC는 JDBC DriverManager가 하는 작업들을 JDBCTemplate에 위임하여 반복적인 작업은 줄이고 메서드에 쿼리를 직접 매핑해주고 이전에 불편했던 점들을 추상화 시켜놓은 기술이다. 쿼리들을 통해 데이터들을 조작하는데 JDBCTemplate은 SQL Mapper 중 하나라고 할 수 있다. SQL Mapper는 SQL Query로 직접 데이터베이스에 있는 데이터를 다룬다는 특징이 있다. 이와 상반되게 ORM은 객체를 통해 간접적으로 데이터베이스의 데이터를 조작한다. 

     

    JDBCTemplate, ORM은 각각 장단점이 있는데 객체 중심으로 개발이 가능하다는 점과 자주쓰는 CRUD 메소드를 직접 작성하는 작업하는 SQL 중심 개발을 최소화하기 위해 ORM 기술 표준인 JPA를 많이 사용하는 것이다. 물론 복잡성이 높은 쿼리를 해결하기에는 까다롭지만 최근에는 이러한 쿼리들과 동적 쿼리를 처리하고 안전성을 보장해주는 기술인  QueryDSL을 사용하는 경우가 많다.

    728x90

    댓글

Designed by Tistory.