들어가며
지난 TIL에서 JPA를 사용하는 이유에 대해 다뤘었다.
[TIL] 06/01 항해99 21일차 - JPA를 사용하는 이유?, JPA 초기 세팅
그 이유는 알았으니 JPA의 모태인 ORM에 대해 알아볼 차례이다. 무작정 사용해보고 익히는 것도 좋지만 좋은 개발자가 되기 위해서는 그 개념도 알고 있어야한다고 생각한다.
그럼 시작해보자.
다들 알고있듯이 Java는 객체 지향 프로그래밍 언어이고, Java를 이용하는 프레임워크인 Spring(=Spring boot)에서는 주로 관계형 데이터베이스 (MySQL, Oracle 등)과 함께 사용한다.
음? 뭔가 불편하다. 객체 지향적으로 개발을 하려는데 관계형 DB를 사용한다는 건 서로 다른 목표와 동작방식을 가진 두 녀석을 함께 사용한다는 건데... 물론 많은 개발자들이 사용하고 있지만 객체 지향이면 객체 지향대로 사용하는게 맞을 것 같다는 생각이 든다.. 이를 '패러다임의 불일치'로 명명하고, 둘 간의 불일치를 어떻게 해결하면 좋을까 하는 생각에서 사용하기 시작한게 바로 JPA이다.
지난 포스팅에서 간단하게 다룬 JPA를 알기 앞서 ORM에 대한 선행 지식이 필요하다. 왜냐하면 JPA는 자바 ORM 기술에 대한 API 표준 명세, 즉 ORM 기술에 대한 인터페이스의 모음이기 때문이다.
그럼 ORM이 무엇인지 알아가면서 그 속에서 등장하는 여러가지 개념들을 짚고 넘어가보자!
ORM(Object-Relational Mapping, 객체 관계 매핑)
ORM은 이름과 같이 객체와 관계형 데이터를 매핑하기 위한 기술이다. 위에서 설명했듯이 객체 지향과 관계형 사이의 불일치를 해결하기 위한 기술로, 객체 지향 프로그래밍에서 사용하는 '클래스'와 RDB에서 사용하는 '테이블'을 자동으로 매핑해주는 역할을 한다.
그럼 어떻게 자동으로 매핑을 해줄까?
바로 Persistence Framework(이하 영속성 프레임워크)가 열심히 일해주기 때문이다. 김영한님의 JPA강의에서 Persistence Context(이하 영속성 컨텍스트)에 대해 설명해주는데, 둘의 차이가 뭐지? 같은건가?
사실 순서대로 차근차근 공부하다보면 헷갈리지 않을 부분이지만 나처럼 뒤죽박죽으로 공부하다보면 이런 궁금증이 생길 수도 있다. 응애 나 애기 백엔드
여담이지만 둘의 차이가 뭔지 알기 위해 함께 검색해보면 영속성 컨텍스트에 관한 내용만 나온다. 왜인지는 영속성 프레임워크에 대해 이해하고 알아보자.
Persistence Framework
영속성 프레임워크에 대해 알기 전에 Persistence(이하 영속성)이 무엇인지 알아야한다.
영속성(persistence)은 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다. 영속성은 파일 시스템, 관계형 테이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현한다. 영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어버리게 된다. 결국 영속성은 특정 데이터 구조를 이전 상태로 복원할 수 있게 해주어 프로그램의 종료와 재개를 자유롭게 해준다.
출처 - 영속성(Persistence)이란?
쉽게 말하자면, 프로그램을 실행하는 동안 사용되고 생성되는 수 많은 데이터들은 그 프로그램이 종료되더라도 사라지지 않고 어떤 곳에 저장될 필요가 있는데, 이 개념이 바로 영속성이다.
이 영속성의 개념을 사용하는 영속성 프레임워크는 자료를 DB에 저장하는 과정을 도와주고 자동화하는 매개 소프트웨어로, 쉽게 말하면 데이터를 가공하는 자바 객체 층과 데이터를 저장하는 DB 층 사이를 매끄럽게 연결하는 이음매로 이해하면 된다.
위의 그림에서 볼 수 있는 것처럼 영속성 프레임워크는 SQL Mapper(MyBaits 등)과 ORM(Hibernate, JPA 등)으로 나눠진다.
자, 이제 왜 둘의 차이를 구글링해도 나같은 궁금증을 가진 사람이 없는 지 알 수 있다.
영속성 프레임워크는 최상위 개념으로 JPA 내부에서 열심히 일하고 있는 영속성 컨텍스트를 포함하고 있는 녀석이기 때문이다.
궁금증을 해결했으니 다시 ORM으로 넘어가보자. ORM의 특성을 이해해고 나면 이런 생각이 들 수 있다.
와! ORM은 전부 자동으로 해줘요? 그럼 SQL Mapper 써서 SQL 쿼리문을 일일히 짤 바에는 ORM 기술만 쓸래요!
지난 포스팅에서도 비슷한 내용을 간단하게 다뤘었는데 이번에는 SQL Mapper의 대표주자인 MyBatis와 ORM의 대표주자인 JPA와의 장단점을 비교해가면서 최근 트렌드가 JPA로 넘어가는 이유와 아직도 MyBatis를 사용하는 곳이 많은 이유를 알아보자.
JPA의 장단점
장점
- 생산성
엔티티에 맞는 테이블과 DB 생성을 직접 SQL사용하는게 아닌 메소드 호출을 통해 자동으로 수행해주기 때문에 생산성이 높아진다. - 유지보수에 용이
테이블 컬럼이 하나 변경되었을 경우, MyBatis에서는 관련 DAO의 파라미터, 결과, SQL등을 모두 확인하여 수정해주어야하지만
JPA의 경우 이런 일들을 대신 수행해주기 때문에 유지보수 측면에서 용이하다. - 특정 DB에 종속적이지 않음
각각의 DB들 (MySQL, Oracle 등)마다 SQL 사용이 조금씩 다르기 때문에 개발 시 처음 선택한 DB를 나중에 바꾼다는건... 매우 힘든 일이다. 하지만 JPA는 설정파일에서 어떤 DB를 사용하고 있는 지 알려주기만 하면 얼마든지 DB를 바꿀 수 있다. - 객체 지향 중심의 개발
JPA는 객체를 이용해서 RDB에 매핑해주기 때문에 더욱 객체 지향적으로 개발할 수 있다.
단점
- 성능
메서드 호출로 쿼리를 실행다는 것은 내부적으로 많은 동작이 있다는 것을 의미하므로, 직접 SQL 호출노가다을 하는 것보다 성능이 떨어질 수 있다.
그러나 최근의 JPA는 많이 발전해서, 좋은 성능을 보여주고 있고 계속 발전하고 있다고 한다. - 가장 큰 문제 - 어렵다!
간단한 프로젝트라면 JPA를 쉽게 사용할 수 있을지 몰라도, 복잡도가 올라가는 프로젝트의 경우에는 JPA를 제대로 이해하고 적절하게 구현해야만 문제없이 사용할 수 있다. - 세밀함
메서드 호출로 SQL을 실행하기 때문에 복잡한 쿼리를 짜기가 어렵다.
MyBaits는 직접 SQL을 작성하므로 상대적으로 복잡한 쿼리를 다루기 유용하다.
이 문제는 QueryDSL이라는 오픈 소스를 사용하면 해결할 수 있다고 한다!
[JPA] Spring Data JPA와 QueryDSL 이해, 실무 경험 공유
JPA를 사용하는 건 단점을 감안하더라도 얻을 수 있는 장점이 크기 때문에 최근 트렌드(대한민국 기준)가 JPA로 변화하는 추세인건 당연해보인다.
그럼 전 세계적으로 많은 국가들이 JPA를 사용하는 데에 반해 아직도 우리나라는 MyBatis를 주로 사용하는 이유가 무엇일까?
다양한 의견이 있겠지만 몇몇 의견을 가져와보자면, 가장 큰 이유는 'MyBatis가 상대적으로 쉽기 때문'이라고 한다. 스타트업의 수가 많아지기 전까지 우리나라의 개발 시장 대부분이 SI, 금융 시장이었던 것을 생각해보면 러닝커브가 높은 JPA를 외주 개발자에게 비용을 들여서 가르치고 사용하게 하기에는 다소 무리가 있었을거고, MyBatis를 사용하는 편이 빠르고 복잡한 개발을 위해서는 더 이득이었을 것이다.
또, 기존에 MyBatis(예전에는 iBatis였다)를 사용한 프로젝트를 JPA로 바꾸는 건 쉽지 않은 작업이기 때문에 아직까지도 기존의 기술을 유지하고 있는게 아닐까. 하는 생각이다.
최근에는 SI가 아니라면 대부분 JPA를 이용하려고 하고 있다고 하니 JPA를 제대로 학습하고 이용하도록 공부하는게 좋다고 생각한다!
마치며
JPA를 디테일하게 공부하고 작성을 하려고 하니 너무 호흡이 길어져서 ORM을 먼저 정리하려고 했는데 투머치토커인 나로써는 짧게 줄이기가 어려웠다. 그래도 여러가지를 안다는 건 재밌는 일이니까 다음 번에 JPA를 제대로 다뤄보기로 하자!!
출처 및 참고
[ Java ] Persistence Framework / JPA / ORM / Hibernate ORM / SQL Mapper ( MyBatis )
[Framework] 영속성 프레임워크(persistence framework)
🙈[Spring JPA] ORM과 JPA 그리고 Hibernate🐵
[Java] ORM이란? MyBatis와 JPA의 차이, MyBatis보다 JPA를 사용해야 하는 이유
'Study > Spring boot' 카테고리의 다른 글
[Spring boot] RestControllerAdvice를 이용한 예외 처리 (0) | 2022.06.13 |
---|---|
[Spring boot] 스프링 프레임워크(Spring Framework) (0) | 2022.06.09 |
[Spring boot] Ajax로 보낸 JSON 서버에서 받기 (0) | 2022.04.12 |
[Spring boot] WebClient 사용해보기 (1) | 2022.04.05 |
[Spring boot] file upload 한글 깨짐 (0) | 2022.03.23 |