웹 서비스를 개발하고 운영하다 보면 피할 수 없는 문제 -> 데이터베이스를 다루는 일
ibatis, mybatis == SQL 매퍼(Mapper)
문제점
- 실제로 개발하는 시간 < SQL을 다루는 시간
- 객체 모델링보다는 테이블 모델링에만 집중하고, 객체를 단순히 테이블에 맞추어 데이터 전달만 함.
해결책
- 어떻게 하면 관계형 데이터베이스를 이용하는 프로젝트에서 객체지향 프로그래밍을 할 수 있을까 고민
-> JPA라는 자바 표준 ORM(Object Relational Mapping) 기술 사용
★Mybatis, iBatis는 ORM이 아니다. SQL Mapper이다. ORM은 객체를 매핑하는 것이고, SQL Mapper는 쿼리를 매핑한다
현업에서는 수십, 수백 개의 테이블이 있는데, 이 테이블의 몇 배의 SQL을 만들고 유지보수 해야 한다.
패러다임 불일치
- 관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술
- 반대로 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술
- 관계형 데이터베이스로 객체지향을 표현할 수 있을까? 쉽지 않다.
- 관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임이 다른데, 객체를 데이터베이스에 저장하려고 하니 여러 문제가 발생 -> 패러다임 불일치
객체지향 프로그래밍에서 부모가 되는 객체를 가져오려면 ?
User user = findUser();
Group group = user.getGroup();
-> User와 Group은 부모-자식 관계임을 알 수 있다.
- 여기에 데이터 베이스가 추가되면 다음과 같이 변경
User user = userDao.findUser();
Group group = groupDao.findGroup(user.getGroupId());
-> User 따로 Group 따로 조회하게 된다.
- User와 Group이 어떤 관계인지 알 수 있을까?
- 상속, 1:N등 다양한 객체 모델링을 데이터베이스로 구현 할 수 없다.
- 그러다보니 웹 어플리케이션 개발은 점점 데이터 베이스 모델링에만 집중 -> JPA가 등장
JPA
- 서로 지향하는 바가 다른 2개 영역(객체지향 프로그래밍 언어와 관계형 데이터베이스)을 중간에서 패러다임을 일치 시켜주기 위한 기술
- 개발자는 객체 지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행
- 객체 지향적으로 코드를 표현할 수 있으니 더는 SQL에 종속적인 개발을 하지 않아도 된다.
Spring Data JPA
- 인터페이스 - 자바 표준 명세서
- 인터페이스인 JPA를 사용하기 위해서는 구현체 필요
- 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용하여 JPA 기술을 다룬다.
- JPA <- Hibernate <- Spring Data JPA
Spring Data JPA가 등장한 이유?
- 구현체 교체의 용이성 : Hibernate 외에 다른 구현체로 쉽게 교체하기 위함
- Hibernate가 언젠간 수명을 다해서 새로운 JPA 구현체가 대세로 떠오를 때, Spring Data JPA를 쓰는 중이라면 아주 쉽게 교체 가능
- Spring Data JPA 내부에서 구현체 매핑을 지원해주기 때문
- 저장소 교체의 용이성 : 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함
- 서비스 초기에는 관계형 데이터베이스로 모든 기능을 처리했으나, 점점 트래픽이 많아져 관계형 데이터베이스로는 도저히 감당이 안 될 때가 올 수 있다.
- 이때 MongoDB로 교체가 필요하다면 개발자는 Spring Data JPA에서 Spring Data MongoDB로 의존성만 교체하면 된다.
- 이는 Spring Data의 하위 프로젝트들은 기본적인 CRUD의 인터페이스가 같기 때문
- Spring Data JPA, Spring Data Redis, Spring Data MongoDB 등등 Spring의 하위 프로젝트들은 save(), findAll(), findOne() 등을 인터페이스로 갖고 있다.
- 그러다 보니 저장소가 교체되어도 기본적인 기능 교체 X
실무에서 JPA
- 실무에서 JPA를 사용하지 못하는 이유?
- 높은 러닝 커브를 이야기 : JPA를 잘 쓰려면 객체지향 프로그래밍과 관계형 데이터베이스를 둘 다 이해해야 한다.
- JPA를 사용해서 얻는 보상?
- CRUD 쿼리를 직접 작성할 필요 X
- 부모-자식 관계 표현, 1:N 관계 표현
- 상태와 행위를 한 곳에서 관리하는 등 객체지향 프로그래밍을 쉽게 할 수 있다.
'스프링부트와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
8. 등록/수정/조회 API 만들기 (0) | 2022.01.19 |
---|---|
7. 요구사항 분석 (0) | 2022.01.18 |
5. Hello Controller 테스트 코드 작성하기 (0) | 2022.01.17 |
4. 스프링부트에서 테스트 코드를 작성하자 (0) | 2022.01.17 |
3. 인텔리제이에서 깃과 깃허브 사용하기 (0) | 2022.01.17 |