Spring/스프링 부트와 AWS로 혼자 구현하는 웹 서비스

CHAPTER 03 스프링 부트에서 JPA로 데이터베이스 다뤄보자

melitina 2023. 11. 25. 18:06

관계형 데이터베이스 : 어떻게 데이터를 저장할지에 초점

 

객체지향 프로그래밍 언어 : 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술

 

패러다임 불일치

관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임이 서로 다른데, 

객체를 데이터베이스에 저장하려고 하니 여러 문제가 발생

 

JPA

- 서로 지향하는 바가 다른 2개 영역(객체지향 프로그래밍 언어와 관계형 데이터베이스)을 중간에서 패러다임 일치를 시켜주기 위한 기술

- 더는 SQL에 종속적인 개발을 하지 않아도 된다.

- JPA는 인터페이스로서 자바 표준명세서

- 인터페이스인 JPA를 사용하기 위해서는 구현체(Hibernate, Eclipse Link, ...)가 필요

- Spring에서 JPA를 사용할 때는 이 구현체들을 직접 다루진 않는다.

 

Spring Data 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 Data의 하위 프로젝트들은 save(), findAll, findOne() 등을 인터페이스로 갖고 있다.

그러다 보니 저장소가 교체되어도 기본적인 기능은 변경할 것이 없다.

 

이런 장점들로 인해 Hibernate를 직접 쓰기보다는 Spring 팀에서 계속해서 Spring Data 프로젝트를 권장하고 있다.

 

실무에서 JPA

실무에서 JPA를 사용하지 못하는 가장 큰 이유 : 높은 러닝 커브

JPA를 잘 쓰려면 객체지향 프로그래밍과 관계형 데이터베이스를 둘 다 이해해야 한다.

하지만 그만큼 JPA를 사요해서 얻는 보상은 크다

- CRUD 쿼리를 직접 작성할 필요가 없다.

- 부모-자식 관계 표현, 1:N 관계 표현, 상태와 행위를 한 곳에서 관리하는 등 객체지향 프로그래밍을 쉽게 할 수 있다.

- JPA에서는 여러 성능 이슈 해결책들을 이미 준비해놓은 상태이기 때문에 이를 잘 활용하면 네이티브 쿼리만큼의 퍼포먼스를 낼 수 있다.

 

요구사항 분석

게시판 기능

- 게시글 조회

- 게시글 등록

- 게시글 수정

- 게시글 삭제

 

회원 기능

- 구글 / 네이버 로그인

- 로그인한 사용자 글 작성 권한

- 본인 작성 글에 대한 권한 관리

 

https://www.inflearn.com/questions/822610/javax-persistence%EA%B0%80-import%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4

 

javax.persistence가 import되지 않습니다 - 인프런 | 질문 & 답변

jpa강의를 듣던 도중 강의내용대로 따라했는데 오류가 발생하여 질문드립니다. build.gradle 의존성에 jpa 추가한 뒤 새로고침 했는데 javax.persistence.entity가 import 되지 않습니다. jakarta.persistence.entity

www.inflearn.com

 

https://hoehen-flug.tistory.com/50

 

[Error/Exception] Spring Boot 3에서 Java EE에서 Jakarta EE로 전환 관련 에러

새로운 프로젝트에서 Java 17, Spring Boot 3를 사용하고 있다. 기존에 Spring Boot 2에서는 발생하지 않던 에러가 발생해 기록해둔다. 에러 발생 JPA에서 네이티브 SQL 구현 중이었는데 (query, Attendance.class)

hoehen-flug.tistory.com

 

https://mingeonho1.tistory.com/entry/Spring-Java-gradle-%EB%B2%84%EC%A0%84-%EC%9D%B4%EC%8A%88%EB%A1%9C-Lombok%EC%9D%B4-%EC%95%88-%EB%90%A8

 

Gradle 버전 이슈로 Lombok이 안 됨

결론으로 바로 가기 먼저 이 문제는 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'라는 책을 실습하는 과정에서 마주친 상황이다. 책은 몇 년 전에 지어진 기준이라 자바나 스프링부트의 버전

mingeonho1.tistory.com