영속성(Persistence)이라는 단어를 많이 접할 수 있었는데, 영속성이란 프로그램이 종료되어도 사라지지 않는 데이터의 특성을 말한다.
Java에서는 영속성을 위해 JDBC를 지원하는데, SQL Mapper와 ORM은 개발자가 직접 JDBC프로그래밍을 하지 않도록 기능들을 제공해주는 Persistence Framework이다.
*SQL Mapper
- Object와 SQL의 필드를 매핑하여 데이터를 객체화하는 기술이다.
- SQL문을 작성하고, 쿼리 수행결과를 어떠한 객체에 매핑하여 줄지 바인딩하는 방법이다.
*ORM(Object Relational Mapping)
- Object와 데이터베이스 테이블을 매핑하여 데이터를 객체화하는 기술이다.
- SQL문을 작성하고, 쿼리 수행결과를 어떠한 객체에 매핑하여 줄 지 바인딩하는 방법이다.
- ex) JPA[Java Persistence Api], Hibernate ..
*JPA
자바 ORM기술에 대한 API 표준 명세, 즉, 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
관계형 데이터베이스와 객체지향 프로그래밍 언어는 다른 사상에서부터 출발을 한다.
관계형 데이터베이스의 사상 : 어떻게 데이터를 저장할지에 초점이 맞춰진 기술이다.
객체지향 프로그래밍 언어의 사상: 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술이다.
이렇게 패러다임이 다른데, 객체를 DB에 저장하려고 하니 여러 문제가 발생된다. -> '패러다임 불일치'
JPA는 서로 지향하는 바가 다른 2개의 영역을 중간에서 패러다임 일치시켜주기 위한 기술이라 할 수 있다.
최종적으로, 개발자는 객체지향적으로 프로그래밍을 하고 JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신해서 생성해준다.
스프링에서는 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용하여 JPA기술을 다룬다.
그렇다면, JPA/Hibernate/Spring Data JPA 는 다 무엇일까?
먼저, JPA에 대한 추가적인 설명을 덧붙여야 한다. JPA는 기술 명세이다. 이는 특정한 기능을 하는 라이브러리가 아니다. 인터페이스이다. 일반적인 백엔드 API가 클라이언트가 어떻게 서버를 사용해야 하는지 정의하는 것처럼, JPA 역시 java 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 한 방법이다.
단순한 명세이기 때문에 구현이 없다.
'Hibernate는 JPA라는 명세의 구현체이다.'
java에서 interface와 interface를 구현한 클래스와 같은 관계이다(JPA-Hibernate) .
위의 사실로 도출되는 결론 중 하나는 JPA를 사용하기 위해서는 반드시 Hibernate를 사용할 필요가 없다.
Hibernate의 작동방식이 마음에 들지 않는다면 언제든지 다른 구현체로 바꿀 수도 있고, 직접 구현해서 사용할 수도 있다.
Spring Data JPA는 JPA를 쓰기 편하게 만들어놓은 모듈이다.
Repository를 정의하여 사용해본 경험이 있을 것인데, 이 Repository가 바로 Spring Data JPA의 핵심이다.
이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. 사용자가 Repository 인터페이스에 정해진 규칙대로 (findBy.., findAll..) 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
그렇다면, 왜 스프링에서는 Spring Data JPA라는 모듈을 이용하여 JPA기술을 다룰까?
- 구현체 교체의 용이성 - Hibernate 외에 다른 구현체로 쉽게 교체하기 위함입니다.
- 저장소 교체의 용이성 - 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함입니다.
- 참고
https://deveun.tistory.com/entry/SQL-Mapper%EC%99%80-ORM-%EC%B0%A8%EC%9D%B4
https://gonyda.tistory.com/8
'개발 공부 기록 > 스프링부트 스터디' 카테고리의 다른 글
[SpringBoot]변수명으로 인한 mustache문제 해결 (0) | 2022.05.29 |
---|---|
[SpringBoot] Spring Security와 OAuth 2.0(1) (0) | 2022.05.26 |
[SpringBoot] WSGI와 CGI (0) | 2022.05.08 |
[SpringBoot] @SpringBootTest의 webEnvironment 속성 (0) | 2022.05.08 |
[SpringBoot] JPA Auditing (0) | 2022.05.08 |