JPA는 Java 표준 ORM
이다.
Mybatis, iBatis는 명확하게 말하면 ORM이 아닌 SQL Mapper이다.
ORM과 SQL Mapper는 이름만 다를뿐 같은 개념인 줄 알고 있었는데 이번에 공부하면서 이 둘은 완전히 다르다는 것을 알게되었다.
SQL
과 Object
를 매핑한다.Object
와 DB 데이터
를 매핑한다.JPA를 왜 사용하는지를 보기전에 아주 적통적인 MVC패턴의 웹 개발에 대해 생각해보았다.
Controller에서 Request를 받아서 분기하고 Service에서 비즈니스 로직 처리 및 트랜잭션 관리를 하며 Dao에서 DB에 접근하여 데이터를 가져온다.
그리고 View에서 반복문을 사용하여 데이터를 출력한다.
이 과정에서 가장 오랜시간을 투자하는 부분은 DB에서 데이터를 가져오기 위해 SQL
을 작성하는 부분일 것이다.
또한 요구사항이 추가되면 그것에 대한 CRUD를 반복적으로 만들어내야 한다.
결국은 애플리케이션 개발보다 테이블 모델링에 더 집중한다.
이러한 현상이 벌어지는 이유는 웹 개발의 중심에 관계형 데이터베이스가 있고, 관계형 데이터베이스가 SQL만 인식하기 때문이다.
관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술이고 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술이다.
이렇게 서로다른 패러다임을 가지고 있음에도 객체를 데이터베이스에 저장하려고 하기때문에 패러다임 불일치가 일어난다.
JPA는 이러한 패러다임 불일치를 해결한다.
즉, JPA를 사용하면 개발자는 객체지향적인 프로그래밍을 하고 JPA는 이를 관계형 데이터베이스에 맞게 SQL을 생성하여 대신 실행해주는 역할을 한다.
그 결과 개발자는 SQL에 종속적인 개발을 하지 않아도 되는 이점을 얻는다.
또한 객체중심으로 개발을 하기때문에 생산성이 향상되고 유지보수도 편리해진다.
JPA를 사용하면 개발자가 직접 SQL을 작성하지는 않지만 JPA를 잘 사용하기 위해서는 관계형 데이터베이스에 대한 이해와 SQL에 대한 공부가 선행되어야 합니다.
JPA는 인터페이스이기 때문에 이를 사용하기 위한 구현체가 필요하다.
대표적으로 Hibernate, Eclipse Link
등이 있다.
하지만 Spring을 사용하면 이러한 구현체를 직접 다루지는 않는다.
구현체들을 좀 더 쉽게 사용할 수 있도록 Spring Data JPA
라는 모듈을 제공하기 때문이다.
위의 사진에서 관계를 보면 다음과 같다.
JPA <- Hibernate <- Spring Data JPA
사실 Hibernate를 직접사용하는 것과 Spring Data JPA를 사용하는 것은 큰 차이가 없다.
하지만 Spring Data JPA사용을 권장하는 이유는 크게 2가지 이다.
Spring Data 하위 프로젝트들은 기본적인 CRUD의 인터페이스가 같기 때문에 save(), findAll(), findOne()등을 인터페이스로 가지고 있다. 즉, 저장소가 교체되어도 기본적인 기능의 변경이 없다.
현재 자사서비스를 운영하고 있는 기업들은 대부분 SpringBoot와 JPA를 전사표준으로 사용한다고 알고 있다.
하지만 나는 SI회사에 재직중이고, 주변 개발자들도 대부분 SI를 다니고 있다.
우리회사는 물론이고 지인들의 회사에서도 JPA를 사용한다는 얘기를 들어본 적이 없다.
보통 SI기업은 Spring & Mybatis가 전사표준이다.
JPA가 이렇게 좋다는데 왜 사용하지 않을까라는 생각을 해봤고 나름대로의 생각을 적어보려고 한다.
위에 적어놓은 것들은 지극히 개인적인 생각이다.
요약하자면 개발하기도 바쁜데 언제공부해서 언제적용하냐 이거다.
하지만 자사 서비스를 운영하는 회사로 이직을 생각하거나 실력을 높히고 싶다면 개인적으로라도 공부해보는것을 추천한다.
다음 포스팅에서는 SpringBoot에서 JPA를 실제로 사용하는 것에 대해 포스팅 할 예정이다.