[Spring Data] Spring Data module

반응형

스프링을 사용하다보면 이런 의문점이 있습니다. JPA는 JPA인데, Spring Data JPA는 무엇이며, JDBC는 JDBC인데, Spring Data JDBC는 무엇인가?

 

JPA를 사용하는 것과 Spring Data JPA를 사용하는 것은 분명히 다른점이 있습니다. 일목요연하게 말하자면 Spring Data JPA를 몰라도 JPA를 배우는 데 큰 지장은 없지만 JPA를 모르는 상태에서 Spring Data JPA로 넘어오는 것은 마치 이론 없이 라이브러리를 쓰는 것과 동일합니다.

 

이처럼 Spring Data가 앞에 부튼 디펜던시들은 무언가 Spring에 최적화 되어 있는 느낌입니다. 그렇다면 Spring에서 제공하는 Spring Data Pattern은 어떤 것일까요?

 

 

 

Spring Data

Spring Data는 스프링에서 일관된 DB 접근을 위한 추상화된 모델을 제공하는 디펜던시입니다. 여기에는 ORM의 표준인 Hibernate를 기반으로 한 JPA와 Java 데이터베이스 커넥션의 표준인 JDBC 두 가지를 베이스로 제공합니다.

 

https://spring.io/projects/spring-data

 

Spring Data

Spring Data is an umbrella project consisting of independent projects with, in principle, different release cadences. To manage the portfolio, a BOM (Bill of Materials - see this example) is published with a curated set of dependencies on the individual pr

spring.io

Spring Data module은 Spring Data Project를 기반으로 진행되어 Spring Data Commons라는 디펜던시를 바탕으로 JPA, JDBC, Redis, LDAP 등 다양한 형태의 데이터베이스를 스프링에서 일목요연하게 사용할 수 있도록 해주며 특히 HATEOAS 기반으로 개발된 Spring Data Rest는 REST API에 있어 스키마 설계에 대한 고민을 줄여주고, 가급적 표준에 맞게 제공해준다는 장점을 가지고 있습니다.

 

기본적으로 Spring Data가 하는 기능은 아래와 같습니다.

 

  • 강력한 레포지터리 패턴과 커스텀 객체 매핑 추상화
  • 레포지터리 패턴의 메소드 이름으로 동적 쿼리 실행
  • 기본 속성을 제공하는 도메인 기본 클래스 구현
  • 이벤트 상태 지원 (생성, 마지막 변경)
  • 커스텀 레포지터리 코드 통합
  • JavaConfig 클래스 및 커스텀 XML 네임스페이스를 이용한 스프링 통합 설정 제공
  • 더 나은 Spring MVC 컨트롤러와의 통합
  • 상호간 영속화 지원 (Experimental)

 

 

 

Spring Data Commons

Spring Data xxx 기반의 디펜던시들은 Spring Data Commons를 기반으로 되어 있으며 이는 이 프로젝트의 핵심 코드이자 기본적인 추상화 레이어로 이것이 어떻게 구성되어 있는지 안다면 다른 Spring Data 디펜던시들도 쉽게 접근할 수 있을 것입니다.

 

그 중 대표적인 것이 바로 Spring Data JPA에서 자주 다루는 Repository와 CrudRepository 입니다. Spring Data 프로젝트가 제공하는 기능 중 하나가 바로 강력한 레포지터리 패턴인데, 특히 CrudRepository는 데이터에서 가장 많이 사용되는 CREATE, READ, UPDATE, DELETE인 CRUD를 정의한 레포지터리입니다.

CrudRepository는 Repository를 상속하여 구성되어 있는데, Repository의 역할은 PK를 지정해주는 역할이라면 CrudRepository는 이 PK를 이용하여 데이터를 찾고, 저장하고는 등의 CRUD를 수행하는데, 이를 메소드로써 간단히 사용할 수 있도록 구현시켜 놓은 추상화된 모델입니다.

 

실제로 JPA를 사용했을 때랑은 사뭇 다른 모습이죠. JPA를 사용해서 특정 데이터를 영속할 때는 먼저 Entity 클래스를 만들고, 객체를 생성한 다음 영속성 컨텍스트에 데이터를 넣은 다음 커밋을 수행해야 합니다. 이 과정 속에서 발생하는 메소드만 3번이라면 Spring Data JPA는 단 한 번에 이를 수행할 수 있는 것이죠. 즉, 위에서 필요한 3번의 수행을 하나의 메소드에 추상화한 것입니다.

 

 

 

 

Spring Data JDBC

이전에 Spring Data JPA에 대해 다뤘었는데, 이번 글을 쓰게 된 것은 바로 다음에 쓸 Spring Data JDBC입니다. 여러분들 중에서는 ORM이 아닌 MyBatis나 JdbcTemplate과 같은 Query를 직접 작성해서 사용하시는 경우가 많으실텐데요. 

 

모든 백엔드 애플리케이션에서 DB 접근 로직을 구현할 때 반드시 ORM을 사용해야하는 것은 아닙니다. 필요에 따라서는 Query를 직접 작성해야 할 수도 있고, 코드의 일관성이나 아키텍처의 유연함을 위해서 ORM을 선택하는 경우는 있더라도 반드시 백엔드 애플리케이션 개발에 DB를 연결하기 위해 ORM을 사용해야 한다. 는 적합하지 않습니다.

 

더 자세한 이야기는 다음 파트에서 다뤄보도록 하겠습니다.

 

 

반응형