JPA 이론

신광진·2021년 5월 22일
0
post-thumbnail

JPA

JPA는 Java 표준 ORM이다.
Mybatis, iBatis는 명확하게 말하면 ORM이 아닌 SQL Mapper이다.
ORM과 SQL Mapper는 이름만 다를뿐 같은 개념인 줄 알고 있었는데 이번에 공부하면서 이 둘은 완전히 다르다는 것을 알게되었다.

  • SQL Mapper
    • SQL Mapper는 SQLObject를 매핑한다.
    • SQL을 사용하여 디비를 직접 조작한다.
  • JPA
    • JPA는 ObjectDB 데이터를 매핑한다.
    • 객체를 통해 간접적으로 DB를 조작한다.
      (JPA의 구현체가 쿼리를 대신 생성해서 실행한다)

전통적인 Web개발 패턴

JPA를 왜 사용하는지를 보기전에 아주 적통적인 MVC패턴의 웹 개발에 대해 생각해보았다.
Controller에서 Request를 받아서 분기하고 Service에서 비즈니스 로직 처리 및 트랜잭션 관리를 하며 Dao에서 DB에 접근하여 데이터를 가져온다.
그리고 View에서 반복문을 사용하여 데이터를 출력한다.
이 과정에서 가장 오랜시간을 투자하는 부분은 DB에서 데이터를 가져오기 위해 SQL을 작성하는 부분일 것이다.
또한 요구사항이 추가되면 그것에 대한 CRUD를 반복적으로 만들어내야 한다.
결국은 애플리케이션 개발보다 테이블 모델링에 더 집중한다.
이러한 현상이 벌어지는 이유는 웹 개발의 중심에 관계형 데이터베이스가 있고, 관계형 데이터베이스가 SQL만 인식하기 때문이다.

JPA를 왜 사용해야 할까

패러다임의 일치와 SQL지옥 탈출

관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술이고 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술이다.
이렇게 서로다른 패러다임을 가지고 있음에도 객체를 데이터베이스에 저장하려고 하기때문에 패러다임 불일치가 일어난다.

JPA는 이러한 패러다임 불일치를 해결한다.
즉, JPA를 사용하면 개발자는 객체지향적인 프로그래밍을 하고 JPA는 이를 관계형 데이터베이스에 맞게 SQL을 생성하여 대신 실행해주는 역할을 한다.
그 결과 개발자는 SQL에 종속적인 개발을 하지 않아도 되는 이점을 얻는다.
또한 객체중심으로 개발을 하기때문에 생산성이 향상되고 유지보수도 편리해진다.

JPA를 사용하면 개발자가 직접 SQL을 작성하지는 않지만 JPA를 잘 사용하기 위해서는 관계형 데이터베이스에 대한 이해와 SQL에 대한 공부가 선행되어야 합니다.

Spring Data JPA

JPA는 인터페이스이기 때문에 이를 사용하기 위한 구현체가 필요하다.
대표적으로 Hibernate, Eclipse Link 등이 있다.
하지만 Spring을 사용하면 이러한 구현체를 직접 다루지는 않는다.
구현체들을 좀 더 쉽게 사용할 수 있도록 Spring Data JPA라는 모듈을 제공하기 때문이다.

위의 사진에서 관계를 보면 다음과 같다.
JPA <- Hibernate <- Spring Data JPA
사실 Hibernate를 직접사용하는 것과 Spring Data JPA를 사용하는 것은 큰 차이가 없다.
하지만 Spring Data JPA사용을 권장하는 이유는 크게 2가지 이다.

  • 구현체 교체의 용이성
    • 아주 좋은 JPA 구현체가 새롭게 떠오를 때, Spring Data JPA를 사용하면 구현체를 아주 쉽게 교체할 수 있다.
      왜냐하면 Spring Data JPA 내부에서 구현체 매핑을 지원하기 때문이다.
  • 저장소 교체의 용이성
    • 트래픽 등의 이유로 관계형 데이터베이스로 감당이 안될 때, 저장소를 교체해야 할 시기가 있을 수 있다.
      만약 MongoDB로 교체한다면 Spring Data JPA에서 Spring Data MongoDB로 의존성만 교체하면 된다.

Spring Data 하위 프로젝트들은 기본적인 CRUD의 인터페이스가 같기 때문에 save(), findAll(), findOne()등을 인터페이스로 가지고 있다. 즉, 저장소가 교체되어도 기본적인 기능의 변경이 없다.

이렇게 좋은데 왜 안써?

현재 자사서비스를 운영하고 있는 기업들은 대부분 SpringBoot와 JPA를 전사표준으로 사용한다고 알고 있다.
하지만 나는 SI회사에 재직중이고, 주변 개발자들도 대부분 SI를 다니고 있다.
우리회사는 물론이고 지인들의 회사에서도 JPA를 사용한다는 얘기를 들어본 적이 없다.
보통 SI기업은 Spring & Mybatis가 전사표준이다.
JPA가 이렇게 좋다는데 왜 사용하지 않을까라는 생각을 해봤고 나름대로의 생각을 적어보려고 한다.

  • 높은 러닝커브
    • 책을 읽다보니 JPA는 높은 러닝커브라는 진입장벽을 가지고 있다고 했으며 나도 동의한다.
      SI는 대부분 여유롭지 않은 기간내에 개발을 완료해서 납품해야 한다. 이러한 상황에서 기존에 사용하던 기술이 아닌 새로운 기술을 도입한다는 것은 큰 리스크가 될 수 있다고 생각한다.
  • 유지보수
    • 중소기업은 SI회사라고 해도 재정적인 안정을 위해 SM을 병행하는 경우가 많다.
      만약 JPA를 능숙하게 사용하는 개발자가 JPA를 도입하여 개발을 해놓고 퇴사한다면 그 이후에 애플리케이션 유지보수를 하기 쉽지 않을것이다.
  • SQL
    • SQL로 전부 다 해결가능한데 굳이 새로운 기술을 도입하는데 시간을 허비할 필요가 없다고 생각하는것 같다.
      실제로도 쿼리를 예술로 짜는 개발자들은 아주 많다고 생각한다.

위에 적어놓은 것들은 지극히 개인적인 생각이다.
요약하자면 개발하기도 바쁜데 언제공부해서 언제적용하냐 이거다.
하지만 자사 서비스를 운영하는 회사로 이직을 생각하거나 실력을 높히고 싶다면 개인적으로라도 공부해보는것을 추천한다.
다음 포스팅에서는 SpringBoot에서 JPA를 실제로 사용하는 것에 대해 포스팅 할 예정이다.

profile
이거 왜안되냐

0개의 댓글