프로젝트에서 JPA를 사용하며 느꼈던 장점에 대해 작성해 보겠습니다. 크게 영속성, 자동화, 객체지향적 사고, 컴파일러의 도움 정도의 장점이 있었는데, 이를 하나씩 살펴보겠습니다. 기술을 사용하며 느꼈던 점이기 때문에 저런 시각으로 볼 수도 있구나 정도로 이해해 주시기 바랍니다.
1. 영속성
첫 번째 느꼈던 장점은 영속성을 활용할 수 있다는 점입니다. 영속성은 우리 눈에는 보이지 않는 레이어 사이의 중간 계층인데, 이를 통해 캐싱, 지연로딩과 같은 다양한 최적화 기법을 사용할 수 있습니다.
영속성 덕분에 한 번 조회된 데이터는 같은 트랜잭션의 범위 내에서는 동일성을 보장받으며, 이를 다시 조회하더라도 추가 쿼리가 발생하지 않습니다. 아래와 같이 한 번 엔티티를 찾아오면 동일한 값을 여러번 조회하더라도 데이터베이스까지 가지 않는 것입니다.
또한 지연로딩으로 한 번 데이터를 조회할 때 모든 데이터를 찾아오는 것이 아닌, 필요한 시점에 필요한 데이터를 조회할 수 있기 때문에 조회를 효율적으로 할 수 있습니다.
2. 쿼리 자동화 및 편리 기능
두 번째 장점은 자동화 입니다. 대표적으로 쿼리 자동화가 있는데, 개발자가 직접 쿼리를 작성하지 않더라도 간단한 쿼리부터 복잡한 조인, in절과 까지 다양한 최적화된(?) 쿼리를 자동으로 작성해줍니다. 이를 통해 개발자는 비즈니스 로직에만 집중할 수 있게 됩니다.
복잡한 쿼리나 쿼리를 직접 작성해야 할 경우, JPQL을 통해 객체를 대상으로 직접 쿼리를 작성할 수도 있으며, JPARepository를 활용하면 메서드 네이밍(Query Method)만으로도 그에 적합한 쿼리를 작성해줍니다.
너무 많은 자동화를 해주기 때문에 이는 단점으로 볼 수도 있습니다.
또한 Native Query가 필요할 경우 @Query 어노테이션의 nativeQuery 설정을 통해 직접 SQL문을 작성할 수도 있습니다.
3. 객체지향적 사고
세 번째 장점은 객체지향적 사고를 할 수 있다는 점입니다. 개인적으로 이 부분이 가장 큰 장점이라고 생각되는데, JPA에서 엔티티는 반대편 테이블의 외래키를 나타냅니다. MyBatis나 Jdbc 템플릿을 사용하면 외래키가 Integer, Long 등의 단순 값이지만 JPA에서는 객체가 되기 때문에 객체끼리 소통/협력을 할 수 있게 됩니다.
객체는 각자에 맞는 상태(데이터)와 행위(메서드)를 가지기 때문에 역할과 책임을 분리하고, 각 객체별로 나눠서 복잡한 문제를 효율적으로 해결할 수 있습니다.
이를 통해 도메인 모델 패턴을 효율적으로 적용할 수 있게 됩니다.
4. 컴파일러의 도움
마지막으로 컴파일 시점에 오류를 알 수 있다는 장점이 있습니다. 이를통해 내가 작성중인 쿼리가 올바른지, 틀린지를 컴파일 시점에 알 수 있으며 런타임 시점에 마음놓고(?) 이를 사용할 수 있습니다. **물론 조인 방향이 잘못되었거나 없는 데이터를 조회하는 등 잘못된 방식, 없는 데이터를 조회하게되면 런타임 시점에도 오류가 발생할 수 있습니다.
5. 정리
JPA를 사용하면 크게 영속성, 자동화, 객체 지향적인 사고, 컴파일러의 도움을 받을 수 있다는 장점이 있습니다. 이중 두드러지는 장점은 객체를 중심으로 사고할 수 있다는 점과 자동화인데, 이를 통해 개발자가 해결하고 싶은 문제에 온전히 집중할 수 있게 됩니다.