기록방
스프링 JPA? MyBatis? Hibernate? 본문
해당 포스팅은 노션에서 작성되었습니다 더 이쁘게 보러 가기
🚀 JPA란?
Java Persistence API
- 자바 진영에서 만든 ORM 기술 표준
- 스프링 진영에서 스프링프레임워크, "스프링 데이터 JPA"라는 기술로 적극 지원
- 전자정부 표준 프레임워크의 ORM 기술도 JPA
- spring.io의 Spring Data JPA : overview
🔹 Persistence(영속성)
- 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
- 객체 상태는 프로그램이 종료되면 휘발하는 데이터 형태
- Object Persistence(영구적인 객체)
- 메모리 상의 데이터를 파일 시스템, 관계형 DB 혹은 객체 DB 등을 활용하여 영구적으로 저장하여 영속성 부여
- 데이터를 DB에 저장하는 3가지 방법
- JDBC
- Spring JDBC (Ex. JdbcTemplate)
- Persistence Framework (Ex. Hibernate, Mybatis 등)
- Persistence Layer
- 프로그램의 아키텍처에서, 데이터에 영속성을 부여해주는 계층을 말한다.
- JDBC를 이용하여 직접 구현할 수 있지만 Persistence framework를 이용한 개발이 많이 이루어진다.
- Persistence Framework
- JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동을 보장한다.
- Persistence Framework는 SQL Mapper와 ORM으로 나눌 수 있다.
- 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)
- Checked 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
- 장점
- SQL을 작성 할 줄 안다면 수월하게 사용이 가능하다.
- 세부적인 SQL 변경시 편리하다.
- 쿼리 수행 결과와 객체의 필드를 맵핑 & RowMapper 재활용
- JdbcTemplate가 JDBC에서 반복적으로 해야 하는 많은 작업들을 대신해줌
- 단점
- DBMS에 따라 SQL 문법이 다르기에 DBMS에 종속적이다.
- 개발시 SQL를 작성해야 한다.
- DBMS 변경시 SQL문의 재사용이 어렵다.
- 2개 이상의 DBMS 지원시 유지 보수가 어렵다.
🔸 MyBatis
- 반복적인 JDBC 프로그래밍을 단순화
- SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리
- JDBC만 사용하면 결과를 가져와서 객체의 인스턴스에 매핑하기 위한 많은 코드가 필요하겠지만, 마이바티스는 그 코드들을 작성하지 않아도 도됨
- 동적 쿼리를 작성 가능
- 스프링 부트에서 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가 있음
🔸 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
'FrameWork > Spring' 카테고리의 다른 글
1장 : 스프링 부트 시작하기 (0) | 2024.03.06 |
---|---|
코딩 자율학습단 8기 : 스프링 부트3 (0) | 2024.03.06 |
Bug Report : Errors 객체를 ResponseEntity body에 담아서 JSON 형태로 리턴 (0) | 2023.11.14 |
java 객체 지향 #2 (0) | 2022.09.29 |
java 객체 지향 #1 (0) | 2022.09.29 |