JPA 적용 사례
- 우아한 형제들, 쿠팡, 카카오, 네이버 등등
- 조 단위의 거래금액이 발생하는 다양한 서비스에서 사용, 검증
- 최신 스프링 예제는 JPA 기본 적용
- 자바 개발자에게 JPA는 기본 기술
JPA 소개
JPA란?
자바 진영의 ORM 기술 표준
ORM(Object Relational Mapping)이란?
객체와 관계형 데이터베이스 간의 차이를 중간에서 해결해 주는 프레임워크
JPA를 사용해야 하는 이유
- CRUD SQL을 작성할 필요가 없다.
- 조회된 결과를 객체로 매핑하는 작업도 자동으로 처리해 준다. (데이터 저장 계층에 작성해야 할 코드가 1/3로 줄어든다.)
JPA로 얻는 성과
- 객체 중심으로 개발이 가능하기 때문에 생산성과 유지보수가 좋아진다.
- 텍스트 작성이 편리해진다.
SQL을 직접 다룰 때 발생하는 문제점
회원용 DAO를 이용하여 SQL을 다룰 때 발생하는 문제점을 파악해 보자.
회원 조회 기능을 개발한다고 가정할 때, 아래의 순서로 개발이 진행된다.
회원 조회 기능)
1. 회원 조회용 SQL 작성
2. JDBC API를 사용하여 SQL 실행
3. 조회 결과를 Member 객체로 매핑
추가적으로 회원 등록 기능을 개발해보자.
회원 등록 기능)
1. 회원 등록용 SQL 작성
2. 회원 객체의 값을 꺼냄 -> 등록 SQL에 전달
3. JDBC API를 이용하여 SQL 실행
두 가지 기능의 공통점은 모두 SQL작성 -> JDBC API 사용을 반복한다는 점이다.
여기에 추가적으로 수정, 삭제 기능을 추가한다면 위 작업들을 또 반복해야 할 것이다.
이러한 상황에서 자바의 '컬렉션'을 이용해 보면 어떨까?
컬렉션을 이용하면 다음과 같이 코드 한 줄로 객체를 저장할 수 있다.
list.add(member);
하지만 데이터베이스는 데이터 중심의 구조를 가지기 때문에 객체를 데이터 베이스에 저장할 수 없다.
따라서 개발자가 객체지향 애플리케이션과 데이터베이스 중간에서 변환 작업을 직접 해주어야 한다.
-> 이러한 작업은 아주 많은 SQL쿼리 작성이 요구된다.
SQL에 의존적인 개발
- 데이터 접근 계층을 사용해서 SQL을 숨겨도 어쩔 수 없이 DAO를 열어서 어떤 SQL이 실행되는지
확인해야 한다는 문제점이 발생한다.
- SQL에 의존하는 상황에서는 개발자들이 엔티티를 신뢰하고 사용할 수 없다.
- 물리적으로는 SQL과 JDBC API를 데이터 접근 계층에 숨기는 데 성공했을지라도
논리적으로는 엔티티와 아주 강한 의존관계를 갖게 된다.
정리
- 진정한 의미의 계층 분할이 어렵다.
- 엔티티를 신뢰할 수 없다.
- SQL에 의존적인 개발을 피하기가 어렵다.
JPA와 문제해결
JPA를 사용하면 객체를 데이터 베이스에 저장하고 관리할 때,
개발자 대신 적절한 SQL을 생성하여 데이터베이스에 전달한다.
JPA가 제공하는 CRUD API 기능을 간단히 알아보자.
저장기능
jpa.persist(member);
조회기능
Member member = jpa.find(memberld);
수정기능
member.setName("변경할 이름");
삭제기능
jpa.remove(member);
패러다임의 불일치
객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르기 때문에 각 기능과 표현 방법도 다르다.
-> 객체와 관계형 데이터베이스의 패러다임 불일치 문제라고 한다.
1. 상속
객체 : 상속기능
테이블 : 슈퍼타입 - 서브타입 관계
2. 연관 관계
객체 : 참조
테이블 : 외래키(FK)
-> 연관관계 패러다임 불일치는 극복하기 어렵다.
3. 객체 그래프 탐색
참조를 사용해서 연관된 객체를 탐색하는 것
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
SQL 사용 : 처음 실행하는 SQL에 따라 탐색 범위가 정해진다.
JPA 사용 : 연관된 객체를 사용하는 시점에 적절한 SELECT 쿼리를 사용하므로 탐색이 자유롭다.
지연 로딩 : 실제 객체를 사용하기 전까지 데이터 베이스 조회를 미룬다.
JPA와 비교
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; //같다
-> 동일한 트랜잭션에서 조회한 엔터티는 같음을 보장한다.
정리
객체 모델과 관계형 데이터베이스 모델은 지향하는 패러다임이 다르기 때문에
이 불일치의 극복을 위해 개발자가 너무 많은 시간과 코드를 소모해야 한다.
-> JPA는 패러다임 불일치 문제를 해결해 주고 정교한 객체 모델링을 유지하게 도와준다.
JPA란 무엇인가?
JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이다.
ORM이란?
- Object-relational mapping, 말 그대로 객체와 관계형 데이터베이스를 매핑하는 것을 이야기한다.
- ORM 프레임워크가 중간에서 매핑 -> 패러다임 불일치 문제를 개발자 대신 해결해 준다.
왜 JPA를 사용해야 하는가?
- 생산성 & 유지보수
- 패러다임 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
: 애플리케이션이 특정 데이터베이스에 종속되지 않도록 한다.
결국 ORM은 객체와 관계형 데이터베이스(RDB) 두 기둥 위에 있는 기술이다.
객체 지향이라는 개념과 관계형 데이터베이스 개념을 잘 알아야 자유자재로 활용이 가능하다.
'Study' 카테고리의 다른 글
[소프트웨어 공학] 애자일(Agile) 방법론 (0) | 2025.03.03 |
---|---|
[JPA] 컬렉션과 연관 매핑 (0) | 2025.02.24 |
[점프 투 스프링 부트3] 프로젝트 구조 _ 게시판 프로젝트 (0) | 2025.02.24 |
[점프 투 스프링 부트3] 웹 서비스의 동작 이해와 URL 매핑 (0) | 2025.02.17 |
[자바 ORM 표준 JPA 프로그래밍] 2장. JPA 시작하기 (1) | 2025.02.03 |