[JPA] JPA 시작하기

김형진·2023년 4월 7일
0

1년차 개발자인 나는 아직 Mybatis를 이용해 쿼리를 작성하고 sql을 날린다.

어느 날 jpa를 공부하고 있는 동료를 봤는데, 그 때 당시에는 jpa에 대해 잘 몰라 왜 공부하지 싶었는데, 심심해서 한 번 사용해본 jpa는 그야말로 엄청나고 강력했다.

RDBMS와 객체지향 어플리케이션 사이의 간극에 대해 고민이 많았다.
객체의 모든 계층을 각 테이블로 표현하자니 계층이 깊어질 수록 join문이 많아지고 유지보수가 힘들어진다.
계층이 추가되거나 삭제되거나 필드가 하나 추가되더라도 엄청나게 많은 쿼리를 수정해야 했다.

그래서 현재 사용하고 있는 방법은 계층이 깊은 Entity에 대해서는 모든 계층을 스키마로 표현하지 않고 하나의 컬럼 안에 Json으로 때려박는 방법이다.
후에 필드가 추가되거나 더 깊은 계층이 생겨도 DB를 수정하지 않아도 되고 조회에도 용이하기 때문에 잘 사용하는 방법이다.

하지만 데이터를 수정하거나 조건부 검색을 하기 위해서는 json문법을 사용해야 하고 성능이 떨어진다는 분명한 한계도 있다.

객체지향 설계와 RDBMS를 완벽하게 일치시킬 방법이 없는가?

ORM

ORM은 DB내의 데이터를 객체로 매핑해주는 프레임워크이다. 자바에서는 거의 hibernate를 사용하며, 자바는 ORM을 사용하기 위해 JPA라는 표준 인터페이스를 제공한다.
(구글링을 하다보면 JPA와 하이버네이트를 혼용해서 쓰는 것 같지만 사실 다른 개념이다.)

쉽게 말해, 이전에는 개발자들이 직접 sql을 작성해 DB로부터 데이터를 가져와 객체로 변환하는 작업을 직접 했다면, ORM을 sql을 작성할 필요도, 직접 객체로 매핑할 필요도 없어진 것이다.
(심지어 DDL도 자동으로 실행해 개발환경에서는 테이블을 직접 생성해줄 필요도 없다.)

우리 팀에서는 왜 ORM을 사용하지 않고 여전히 Mybatis를 사용하는지 궁금해 ORM의 단점도 살펴봤는데, 딱히 단점이랄 만한 것을 아직 찾지 못했다.

객체 내의 모든 계층을 모두 Join하여 한 번에 매핑해야 하기 때문에 성능이슈가 있지 않을까 생각했는데 지연매핑의 기능을 통해 성능을 최적화하는 방법이 있다.

앞으로 JPA를 알아볼 생각에 넘모 설렌다

profile
히히

0개의 댓글