JPA는 언제 필요하고 언제 필요하지 않은지 설명해주실 수 있을까요?
JPA는 간단한 CRUD의 반복이 많은 프로젝트의 빠른 개발과 객체 지향적인 코드를 지향할때, 프로젝트의 확장성을 고려 할 때 와 같은 상황에서 필요합니다. 테이블 관계의 복잡도가 증가 할수록 JPA를 이용하면 DB의 테이블을 객체 지향적으로 설계한 프로젝트의 방향대로 DB를 설계 할 수 있습니다.
하지만 오히려 예를들어 select조회문이 하나만 있을 정도로 간단한 프로젝트에서는 JPA는 과도한 기술 도입 일 수도 있습니다. 또한 특정한 성능 최적화를 위해 쿼리문의 커스터마이즈가 필요한 경우 JPA의 자동 쿼리문 생성은 제한적일 수 있거나 JPA 인터페이스 내부의 이해도가 더 높아야 하는 복잡함이 증가 할 수 있습니다. 또한 JPA자체의 이해도가 부족하면 예상하지 못하는 문제가 발생 했을 때 대처하거나 스터디해야 하는 시간이 더 오래 걸릴 수 있습니다. 또한 JPA를 활용하지 않은 기존 수많은 프로젝트들과의 호환이 어려워서 전체적인 수정이 필요 할 수 있습니다.
추가질문
JPA의 핵심적인 특징은 무엇인가요?
JPA가 무엇인지 부터 간략하게 말씀드리면, JPA는 Java의 ORM 기술 표준입니다. ORM은 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는역할을 하는 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스입니다. 이를 통해 데이터를 객체지향 관점으로 바라보고 다룰 수 있게 해줍니다. Java에서 객체는 클래스를 사용하고 관계형 데이터베이스는 테이블을 사용하기 때문에 둘 사이의 패러다임 불일치를 해결한다는 점이 가장 큰 장점이라고 생각합니다.
JPA를 잘 사용하기 위해서는 객체, 관계형 데이터베이스 양쪽의 특징과 동작하는 법을 이해하고 있어야 하며 적절히 JPA와 SQL을 복합적으로 사용할 수 있어야 합니다.
가장 과거 쿼리문을 직접 개발자가 작성하고 관리해야했던 SQL 중심적인 개발 방법에서 JPA를 사용하면서 개발자는 엔티티 클래스에 집중하면서 객체의 필드, 객체간의 관계설정에 집중할 수 있게 되면서 객체 중심적인 개발이 가능하게 되었습니다. 자동으로 JPA가 쿼리문을 대신 작성해주면서 개발자의 실수가 나타날 가능성이 있는 쿼리문을 JPA가 관리하게 됩니다. 불필요한 중복 쿼리문 코드들을 제거하여 소스코드 복잡성을 낮추고 수정이나 추가 개발에서도 직접 쿼리문을 수정하지 않도록 JPA가 관리하기 때문에 소스코드의 안정성을 향상 하면서 유지보수적으로도 유리해졌습니다.
자동적으로 쿼리문을 작성해주는 JPA가 장점인 동시에 단점이기도합니다. 성능적 문제를 해결해야 하는 등 특정 상황에서는 복잡한 구조의 쿼리 문이 필요 할 수 있습니다. 하지만 템플릿화 된것 처럼 쿼리문을 생성해주는 JPA는 이런 쿼리문의 커스터마이즈 부분에서 제한적일 수 있습니다. 따라서 개발자는 JPA에만 의존하면 안되며 때에 따라 쿼리문을 직접 작성해서 성능적 문제를 해결 해야할 줄도 알아야 한다고 생각합니다.