MyBatis의 문제점
-
이전에는 SQL매퍼를 이용해서 데이터베이스의 쿼리를 작성했었다.
-
그러다 보니 실제로 개발하는 시간보다 SQL 다루는 시간이 더 많아지는 문제점이 발생했다.
-
테이블 모델링에 집중하고 객체를 단순히 테이블에 맞추어 데이터 전달 역할만하는 개발은 분명 기형적인 형태이다.
JPA
- 자바 표준 ORM(Object Relational Mapping)
- 아직 SI 에서는 MyBatis를 많이 사용한다
- 대기업 및 자사 서비스를 개발하는 곳에서는 SpringBoot & JPA를 전사 표준으로 사용하고 있다.
Why JPA??
- 자바 클래스 이외에 DB에 접근하기 위해서 무조건 SQL을 통해야하는 상황
- 프로젝트 대부분이 어플리케이션 코드보다 SQL 가득하게 되는 것이다.
- 단순 반복 작업으로 스트레스는 받게 된다.
- 뿐만 아니라 JPA를 통해 패러다임 불일치 문제도 있다.
데이터베이스 -> 어떻게 데이터를 저장할지 초점이 맞춰진 기술
객체지향 프로그래밍 -> 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술
-
데이터베이스로 객체지향을 표현하기는 쉽지 않다.
-
패러 다임의 불일치
관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임(paradigm)이 서로 다른데, 객체를 데이터베이스에 저장하려고 하니 문제가 발생한다. 이를 패러다임의 불일치라고 한다.
객체지향
User user = findUser();
Group group = user.getGroup();
데이터베이스가 추가된 객체지향
User user = userDao.findUser();
Group group = groupDao.findGroup(user.getGroupId());
- 데이터베이스가 추가되면 부모-자식 관계인 User, Group이 따로 조회하게 된다.
- 상속, 1:N 등 다양한 객체 모델링을 DB로 구현할 수 없다.
해결사 JPA
- JPA는 이와 같은 문제를 해결하기 위해 등장했다.
- 이 둘 사이에서 패러다임 일치를 시켜주기 위한 기술이다.
- 개발자는 객체 지향적으로 프로그래밍을하고 JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행한다.
-더는 SQL에 종속적인 개발을 하지 않아도 된다.
그 결과...
- 생산성 향상은 물론이요
- 유지 보수가 정말 편하다더라
- 365일 24시간, 대규모 트래픽과 데이터를 가진 서비스에서 JPA는 점점 표준 기술로 자리 잡고 있다
JPA 최고다!!
Spring Data JPA
- JPA는 인터페이스로서 자바 표준 명세서이다.
- 인터페이스인 JPA를 사용하기 위해서 구현체가 필요하다
대표적으로 3가지
- Hibernate
- Eclipse
- Link
- 구현체들을 좀 더 쉽게 사용하고자 추상화 시킨 Spring Data JPA라는 모듈로 JPA를 다룬다.
이들 간의 관계
JPA <- Hibernate <- Spring Data JPA
- Hibernate와 Spring Data JPA 사용에 큰 차이는 없지만 Spring Data JPA 등장 이유는 있다.
- 구현체 교체 용이성
- 저장소 교체 용이성
-
구현체 교체 용이성
- Hibernate 외 다른 구현체로 쉽게 교체하기 위함
- 언제가 새로운 JPA 구현체가 대세로 떠오를 때 Spring Data JPA를 쓴다면 쉽게 교체 가능
- 예를 들어 Spring Data Redis에서
- Jedis -> Lettuce로 대세가 넘어갈 때 아주 쉽게 교체했다
-
저장소 교체 용이성
- 관계형 DB외 다른 저장소로 쉽게 교체하기 위함
- 관계형 DB에서 No SQL로 넘어가야한다면 Spring Data MongoDB로 의존성만 교체하면 된다.
- Spring Data 의 하위 프로젝트 들은 기본적은 CRUD의 인터페이스가 같기 때문이다.
즉 Spring Data JPA, Spring Data Redis, Spring Data MongoDB 등등 Spring Data의 하위 프로젝트 들은 save(), findAll(), findOne() 등 인터페이스를 가지고 있다. 그러니 저장소가 바뀐들 기본적인 기능은 변경할 것이 없다.
- 이러한 장점으로 Spring 팀에서도 Spring Data 프로젝트를 권장하고 있다.
실무에서 JPA
- 실무에서 JPA를 사용하지 못하는 가장 큰 이유는 높은 러닝 커브
- JPA를 잘 쓰려면 OOP, RDB를 잘 알아야 한다.
- 속도 이슈도 JPA에서 성능 이슈 해결책이 있으므로 네이티브 쿼리만큼 퍼포먼스를 낼 수 있다.
다음 포스트에 실습 코드를 작성해보겠습니다.
깃허브 실습 코드