JPA 소개
- 자바 진영에서 하이버네이트를 기반으로 자바 ORM 기술 표준을 만들었다. 이 표준은 Interface로 구성되어 있으며, 구현체인 Hibernate, EclipseLink, DataNucleus 등이 존재한다. ORM 말 그대로 오브젝트와 관계형 데이터베이스를 매핑해준다는 말이다.
왜 JPA인가?
1. 유지보수 : SQL에 의존적이거나 비지니스로 로직이 대부분 SQL에 몰려 있는 경우 엔티티의 사소한 변경만으로도 DAO계층 까지 내려가서 코드를 모두 수정해야 했다. 이것은 SQL에 따라서 반환되는 엔티티가 정해져 있다는 것이고, 그렇기에 모든 계층에 영향을 미치게 된다.
깊이 들어가서 생각해 보자. 보통 JAVA를 사용해 개발을 할 때는 객체지향적인 코드를 작성한다. 따라서 도메인에 따라 매핑되는 엔티티들이 존재하고 이 엔티티들이 각각의 책임과 위임을 통해서 협력하여 프로그램이 동작하도록 만든다.
객체 지향에서 자주 사용되는 용어는 상속, 인터페이스, 추상화, 캡슐화 등을 사용하게 된다. 그런데 이 객체지향 개념을 RDBS에 적용시킬 수는 없다 데이터베이스의 개념과 충돌하기 때문이다. 개발자들은 잘 설계된 데이터베이스를 기준으로 엔티티를 정의해 사용한다.
이때 다음과 같은 문제점들이 발생한다.
만약 엔티티의 속성이 변경되었을 때 어디까지 변경사항이 적용되는가를 생각했을 때 JDBC API를 사용하는 곳까지 들어가서 SQL을 변경해야 한다. JDBC를 도와주는 SQL 매퍼를 사용했을 때도 어쩔 수없이 SQL을 수정하러 들어가야 한다.
이러한 문제는 오브젝트 아키텍쳐를 선택하여 개발을 진행한다고 해도 결국 개발자는 반복되는 SQL수정에 지쳐 데이터 중심 아키텍처로 변질될 가능성이 크다고 생각한다.
개발을 할 때 계층을 분할하기위해 3 Tier 계층을 나눠서 아키텍처를 설계하여 각 계층은 다른 계층에 영향을 받지 않도록 설계를 한다 했지만 데이터 중심 아키텍처로 변질되어 버린다면, 각 영역은 SQL을 통해 데이터베이스가 리턴해주는 결괏값을 알아야만 구현이 가능하고, 추가되는 요구에 따라 비슷하지만 조금 다른 메서드들과 SQL문들이 판을 치게 되어 결국 스파게티 코드가 될 가능성이 있다.
결국 분할이 의미가 없어지고 나중에는 SQL에 따라서 엔티티를 만들고 데이터를 퍼다 나르는 역할만 하게되어 객체지향 장점을 하나도 사용하지 못하게 될 것이다.
JPA는 각 계층이 SQL에 의존되어 개발되지 않도록 도와준다. 이것은 각 계층이 Interface를 통해 유연한 변경 및 신뢰성을 가질 수 있게 도와주며 각 계층들이 협력하여 개발을 할 수 있을 것이다.
2. 생산성 : JPA를 사용하게 되면 개발자는 데이터 CRUD관련된 부분을 JPA에게 맡기게 된다. 그렇기 때문에 개발자는 지루하고 반복 전인 SQL문 작성을 안 해도 되고 좀 더 비즈니스 로직에 시간을 투자할 수 있다.
3. 관계형 데이터베이스와 객체 모델링의 차이점 해결
- JPA는 상속, 연관관계, 객체 그래프 탐색, 동일성과 동등성 과같은 이 두 개의 다른 패러다임의 차이를 극복하게 해 준다.
4. 성능
- JPA는 애플리케이션가 데이터베이스 사이에서 성능 최적화 기능을 제공한다. 왜냐하면 JPA는 애플리케이션과 데이터베이스에 중간에 존재하기 때문인데, 각 비즈니스 요구에 맡게 자유로운 성능 최적화를 사용할 수 있다.
5. 추상화를 통한 확장 가능성
JPA는 중간 계층에 존재하기 때문에 변경 및 확장에 자유로움이 존재한다. 보통 데이터베이스들 마다 제공하는 SQL이 다른 경우가 많은데, JPA는 추상화된 접근 계층을 제공한다. 따라서 벤더 사는 자기 만의 Dialect를 구현한 구현체를 제공하여 의존성을 피할 수 있다.
대신 학습곡선이 가파르다. 그 이유는 공부하면서 느낀 거지만 도메인 모델링을 잘 이해할 수 있어야 하고 그에 따라 객체지향 프로그래밍을 할 수 있는 실력이 뒷받침이 되어야 한다. 또한 데이터베이스 설계 및 각 테이블관의 관계, 제약조건 , 최적화된 SQL문 , 데이터베이스 성능 관련된 공부가 필요하다.
어쩔 수 없는 게 JPA는 객체지향과 관계형 데이터베이스 위에서 동작하기 때문에 하위 항목을 에 대한 어느 정도 이해력이 존재해야 잘 사용할 수 있다. 단순히 복사 붙여 넣기로 개발을 하게 된다면 안전성과 성능적으로 더욱 안 좋아질 수 가있다.
하지만 반대로 생각해 본다면 JPA를 공부하면서 객체지향과 관계형 데이터베이스에 관련된 지식을 확장적으로 배울 수 있기 때문에 1타 3피의 효과를 볼 수 있다고 생각한다.
추가적으로 QueryDSL이나, JPQL 등 엔티티를 탐색하기 위한 JPA 전용 쿼리도 존재하기 때문에 마음 단단히 먹긴 해야 한다.
'데이터 접근 기술 > JPA' 카테고리의 다른 글
[JPA] 공부하면서 나중에 찾아볼 것들 (0) | 2021.04.17 |
---|---|
[JPA] 2차 캐시 (0) | 2021.04.17 |
[JPA] 벌크 연산 (0) | 2021.01.31 |
[JPA] JPQL JOIN (0) | 2021.01.31 |
[JPA] JPQL 기본 문법과 SELECT 절 (0) | 2021.01.31 |
댓글