JPA를 쓰는 이유?

JPA의 장점

모든 기술이라는 것이 다 그렇듯이, 기술을 쓰는 데에는 다 이유가 있어서 쓰는 법이다. 어떤 기술을 도입하는 데에 장점이 없다면 그 기술은 언젠가 도태되게 된다. 국내에 출판된 JPA계의 명서 자바 ORM 표준 JPA 프로그래밍 책에서는 다음과 같이 JPA의 다섯가지 장점을 제시하고 있다.

  1. 생산성
    JPA는 Java 컬렉션(Set/List) 객체에 저장하듯이 저장할 객체를 전달만 하면 된다. 이렇게 객체를 전달하면 JPA가 알아서 SQL문을 작성해 데이터베이스에 전달한다. 이 때문에 개발자는 직접 SQL문을 작성할 필요가 없어지므로 직접 작성해야 하는 코드 량이 확연히 줄어들게 된다. 이와 더불어 기존에 존재하던 IBatis/MyBatis와 달리 SQL 중심의 개발에서 벗어나 Java 코드 중심의 개발을 가능하게 한다.
  2. 유지보수
    IBatis/MyBatis를 사용할 때, 곤란 한 것 중 하나가 고객의 요구사항이 바뀌었을 때다. 만약 특정 테이블에 컬럼이 추가된다? 우선 해당 컬럼 데이터를 담을 변수를 VO(Value Object) 객체에 추가해줘야 한다. 설령 VO 객체가 아닌 Map에다 담는다 하더라도 해당 컬럼을 사용해야하는 SQL도 모두 변경해줘야 한다는 문제가 남는다. 반면 JPA는 Entity에 해당 컬럼용 변수만 추가해 주면 알아서 처리한다. 결국 개발자가 직접 추가/변경/삭제 해야 할 코드 량이 줄어들기 때문에 유지보수가 용이해 진다.
  3. 패러다임의 불일치 해결
    객체와 관계형 데이터베이스는 지향하는 목적이 다르다. 따라서 Java의 객체 구조 그 자체를 테이블 구조에 그대로 저장하는 데에는 한계가 존재한다. 이것을 패러다임의 불일치 문제라고 한다. 이러한 패러다임의 불일치 문제를 해결해 주는 것이 바로 JPA 이다. JPA가 어떻게 패러다임의 불일치 문제를 해결하는지는 다른 글에서 다루도록 하고, 현재는 JPA가 패러다임의 불일치를 해결해 준다 정도만 알고 있으면 될 것 같다.
  4. 성능
    JPA는 어플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공한다. JPA는 어플리케이션과 데이터베이스 사이에서 동작한다. 이렇게 어플리케이션과 데이터베이스 사이에 계층이 하나 더 존재한다면 최적화 관점에서 시도할 수 있는 것들이 많아진다.
  5. 데이터 접근 추상화와 벤더 독립성
    SQL 중심의 개발이 이루어 질 때는 특정 데이터베이스 벤더에 종속되는 걸 피할 수 없다. 모든 데이터베이스에서 사용할 수 있는 ANSI SQL이 존재하긴 하지만, 복잡한 통계 쿼리를 내거나 하려면 특정 벤더에서만 사용되는 SQL을 사용할 수밖에 없기 때문이다. JPA에서는 이렇게 벤더마다 SQL이 다른 것을 '방언' 이라고 표현한다. 성능 부분에서도 설명했지만, JPA는 어플리케이션과 데이터베이스 사이에 또 하나의 계층으로 존재한다. 이 때문에, 개발자는 JPA에 어떤 방언을 쓸 지 알려만 주면 알아서 해당 데이터베이스에 맞는 SQL을 작성할 수 있도록 중간 계층에서 추상화 할 수 있다. 이렇게 중간 계층에서 SQL을 추상화 할 수 있다면, 특정 데이터베이스 벤더에 종속되는 것을 피할 수 있다.

정리하며

SI 시절 IBatis/MyBatis만을 사용해본 나로서 JPA와의 첫 만남은 그야말로 신세계나 다름 없었다. SQL이 그득한 수천 줄짜리 mapper xml 파일을 만들 필요가 없었기 때문이다. 물론 JPA라고 단점이 없는 것은 아니지만, 그래도 이전에 썼던 지속성 프레임워크에 비하면 JPA가 너무나도 굉장하게 느껴졌다. 나중에는 JPA가 패러다임의 불일치를 해결하는 방법에 대해 추가로 다루어 볼 예정이다.