본문 바로가기

Back-End/JPA

1장. JPA 소개

나는 개발 시작할 때부터 Spring + JPA를 사용하였기 때문에 JPA 없이 직접 SQL문을 작성하거나, JdbcTemplate을 사용해보지 않았다.  

 

JPA가 없던 시절의 고민

데이터베이스 테이블 설계는 그렇게 열심히 하면서 , 왜 객체 모델링은 대충하고 단지 테이블에 맞추는데 급급할까? 테이블을 만들고 객체는 객체스럽게 만들어도 두개 차이를 메우기 위한 SQL 작업이 너무 많아짐 -> 결국, 객체 모델이 데이터 중심의 모델로 퇴화하게 됨...

JPA가 주는 행복

  1. CRUD SQL 작성할 필요 없음
  2. 조회된 결과를 객체에 자동 매핑
  3. 객체답게 개발하다보니 유지보수도 훨씬 좋아짐

SQL을 직접 다루면?

  1. 엔티티에 필드 추가되면? -> 모든 쿼리 수정 반복,반복,반복....
  2. SQL에 의존적인 개발 -> 뭔가 잘못되면 엔티티 객체를 살펴보는게 아니라 결국 DAO 계층에 가서 쿼리를 확인함

패러다임의 불일치

객체 <-> 관계 데이터베이스 사이의 패러다임 불일치 문제를 개발자가 직접 해결하려면 많은 시간과 코드가 필요하다 이를 JPA에서 해결해주는데 어떻게 차이가 있고 JPA에서 어떻게 해결했는지 살펴보자.

 

1. 상속

데이터베이스에는 테이블 상속 개념이 없다. JPA DType

 

2. 연관관계

테이블의 외래키 대신 객체는 참조를 사용해서 연관관계를 가진다. 

대충 Join Query를 직접 작성하면 될 문제 아닌가라고 생각할 수도 있지만, 만약 Team -> Member -> Order -> OrderItem 조회처럼 객체 그래프 탐색을 해야한다면?? 이제 쿼리는 재앙이 발생한다.

 

3. 동일성 보장 ( 비교 )

  • 객체에는 동일성(==), 동등성(equals) 이라는 두가지 비교 개념이 있음
  • 데이터베이스에는 row 단위로 구분

이 때문에 이런 차이가 발생한다.

Member member1 = memberDAO.getMember(id);
Member member2 = memberDAO.getMember(id);

member1 == member2; // false

그렇다고 같은 인스턴스를 반환하도록 구현하려면 트랜잭션 상황까지 고려해야 하기 때문에 거의 불가능에 가깝다.... 하지만 JPA에서는 동등성을 보장해준다. ( 자세한 내용은 3장 https://happyer16.tistory.com/entry/%EC%98%81%EC%86%8D%EC%84%B1-%EA%B4%80%EB%A6%AC-persistence?category=744312)


JPA란 무엇인가?

Java Persistence API는 자바 진영의 ORM 기술 표준이다. ORM은 Object-Relational Mapping의 약자로, 객체와 데이터베이스를 매핑한다는 뜻이다. 

JPA를 사용하는 이유?

  1. 생산성
  2. 유지보수
  3. 패러다임 불일치 해결
  4. 성능 ( 1차 캐시 등 )
  5. 데이터 접근 추상화와 벤더 독립성

ORM에 대한 오해 1 - JPA 성능 느리지 않나요?

음 맞다고도 할 수 있고 아니라고도 할 수 있다. 왜냐하면 1차 캐시와 같은 기능 덕분에 성능이 더 좋아질 수도 있고, JPA에 대한 이해도 부족으로 조회 N+1 문제가 발생하여 성능이 떨어질 수도 있기 때문이다. 즉, JPA 책임은 아니다....

ORM에 대한 오해 2 - 통계 쿼리처럼 복잡한 쿼리짜려면 JPA 사용 못하는거 아닌가요? 

이것도 맞다고도 할 수 있지만 아니라고도 할 수 있다. JPA는 통계와 같은 복잡한 쿼리보다는 실시간 처리용 쿼리에 최적화 되어 있다. 그래서 엄청 복잡한 쿼리 같은 경우는 SQL을 직접 사용하는게 나을 때도 있다. 이것도 JPA에서 natvie Query 옵션을 사용하면 해결할 수 있는 문제이다.