기록방

스프링 JPA? MyBatis? Hibernate? 본문

FrameWork/스프링

스프링 JPA? MyBatis? Hibernate?

Soom_1n 2023. 1. 27. 00:53
해당 포스팅은 노션에서 작성되었습니다 더 이쁘게 보러 가기

🚀 JPA란?

Java Persistence API

  • 자바 진영에서 만든 ORM 기술 표준
  • 스프링 진영에서 스프링프레임워크, "스프링 데이터 JPA"라는 기술로 적극 지원
  • 전자정부 표준 프레임워크의 ORM 기술도 JPA
  • spring.io의 Spring Data JPA : overview

어플리케이션과 JDBC 사이에서 동작하는 JPA
JPA와 구현체들

🔹 Persistence(영속성)

  • 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
    • 객체 상태는 프로그램이 종료되면 휘발하는 데이터 형태

Mark Richards의 소프트웨어 아키텍처 패턴
Data Access Layer

  • Object Persistence(영구적인 객체)
    • 메모리 상의 데이터를 파일 시스템, 관계형 DB 혹은 객체 DB 등을 활용하여 영구적으로 저장하여 영속성 부여
    • 데이터를 DB에 저장하는 3가지 방법
      1. JDBC
      2. Spring JDBC (Ex. JdbcTemplate)
      3. Persistence Framework (Ex. Hibernate, Mybatis 등)
  • Persistence Layer
    • 프로그램의 아키텍처에서, 데이터에 영속성을 부여해주는 계층을 말한다.
    • JDBC를 이용하여 직접 구현할 수 있지만 Persistence framework를 이용한 개발이 많이 이루어진다.
  • Persistence Framework
    • JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동을 보장한다.
    • Persistence Framework는 SQL MapperORM으로 나눌 수 있다.
      • Ex) JPA, Hibernate, Mybatis

🔹 JDBC

Java Database Connectivity

  • java에서 DB에 접속할 수 있도록 하는 java API
  • java 어플리케이션에서 DBMS 종류에 상관 없이, 하나의 JDBC API를 이용해 DB 작업
  • 각각의 DBMS는 이를 구현한 JDBC 드라이버 제공
  • 단점
    • 간단한 SQL문도 중복 코드 반복 사용
    • Connection과 같은 공유 자원을 제대로 릴리즈(반환) 해주지 않으면 시스템의 자원이 바닥나는 버그 발생
    • DB에 따라 일관성 없는 정보를 가진 채로 Cheked Exception (SQLException)처리
      • Checked Exception은 컴파일 단계에서 확인 가능한 예외
        • 다른 말로는 "Compiletime Exception"
      • Checked Exception은 try/catch로 감싸거나 throw로 던지는 처리 필요
      • 예외처리를 컴파일러가 강제
      • 반대는 Unchecked Exception (Runtime Exception)
💡 Cheked Exception 이란?
 - Checked Exception은 컴파일 단계에서 확인 가능한 예외
 - 다른 말로는 "Compiletime Exception"
 - Checked Exception은 try/catch로 감싸거나 throw로 던지는 처리 필요 예외처리를 컴파일러가 강제
 - 반대는 Unchecked Exception (Runtime Exception)

🔹 SQL Mapper

  • 객체와 관계형 DB의 데이터를 개발자가 작성한 SQL로 매핑시켜주는 자바 Persistence Framework
  • 개발자가 SQL을 직접 작성, SQL문을 실행하고 얻은 데이터를 객체로 매핑해줌
  • SQL Mapper에 속하는 대표적인 프레임워크 MyBatis
  • 장점
    1. SQL을 작성 할 줄 안다면 수월하게 사용이 가능하다.
    2. 세부적인 SQL 변경시 편리하다.
    3. 쿼리 수행 결과와 객체의 필드를 맵핑 & RowMapper 재활용
    4. JdbcTemplate가 JDBC에서 반복적으로 해야 하는 많은 작업들을 대신해줌
  • 단점
    1. DBMS에 따라 SQL 문법이 다르기에 DBMS에 종속적이다.
    2. 개발시 SQL를 작성해야 한다.
    3. DBMS 변경시 SQL문의 재사용이 어렵다.
    4. 2개 이상의 DBMS 지원시 유지 보수가 어렵다.

🔸 MyBatis

  • 반복적인 JDBC 프로그래밍을 단순화
  • SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리
  • JDBC만 사용하면 결과를 가져와서 객체의 인스턴스에 매핑하기 위한 많은 코드가 필요하겠지만, 마이바티스는 그 코드들을 작성하지 않아도 도됨
  • 동적 쿼리를 작성 가능

마이바티스 데이터 Access 순서

  • 스프링 부트에서 Mapper Interface와 Mapping File을 구현
    • 자연스럽게 객체 필드와 SQL문이 맵핑 됨
  • Mapper Interface에 대한 구현체를 구현하지 않아도 Mybatis가 자동 생성
  • 장점
    • 자동으로 Connection 관리를 해주면서 JDBC를 사용할 때의 중복 작업 최소화
    • 복잡한 쿼리나 다이나믹하게 변경되는 쿼리 작성이 쉬움
    • 관심사 분리
      • DAO로부터 SQL문을 분리하여 코드의 간결성 및 유지보수성을 향상
💡 JDBC와 SQL Mapper의 단점
 - SQL을 직접 다룸으로 문제점이 생김
 - 특정 DB에 종속적으로 사용하기 쉬움
 - 테이블 마다 비슷한 CRUD SQL 작성은 DAO 개발이 매우 반복되는 작업
 - 테이블 필드가 변경될 시 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정
 - 코드상으로 SQL과 JDBC API를 분리했다 하더라도 논리적으로는 강한 의존성
 - SQL을 직접 작성 → SQL에 의존적인 개발 → DB에 항상 의존 관계를 갖게 됨

🔹 ORM

Object Relational Mapping(객체-관계-매핑)

  • 객체와 데이터베이스 관계를 매핑해주는 도구
    • 프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터를 자동 연결(매핑)
    • 중계자(통역자) 역할
  • MVC 패턴에서 모델(Model)을 기술하는 도구
  • 객체와 모델 사이의 관계를 기술하는 도구
  • 대표적인 ORM의 예시로 JPA가 있음

jpa.persist(member); // 저장
Member member = jpa.find(memberId); // 조회

🔸 ORM 사용 이유

  • OOP vs Relational Database
    • 객체 지향 프로그래밍은 클래스 이용, 관계형 DB는 테이블을 이용
    • 객체 모델과 관계형 모델 간의 불일치 존재
  • ORM을 이용하면
    • DB접근을 프로그래밍 언어의 관점으로 맞춤
    • 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결
    • SQL 문을 직접 작성하지 않고 엔티티를 객체로 표현
    • 객체를 통해 간접적으로 데이터베이스를 다룸

⇒ 데이터 베이스와 프로그래밍 언어 사이의 개념 간극을 줄여주고, 느슨하게 연결되며 테스트에 용이한 애플리케이션을 만들 수 있음

🔸 ORM 장점

  • 가독성 : 직관적인 코드
  • 생산성 : 비지니스 로직 집중 가능
  • 재사용 및 유지보수 편리성
  • DBMS에 대한 종속성 저하

🔸 ORM 단점

  • 완벽한 ORM으로만 서비스를 구현하기 어려움
    • 사용은 편리하지만 설계는 신중하게
    • 프로젝트 복잡성이 커지면 난이도도 올라감
    • 잘못 구현 시 일관성이 무너지는 문제점
  • 복잡한 쿼리 사용이 어려움
    • JPA에서는 SQL과 유사한 기술인 JPQL을 지원
    • SQL 자체 쿼리를 작성할 수 있도록 지원
    • SQL Mapper와 혼용해서 사용도 가능
  • 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어려움
    • 이미 프로시저가 많은 시스템에선 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있음

🔹 Hibernate

  • Hibernate는 JPA의 구현체 중 하나
    • Hibernate가 SQL을 직접 사용하지 않는다고, JDBC API를 사용하지 않는다는 것은 아님
    • 메서드 내부에서는 JDBC API가 동작, 단지 개발자가 직접 SQL을 작성하지 않을 뿐
💡 구현체
JPA Hibernate는 java의 interface와 해당 interface를 직접 구현한 class 관계이다.

  • JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction
    • Hibernate에서는 각각 SessionFactory, Session, Transaction으로 상속받음
    • 각각 Impl로 구현
    • 다른 구현체 써도 되지만 Hibernate는 굉장히 성숙한 라이브러리라 많이 사용
  • HQL(Hibernate Query Language)이라 불리는 매우 강력한 쿼리 언어를 포함
    • SQL과 매우 비슷하며 추가적인 컨벤션을 정의 가능
    • 완전히 객체 지향적이며 이로써 상속, 다형성, 관계등의 객체지향의 강점을 누릴 수 있음
    • HQL쿼리는 자바 클래스와 프로퍼티의 이름을 제외하고는 대소문자를 구분
    • HQL은 쿼리 결과로 객체를 반환하며 프로그래머에 의해 생성되고 직접적으로 접근
    • HQL은 SQL에서는 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공
    • HQL은 여러 테이블을 작업할 때 명시적인 join을 요구하지 않음
  • 장점
    • 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중 할 수 있으며, 객체지향 개발이 가능
    • JPA를 잘 이해하고 있는 경우, 테이블 생성, 변경, 관리가 쉽움
    • 로직을 쿼리에 집중하기 보다는 객체자체에 집중
    • 빠른 개발이 가능
  • 단점
    • 많은 내용이 감싸져 있기 때문에 알아야 할 것이 많음 == 어려움
    • 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있음 (persistence context)
    • 성능상 문제가 있을 수 있음 (이 문제 또한 잘 이해해야 해결이 가능)

 

레퍼런스

728x90