ORM과 JPA
ORM과 JPA의 소개 및 사용할 때의 장점 등을 포스팅합니다.
ORM(Object-relational mapping)
ORM(Object Relational Model 객체와 RDB의 패러다임의 불일치를 해결하고 연결한다.
RDB의 모델을 OOP에 Entity 형태로 투영시키는 방식을 사용한다.
객체와 DB에서 지원하는 대표적인 차이는 다음과 같다.
- 상속
- 연관 관계
- 데이터 타입
- 데이터 식별 방법
Java 진영에선 이러한 문제를 해결하기 위한 ORM으로 JPA가 표준으로 사용되고 있다.
JPA(Java Persistence API)
JPA 동작 원리
JPA는 애플리케이션과 JDBC사이에서 동작합니다.
JDBC를 한 번 더 감싸며 추상화한 개념이며 JPA로 온 요청을 SQL로 변환하여 DB에 접근한다.
JPA를 왜 사용해야 하는가?
- SQL 중심적인 개발에서 객체 중심의 개발
- 비슷하지만, 반복적인 SQL작성에서의 해방
- 패러다임 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
각 장점의 상세한 이유에 대해서는 https://www.inflearn.com/course/ORM-JPA-Basic/dashboard 을 듣는걸 추천드립니다.
실무에 JPA를 적용이 후 느낀 점
실무에 적용하기 시작한 게 21년 8월쯤부터 적용하기 시작하였다.
실무에 직접 사용한 지 이제 5개월 차 정도 되면서 느낀 점을 장단점을 적어보겠다.
먼저 단점부터
- JPA의 난이도? 러닝커브
- JPA를 적용하면서 느낀 아마 실무에서 전체적으로 적용하기에 가장 크게 느껴지는 단점이다.
기존의 mybatis같은 sql맵퍼를 이용하여 직접 SQL을 작성하시는 분들이 생각보다 패러다임의 변화를 받아들이는 게 늦었다.
이거 외에도 지연로딩, 즉시로딩 문제, 영속성관리에 이해부재 등으로 초반에 꽤 헤맷던 기억이 난다.
- JPA를 적용하면서 느낀 아마 실무에서 전체적으로 적용하기에 가장 크게 느껴지는 단점이다.
- 복잡한 동적쿼리의 경우 Querydsl같은 라이브러리로 해결해야한다
사실 후자의 경우에는 큰 단점이라고 느껴지진않았다.
오히려 Mybatis에서 동적쿼리 짜거나 ${}이용하여 직접 테이블명이나 컬럼명을 넣을 때보다 훨씬 간편해졋다.(IDE로부터 자동완성의 지원은 덤)
하지만 JPA의 난이도는 좀 걱정이었다.
DB의 경우 실수가 나면 굉장히 치명적이기 때문에 좀 더 조심해야 하는데 초반 몇 개월 동안 내가 작성한 것이 옳은가에 대해 고민을 많이 한 것 같았다.
하지만 이러한 점을 다 상쇄시키고도 남은 큰 장점들이 있다.
체감 순으로 정리하자면
- 개발 시 DB가 H2,mysql,mssql이든 중요하지 않다
- 로컬에선 H2 DB를 이용하여 가볍게 개발하여 굉장히 편리했다.
- 이 부분은 테스트 시에도 큰 장점인데 H2의 인메모리 DB를 사용하여 통합테스트 단계에서도 DB의 영향에서 벗어 낫지만 안정적인 테스트가 가능해진다.
- 쿼리의 오류가 현저히 줄어든다
- 일단 쿼리를 직접 짜지 않기 때문에 사용자의 오타라던가 부주의로 인한 실수가 사라진다.
- Querydsl을 사용할 경우 내부에서 쿼리 작성 시 컴파일 시점에서 오류를 알려준다.
- 위에도 언급 하여 듯이 반복적인 SQL 작업에서 해방돼서 생산성이 향상된다.
추가로 JPA를 써야만 객체지향적이다. 라고 착각이 퍼져있는 경우를 보는데 이 관점에 대해선 부정적이다.
정말 객체지향적으로 짜인 코드라면 도메인, 서비스계층이 엔티티와 결합하는 순간 객체지향적이라고 할 수 없어진다.
JPA가 객체지향에 가장 친화된 DB접근 기술인 건 맞지만 JPA를 써야만 객체 지향적이라고 볼 수는 없다.
반드시 도메인과 엔티티는 분리되어야 한다.
댓글남기기