스프링부트에서 데이터베이스 다루기
스프링부트에서 데이터베이스를 다루는 방법에는 MyBatis와 같은 SQL 매퍼(SQL Mapper)를 이용해서 데이터베이스 쿼리를 작성하는 방법과 JPA와 같은 자바 표준 ORM(Object Relational Mapping)을 이용해서 객체지향적으로 프로그래밍 하는 방법이 있다. ORM은 객체를 매핑하는 것이고, SQL 매퍼는 쿼리를 매핑하는 것이다.
관계형 데이터베이스와 JPA
웹 애플리케이션을 개발하다보면 Oracle, MySQL과 같은 관계형 데이터베이스(Relational Database, RDB)를 많이 사용한다. 그러다 보니 객체를 관계형 데이터베이스에서 관리하는 것이 중요하다.
관계형 데이터베이스가 웹 서비스의 중심이 되면 모든 코드는 SQL 중심으로 돌아간다. 즉, 애플리케이션 코드보다 SQL 코드가 더 많아진다는 것이다. 이는 관계형 데이터베이스가 SQL을 통해서만 인식하기에 각 테이블마다 기본적인 CRUD(Create, Read, Update, Delete) SQL을 매번 생성해야 한다. 핵심은 관계형 데이터베이스를 사용해야만 하는 상황에서는 매번 생성해야 하는 SQL을 피할 수 없다는 것이다.
이러한 SQL은 두 가지 문제점이 있는데 첫 번째는 위에서 설명한 CRUD SQL의 반복적인 작업을 해야하는 것이고 두 번째는 패러다임 불일치 문제이다. 패러다임 불일치 문제는 관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임이 서로 다르다는 점에서 발생한다.
관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점을 맞추는데 반해 객체지향 프로그래밍 언어는 기능과 속성을 한 곳에서 관리한다.
아래 코드는 객체지향 프로그래밍에서 부모가 되는 객체를 가져오는 방법이다.
User user = findUser(); Group group = user.getGroup();
여기서는 User와 Group의 관계가 부모-자식 관계임을 알 수 있다. group은 User가 속한 Group을 가져온 코드라고 알 수 있기 때문이다. 하지만, 여기서 관계형 데이터베이스가 추가된다면 다음과 같다.
User user = userDao.findUser(); Group group = groupDao.findGroup(user.getGroupId());
여기서는 User와 Group을 따로 조회하기 때문에 User와 Group이 상속, 1:N 등 어떤 관계인지 알 수가 없다. 따라서, 다양한 객체 모델링을 데이터베이스로는 구현할 수 없다는 것이다.
JPA는 이러한 문제점을 해결하기 위해 등장했는데, 서로 다른 패러다임을 일치시켜주는 역할을 한다. 즉, 객체지향적으로 프로그래밍을 하면서 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행해주는 역할을 한다. 객체 중심으로 개발을 하게 되면 생산성이 향상되고 유지 보수하기가 쉬워진다.
Spring Data JPA
JPA(Java Persistence API)는 인터페이스이면서 자바 표준 명세서이다. JPA를 사용하기 위해서는 Hibernate, Eclipse Link와 같은 구현체가 필요하다. 하지만 Spring에서는 JPA를 사용할 때 이 구현체를 직접 다루진 않는다.
구현체들을 좀 더 쉽게 사용하고자 추상시킨 Spring Data JPA라는 모듈을 이용하여 다룬다. 이들의 관계는 다음과 같다.

- 구현체 교체의 용이: Hibernate 외에 다른 구현체로 쉽게 교체하기 위함. 트렌드가 바뀌어 새로운 JPA 구현체가 떠오를 때, Spring Data JPA를 쓴다면 아주 쉽게 교체할 수 있다. 이는 Spring Data JPA 내부에서 구현체 매핑을 지원해주기 때문이다.
- 저장소 교체의 용이: 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함. 초기에는 트래픽이 적어 모든 기능을 관계형 데이터베이스로 처리했지만 트래픽이 점점 많아져 감당이 안될 때 NoSQL로 교체가 필요하다. Spring Data JPA를 사용하면 의존성 교체만 해주면 된다. 이는 Spring Data의 하위 프로젝트들은 기본적인 CRUD의 인터페이스가 같기 때문에 가능하다. Spring Data JPA, Spring Data MongoDB, Spring Data Redis 등 하위 프로젝트들은 save(), findAll() 등을 인터페이스로 갖고 있다.
이러한 용이성들 때문에 Spring 팀에서도 Spring Data 프로젝트를 권장하고 있다. 하지만, 실무에서 JPA를 잘 사용하지 않은 이유는 높은 러닝 커브를 들 수 있다. 객체지향 프로그래밍과 데이터베이스를 둘 다 이해해야 하기 때문이다. 하지만 그만큼 JAP를 사용해서 얻는 보상이 크기 때문에 많이 바뀌고 있는 추세이다.
'스프링 부트 프로젝트 > 데이터베이스 다루기' 카테고리의 다른 글
7. API 만들기 (0) | 2020.11.19 |
---|---|
6. 요구사항 분석 및 Spring Data JPA 적용하기 (0) | 2020.11.19 |