[JPA] JPA를 사용해야 하는 이유

1. 반복 및 생산성 저하

기존에 JPA를 사용하기 전에는 개발자가 SQL문을 직접 작성하고 JDBC Api를 통해 SQL을 실행시킨 뒤 해당 결과를 객체에 매핑하는 역할을 수행했습니다. 이런 일련의 과정을 통해 기능 개발을 위해 추가적인 작업이 많은 단점이 있습니다. 또한, 기능이 추가될 때 마다 아래와 같은 코드를 반복해서 추가 작업해야합니다.

예시

    // sql 작성
    String sql = SELECT MEMBER_ID, NAME FROM MEMBER M WHERER MEMBER_ID = ?;
    // sql 실행
    ResultSet rs = stmt.executeQuery(sql);
    // 조회 결과 객체에 맵핑
    String memberId = rs.getString("MEMBER_ID");
    String name = rs.getString("NAME");
    Member member = new Member(memberId, name);

2. SQL 의존적 개발

요구사항변경으로 db에 필드가 하나 추가되면 기존에 작성해둔 SQL을 수정해야 하는 상황이 발생한다.
기존의 update 메서드를 실행하게 되면 추가된 필드에대한 SQL문이 작성되지 않아서 제대로 동작하지 않는다.

3. 패러다임 불일치

애플리케이션이 발전하면서 복잡도가 증가한다. 지속 가능한 애플리케이션을 만들기 위해 복잡도를 낮춰야하고 이는 객체지향 프로그래밍의 특징인 캡슐화, 상속, 추상화, 다형성으로 낮출 수 있습니다. 그러나 데이터는 영구적으로 저장되어야 하고 신뢰성 있는 RDB에 저장되는데 하나는 자바는 객체지향, RDB는 2차원으로 구조화된 데이터로 둘의 패러다임이 일치하지 않다.
이러한 패러다임을 일치 시키기 위해서 JPA를 사용한다.

상속

RDB에는 상속의 개념이 없기에 자식객체를 저장하기 위해서는 부모객체도 저장하는 SQL문을 생성해서 실행해야합니다. 이럴경우 추가적인 작업이 많아서 비용이 많이 소모됩니다.

연관 관계

자바는 객체 내에 다른 객체를 잠조하여 관계를 나타내지만, RDB는 FK를 통해 테이블간의 관계를 나타냅니다. 이 둘의 패러다임을 해결하기 위해 조인을 통해 조회한 다음에 객체에 set해야 하고 이는 패러다임을 해결하기 위해 많은 비용이 듭니다.

    아래의 과정을 개발자가 코드로 구현해야 한다.
    SELECT M.*, T.* FROM MEMBER M JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID;

    Member member = new Member(); 
    Team team = new Team();
    member.setTeam(team);

이런 관계를 JPA가 알아서 참조를 FK로 적절히 변환해서 SQL을 생성하고 실행해준다. 또한 조회할때도 FK를 참조로 변환해주는 작업도 진행합니다.

객체 그래프 탐색

객체를 사용하면 get메서드를 사용해 참조한 객체를 탐색할 수 있어야 하는데 기존의 SQL을 작성하는 방식은 SQL과 추가적인 매핑 작업에 따라 참조한 객체를 탐색하거나 하지 못하는 경우가 발생합니다. JPA는 이런 객체 탐색을 해결하기 위해 지연로딩을 지원하고 해당 객체를 사용하는 시점에 추가적인 SQL을 실행시켜 객체를 가져올 수 있고, 즉시로딩을 통해 참조하는 객체를 동시에 조회할 수도 있습니다.

비교

RDB는 pk가 동일할 때 동일하다 라고하지만 객체는 동등성과 동일성 두가지 비교방법이 있습니다. JPA는 동일 트랜잭션일 때 같은 객체가 조회되는 것을 보장합니다.

4. 데이터 접근 추상화

페이징 처리는 DBMS마다 차이를 가지고 있는데 JPA사용을 DBMS가 변경되어도 동일한 사용경험을 가질 수 있다.

5. JPA의 해결방법

JPA를 사용하게 되면 엔티티를 db에 저장할때 JPA에서 적절한 SQL을 생성해서 JDBC Api를 통해 SQL을 실행하게 되어 반복적인 작업을 해결하였고, 요구사항이 추가되어 DB에 컬럼이 추가되어도 엔티티에 필드만 생성해주면 되기에 SQL에 의존하지 않아도 됩니다.

JPA는 객체와 테이블의 매핑정보를 보고 적절한 SQL을 생성합니다. 또한 객체는 또다른 객체를 참조할 수 있고 해당 객체를 조회하는 시점에서(지연로딩) SQL문을 실행시켜 해당 정보를 가져옵니다.

정리

객체 모델과 관계형 모델의 패러다임의 불일치를 해결하기 위해 개발자가 많은 시간과 코드를 소비했다. 코드의 유지보수성을 늘리기 위해선 객제지향적으로 구성해야하는데 이러한 불일치로 인해 데이터 중심 모델로 변해갔었고, 이런문제를 해결해 정교한 객체 모델링을 유지하기 위해 JPA가 등장했습니다.