본문 바로가기

JPA

[JPA] JPA 란?

JPA 란 무엇인가?

JPA 란 Java Persistence API의 줄임말로 자바 진영의 ORM 기술 표준이다. 여기서 ORM 이란 Object-Relational Mapping의 줄임말로 객체와 관계형 데이터베이스를 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다. 즉 사용하는 언어가 다른 객체와 데이터베이스 사이에서 중간 매개체 역할을 해주는 고마운 친구이다. 덕분에 개발자는 데이터 중심인 관계형 데이터베이스를 사용해도 객체지향 애플리케이션 개발에 집중할 수 있다.

JPA 를 사용하는 이유

- 생산성

JPA를 사용하기 전에는 지루하고 반복적인 CRUD를 구현할때도 개발자가 직접 sql문을 짜서 개발을 해야 했다. 하지만 JPA를 사용하면 아래 코드와 같이 자바 컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달만 하면 된다.

jpa.persist(member);    // 저장
Member member = jpa.find(Member.class, memberId);    // 조회

이로써 개발자는 좀 더 객체지향적인 코드를 짤 수 있고 서비스 로직에 집중할 수 있어 개발 생산성이 높아진다.

- 유지보수

SQL에 의존적인 개발을 하게 되면 엔티티에 필드를 하나만 추가해도 관련된 등록, 수정, 조회 SQL과 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야 했다. 하지만 JPA를 사용하면 위 작업들을 JPA가 대신 처리해주기 때문에 엔티티 필드가 수정됐을때 파생되는 유지보수해야 할 코드 수가 줄어든다.

- 동일성 보장

객체 비교 방법으로는 동일성(identity) 비교와 동등성(equality) 비교 두 가지가 있는데 JPA는 같은 트랜잭션안에서 같은 객체를 조회 했을때 동일성을 보장해준다.

  • 동일성 비교는 == 연산자를 이용해 비교한다. 객체 인서터스의 주소 값을 비교하기 때문에 담고 있는 정보가 같더라도 다른 주소 값을 참조하고 있다면 false를 반환한다.
  • 동등성 비교는 equals() 메소드를 이용해 비교한다. 객체 내부의 값을 비교하기 때문에 주소값이 다르더라도 담고 있는 정보가 같다면 true를 반환한다.

아래와 같이 같은 memberId로 sql문을 통해 조회한 member 객체들을 동일성 비교하면 false가 뜨지만 JPA를 통해 조회하면 true가 리턴된다.

String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);

member1 == member2;    // false

Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);

member1 == member2;    // true

- 성능

JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공한다. 예를 들어 동일성 보장을 설명할 때 같은 member를 조회하는 경우 sql문을 사용하면 select 쿼리가 두번 나가지만 JPA를 사용하면 영속성 컨텍스트를 먼저 조회해서 조회한 회원 객체를 가져오기 때문에 select 쿼리가 한번만 나가므로 성능면에서 이점이 있다.

- 특정 데이터베이스에 종속되지 않음

관계형 데이터베이스는 데이터베이스의 종류에 따라 같은 기술도 사용법이 달라지는데 JPA는 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다. 실제로 로컬환경에서는 H2 데이터베이스를 사용하고 개발이나 상용 환경에서는 오라클이나 MySQL 데이터베이스를 사용하는데 데이터베이스 종류가 바뀌더라도 코드를 변경하지 않아도 된다.