본문 바로가기

자바 ORM 표준 JPA 프로그래밍 후기

by TheUphill 2017. 12. 13.

사설

나의 개발 커리어는 조금 특이하다면 특이할 수 있는데, 본격적으로 개발을 시작하면서부터 DB 연동을 JPA로 시작해도 무방하다는 점이다. 그래서인지 ORM 프레임워크에 대해서 거부감이 거의 없다. 종종 지인들이나 블로그로부터 듣는 얘기 중 ORM에 대한 거부감, 낮은 신뢰도 때문에 사용하기를 꺼리는 경우가 많았다. 다행인지 불행인지 나의 경험 덕분에 개인적으로는 JDBC Template이나 Mybatis같이 직접 쿼리를 작성하는 방식보다는 ORM를 사용하는걸 더 선호한다. (경우에 따라서는 위에 두 가지 기술이 더 적합한 경우도 있다. 여러 테이블에 걸쳐 있는 데이터들을 기반으로 통계, 분석용 데이터 추출에는 ORM은 적절하지 않다고 생각한다. 물론 무지에 의한 판단일지 모르겠으나 지금까지 경험상 그랬다.)

하지만 문제는 처음부터 Spring JPA를 접한 점, 그리고 체계적인 교육을 받지 못한점 때문에 JPA 스팩 및 그 구현체들에 대한 깊은 이해도 없이 막연히 사용한 점은 없지 않아 있었다. 특히 영속성 컨텍스트 및 트랜잭션 관련된 이해는 거의 전무했다. 그렇게 꽤 오랬동안 Spring JPA를 막연히 사용하다가 얼마 전 유튜브로 스프링 캠프에서 김영한 님께서 발표하신 JPA 세미나를 보고 그분이 펴내셨던 이 책을 알게 됐었다. 개인적으로 상당히 재미있게 봤었고 유익했던 발표였다. 만약 아직 세미나를 보지 않았다면 꼭 보길 추천한다.
Spring Camp 2013 Spring Data JPA(Youtube)

개요

먼저 이 책은 JPA 표준을 기본적으로 다루며 그 구현체인 하이버네이트를 메인 주제로 삼고, 그 외에 부가적인 오픈소스 프로젝트들도 곁들여서 소개해주고 있다.(예를들면 Spring Data JPA 라던지 QueryDSL이라던지 EHCACHE 등등...). 전체적인 흐름은 왜 ORM을 사용해야 하는지부터 시작해서 기본적인 ORM 매핑 방법, 데이터 조작, 영속성 컨텍스트와 같은 내부 메커니즘, 성능 향상 그리고 사용하면서 흔히 발생하는 오류 및 실수들에 대해서 자세히 설명해준다.

1장. JPA 소개

JPA가 왜 좋은지 적나라하게 소개하고 있다. 개인적으로도 최근 Mybatis로 작성된 레거시 코드들을 유지보수하면서 느꼈던 점들을 시원하게 설명해주고 있다.

2장. JPA 시작

튜토리얼 정도의 내용이다. 처음 JPA를 접하는 사용자들에게 환경 구성 및 어떤 기술들이 사용되는지 간략하게 알려준다.

3장. 영속성 관리

JPA 내부에서 관리되는 엔티니 매니저와 영속성 컨텍스트에 대해 설명해준다. 개인적으로 꼭 필요했던 내용인데, 단순하게 실무에서 코드만 작성하면서는 알기 어렵지만 JPA를 사용하는 데 있어서 필수적인 내용이라고 생각한다. 기억이 맞다면 김영한 님의 유튜브 강의에서도 특히 영속성 컨텍스트를 제대로 이해해야지 JPA를 쓸수 있다고 언급했던 것 같다.

4장. 엔티티 매핑

JPA 사용하는 데 있어 가장 기본적인 테이블-객체(클래스)간의 매핑 방법에 관해 설명해준다. 가장 기본적이면서도 가장 많이 사용되는 중요한 기능들이다.

5장. 연관 관계 매핑 기초

테이블 간의 연관관계를 어떻게 객체 간의 연관 관계로 표현하는지 알려준다. 개인적으로 연관 관계의 주인(Onwer) 개념을 예전부터 헷갈리면서 mappedBy@JoinColumn을 어느 곳에 명시해야 되는지 매번 헷갈렸는데, 이번 기회에 개념을 정리할 수 있었다.

6장. 다양한 연관 관계 매핑

좀 더 복잡한 연관 관계들(단방향, 양방향, 다중성)을 어떻게 표현하는지 다룬다.

7장. 고급 매핑

상속관계, 복합키(2개 이상의 필드를 PK로 갖는 키) 및 조인 테이블등 좀 더 복잡한 테이블 매핑관계를 사용하는 방법을 설명해준다. 특히 객체지향의 상속 관계를 관계형 데이터베이스로 표현하는 다양한 방법을 소개해주는데 개인적으로 흥미로웠던 주제이다.

8장. 프록시와 연관관계

연관 관계를 맺은 엔티티를 조회할 때 전략인 Lazy loading, Eager loading 방법 및 Lazy loading을 사용했을 때 반환되는 Proxy 객체에 대해 자세히 다룬다. 개인적으로 충격받은 파트인데 이 부분을 읽기 전에는 프록시 객체에 대해 전혀 모르고 있었다...

9장. 값 타입

JPA에서 다루는 데이터는 크게 엔티티 타입과 값 타입으로 나눌 수 있는데 이 둘의 차이에 대해서 다룬다. 또한 1:N 관계를 테이블을 엔티티를 이용한 join이 아닌 collection 기능을 사용해 매핑하는 방법을 알려준다.

10장. 객체지향 쿼리 언어

JPA에서 지원하는 쿼리 기반의 데이터 검색 기능인 JPQL 및 JPQL을 좀 더 간편하게 사용할 수 있는 Criteria 및 QueryDSL 사용 방법을 다룬다.

11장. 웹 애플리케이션 제작

앞서 세부적으로 살펴보았던 기능들을 실제 어플리케이션에서 어떻게 적용하는지 보여준다. Maven & Spring을 이용한 어플리케이션 구성 과정을 설명해주는데, 실제 적용해보는데 앞서 튜토리얼로 참고하기 좋은 내용이다.

12장. 스프링 데이터 JPA

실무에서 Spring JPA를 사용하지 않고 JPA 기술을 사용하는 곳이 얼마나 있을까 싶다. 이 챕터에서는 Spring JPA 사용 방법, 특히 Hibernate에는 없는 스프링에서 추가 제공하는 다양한 편의 기능들(메소드 이름 기반 쿼리 생성, 페이징 & 정렬 등)을 설명해준다.

13장. 웹 어플리케이션과 영속성 정리

JPA를 스프링(및 J2EE) 환경에서 사용할 때 영속성 컨텍스트 및 트랜잭션의 유효 범위에 따른 주의사항들을 알려준다. 위 두 가지가 어떤 범위까지(서비스 레이어 or 요청 범위) 유효한가에 따라 지연 로딩 사용 시 주의점들을 다룬다.

14장. 컬렉션과 부과기능

컬렉션 데이터를 다룰 때 JPA 내부 동작들을 설명한다. 그 외에 @Converter, 이벤트 리스너, 엔티티 그래프 기능들 알려주는데, 개인적으로는 @Converter 기능이 꼭 필요했던 기능이라 내용을 보고 실무에 바로 활용했다.

15장. 고급 주제와 성능 최적화

JPA에서 예외 처리방법 및 롤백 정책, 엔티티 비교 방법(동일성 & 동등성), 그리고 성능을 최적화하는 다양한 방법들을 다룬다. 배치 처리 타이틀을 보고 흥미를 가졌으나, 생각했던 것 보다 획기적으로 좋은 방법은 없어서 조금 아쉬웠다. 개인적으로 데이터 갯수가 큰 상황에서의 조작 기능은 JPA보다는 순수 DBMS 친화적인 방법이 좋은것 같다.

16장. 트랜잭션과 락, 2차 캐시

가장 어려우면서도 심도있는 파트였다. DB의 동시성 제어와 데이터 정합성을 어떻게 조정하는지 설명해준다. 트랜잭션의 고립화 수준과 동시성 제어를 위한 Lock에 대한 개념이 부족하다면 이해하기 어려운 내용이다.
2차 캐시 사용법을 알려주는데 변동이 거의 없는 데이터들에 대해서 적용하면 조금의 성능 향상을 기대할 수 있을 것 같다.

감상

전반적으로 JPA에서 제공하는 기능들을 소개해주고 있을 뿐만 아니라, 개인적으로 이 책이 더 의미 있는 이유로써 객체지향 관점과 관계형 데이터베이스 관점의 설계 측면 모두를 고려해서 설명해주고 있다. 때문에 기술적으로 JPA에 접근하는 방식뿐만 아니라 설계 관점에서도 JPA를 더 잘 적용할 수 있는 방법을 생각해보게 된다.
만약 JPA를 사용해보고 싶었으나 아직 시작하지 못했거나, JPA를 쓰긴 쓰는데 그래도 좀더 깊은 이해가 필요하다면 꼭 읽어보길 추천한다.

'' 카테고리의 다른 글

Building MicroServices  (0) 2018.01.07

댓글