본문 바로가기
DBMS || SQL_MAPPER/JPA

JPA , mybatis 와의 차이 (수정 中)

by DanteMustDie 2023. 10. 26.
728x90

JPA의 관한 기초 정보를 정리하는 글.

+2024.01.13 너무 겉핥기로 대충 익히고 정리했던 초창기의 글을 보니 틀린 내용이 꽤 많아 부끄럽다. 다행인점은 짧다면 짧고 길다면 긴 한달이란 시간 사이 올바른 내용으로 다시 이해했다는 것.

1. JPA(Java Persistent API)

JPA는, ORM 관점으로 DB와의 데이터를 주고받기 위한 API이자 프레임워크이다.

ORM을 활용할 수 있도록 해주는 Hibernate 기반으로 만들어졌으며, 이를 보다 쓰기 편하게 해주는 역할이다.

Hibernate는 ORM을 구현해주는 다양한 프레임워크중 하나이다.

 

2.ORM(Object Relational Mapping)

ORM이란 이름 그대로 DB의 데이터를 객체로 연결해준다는 의미로 쉽게 이야기 하자면 sql connction을 통한 데이터 송수신 과정을 가지곤 내가 프로그램 사용에 필요한 객체를 db에 맞게 보내고 받는지 db 확인 없이 불가능한데, 이를 코드상으로만 판단 가능하도록 해주는 역할을 한다.

기존의 개발방식은 view <-> controller <-> service <-> dao(또는 vo) <-> db 의 간편한 구조이지만
dao <-> db 과정에서 개발자가 직접 쿼리를 작성해 db에 연결해주는 과정을 필요로 했다.

순수 자바 : 접속정보를 직접 적고 connection open -> query -> commit or rollback -> close 과정을 직접 핸들링 해야했다.

mybatis(ibatis) : 순수 자바의 불편함을 개선하기위해 java <-> dbms 를 매핑하여 connection에 신경쓰지 않고,쿼리 작성에만 집중 할 수 있도록 발전하였다. 개념적으론 DB와 매핑을 해주는 ORM이지만 개발자 입장에선 파라메터(DTO,VO 등) -> 쿼리 -> DB가 매핑되어 아주 직관적인 형태이다. 그래서 이것을 SQL Mapper라고 부른다.

jpa : 이보다 더 진보되어 이젠 메서드 콜만으로 쿼리조차 신경쓰지 않도록 해준다. DB와 바인딩 된 객체(이를 Entity라 한다.) 의 변경을 감지하여 변경 된 사항에 대해서만 갱신을 한다. 간단히 말하자면 자바의 객체지향적인 관점으로 프로그램만 작성하면 db에게 데이터를 주고 받을 수 있다. 지금 생각하면 당연하다. "API"니까... 왜 이생각을 못했을까 🙃

 

3.JPA의 장ㆍ단점

장점 : - db관점이 아닌 자바, 객체 관점으로 프로그램을 작성하면 알아서 db와 데이터를 주고 받는다.

          - 신경써야 할 부분이 줄어드므로 보다 프로그램 로직에 집중 할 수 있다.

          - 기존 방식에서 query를 직접 작성해야 하는 부분이 최소한으로 줄어든다. (경우에 따라선 없다)

          - 맵핑정보가 명확하여 ERD를 보지 않아도 DB를 이해 할 수 있다.

          - DB와 통신하는 데이터를 Entity, 외부로 나가는 데이터를 DTO로 분리하여 각 객체의 고유성을 보장한다.

          - DBMS의 대한 종속성이 mybatis보다 줄어든다. ( 각 벤더에서의 일부 문법, 함수등이 달라도 문제없다.)

          - ★영속성 컨텍스트로 인해 자동으로 영속성이 보장되며 캐시 기능을 지원한다. 변경감지를 지원한다. (매우 중요)

단점 : - 객체지향 개념을 명확히 이해해야 DB설계를 의도대로 할 수 있다. (알아야할게 많아 러닝커브가 발생한다)

          - 프로그램의 기능이 복잡해 질 경우 활용 난이도가 그만큼 올라간다.

          - DBMS에서 지원하는 고유 기능을 활용하기 어렵다. (db 종속성과 상관관계이다.)

          - 상황에 따라선 query로 한번에 끝낼 수 있는데, 기존보다 과정이 추가되어 불편함을 느낄 수 있다.

          - 객체 <-> 관계관의 불일치 (세분성, 상속성, 일치, 연관성, 탐색)를 잘 고려해야 한다. *REF 참조

          - 프레임워크에게 위임하게 되므로 쿼리 성능이 직접 작성하는 mapper에 비해 떨어진다.

          - 결국 이 단점들이 엮여서 필요에 따라 쿼리를 직접 작성해야 할 때가 있다. (nativeQuery, QueryDSL)

* Entity 객체는 테이블 구조 및 데이터를 의미하고 DTO는 Entity 객체를 기반으로 view 또는 프로그램에게 보낼 때 필요한 정보만 담아 보내는 역할을 합니다. DTO, DAO, VO, ENTITY 각 차이의 대한 공부를 하면 더욱 좋습니다.

 

4. 영속성

영속성의 개념은 쉽게 이야기 하자면 한번 생성, 가공 된 데이터에 대해 프로그램이 돌고 있는동안 손실없이 지속적으로 보유하고자 하는 것이다. 그런데, 논리적으론 이러해도 일상적으로 생각하자면 한번 onload 된 프로그램이 종료되는 순간 데이터는 모두 날라가게 된다. 프로그램은 ram 위에서 동작하니까 당연한 일이다. 그렇기에 물리 저장소인 하드디스크 또는 SSD에 파일이나 데이터베이스 단위로 논리적 저장을 수행한다.

4.1 MYBATIS와 JPA의 차이

mybatis도 영속성의 성질을 가진 캐시기능은 지원하고 작성하는 요령에 따라 DBMS에 종속성을 피할 수는 있지만, JPA와의 큰 차이점은 mabatis는 결과적으론 맵핑에 충실한 맵퍼이고 JPA는 이미 구현된 API 및 프레임워크이므로 편하게 가져다 쓸 수 있으며 변경감지를 지원한다는 것이다. 이 점 때문에 가상의 데이터베이스 영역이라고 이해했고, JPA를 쓰는 이유를 못찾다가 이제야 좀 이해가 되기 시작했다.

본론으로 돌아와서 생성된 엔티티는 영속성을 관리하는 영속성 컨테스트에 관리되어 1차 캐시에서 DB로부터 조회 된 데이터를 잠시 보관 할 수 있으며 이로 인해 mybatis 환경에서 직접 변경감지를 관리해야 하는 것과 다르게 JPA는 mybatis보다 신경 쓸 것 없이 상대적으로 편하게 관리해준다.

변경감지의 유무를 이해하기 좋은 예시는, 만약 회원(user) 테이블의 email 컬럼 값을 바꾸기 위해 내가 저장하고자 한다면 mybatis는 if(!user.getEmail.equals(newEmail))  따위의 코드로 변경감지 기능을 따로 구현하지 않는다면 이전값이 동일하든 아니든 무조건 update를 실행해야하고 이의 대한 메서드 및 쿼리를 각각 작성해야 하는데 jpa에선 user.setEmail(email)으로 바인딩 후 repository.save(user) 만 한다면 자동으로 변경 된 컬럼에 대해서만 update를 수행하고 이전과 동일하다면 변경수행을 하지 않는다. 이것이 변경감지이다.

4.2 영속성 컨텍스트

영속성 컨텍스트의 1차 캐시가 비워지는 경우는 다음과 같이 3가지이다.

- commit -> 트랜젝션이 완료되어 데이터가 DB에 반영되는 시점이다. 커밋 전에는 메모리에만 데이터를 가지고 있다.

- JPQL 사용 -> 쿼리를 직접 호출하는 것으로 이는 캐시에 있는 데이터를 쓸 이유가 없어 DB 조회를 수행한다.

- 사용자 지정 flush -> 코드상으로 개발자가 임의로 캐시를 비울 수 있다.

영속성 컨테스트의 구조.. 그림엔 없지만 데이터는 당연히 DB에서 가져와 적재한다.

 

JPA에서의 데이터 기본 흐름도는 크게 보면 다음과 같다.

파란색 화살표는 INPUT 빨간색 화살표는 OUTPUT을 가리킨다.

 

 

나는 mybatis를 오랫동안 쓴 입장에서, JPA는 파일도 더 많이 써야하고 손도 많이 가고 (DTO <-> ENTITY 매핑) , 쿼리에 비해 직관적이지 못해 불편해서 왜 쓰는지 이해가 안갔는데 영속성을 이해하면서 필요성 이해가 가기 시작했다.

특히 비즈니스적인 측면에서 바라보면 JPA의 장점이 더욱 돋보인다. 서버를 자체적으로 구축하지 않는 이상 요즘은 AWS를 이용한 *MSA 구성으로 나아가는 추세인만큼 한번의 조회 자체가 비용이 발생한다. JPA는 캐시 기능 덕분에 어떠한 경우에서든 조회 비용 1회를 아껴준다. 그리고 가령 오라클로 구성된 DB를 쓰고 있었는데 어느 날 요금을 창렬로 올려버려 앞으로 다른 DB를 써야 될 일이 생긴다면 오라클 -> MYSQL같은 기타 DB로 마이그레이션 작업을 해야한다. 이 작업도 상당히 만만치 않고, DBA에게 위탁하면 비용이 꽤 비싸다. 프레임워크만 바꿔서 돈을 아껴준다니? 기업 입장에선 당연히 안쓸수가 없다.

*MSA의 아주 기초적이고 짧은 요약성 의의는 1서버 1도메인으로 구성된 일종의 모듈성을 띄는 서비스를 의미하며, 이를 병렬로 구성해 사용자 입장으론 통합된 하나의 큰 서비스로 보이는 것을 의미합니다. (얘도 자세히 파고들면 내용 많아요)

REF ::

https://eun-jeong.tistory.com/31

 

[DB] ORM (Object Relational Mapping) 사용 이유, 장단점

ORM (Object Relational Mapping) 객체지향적 구조? 모든 데이터는 객체이며, 각 객체는 독립된 데이터와 독립된 함수를 지님 SQL 구조? 데이터는 테이블 단위로 관리되며 객체들을 조회하기 위한 명령어

eun-jeong.tistory.com

https://youtu.be/kJexMyaeHDs?si=ljMuKuRLDIct31Xq

 

반응형