오늘은 계획해두었던 repository를 구현하기 전에 의존성 추가를 해둔 JPA와 H2 DB에 대해서 좀 더 알아보는 시간을 가졌다.
Spring Boot Starter JPA에서 제공하는 기능에 대해 이해하기 위해서는 ORM과 JPA 개념을 우선적으로 이해해야 했다!

1. ORM(Object-Relational Mapping)
ORM(Object-Relational Mapping)이란 객체와 관계형 데이터 베이스의 데이터를 매핑해주는 도구이다. 자세히 말하면 프로그래밍 언어의 객체와 데이터베이스의 데이터를 자동으로 연결해준다. ORM을 사용하면 개발자는 SQL 쿼리를 직접 작성하는 대신, 자바 객체를 사용하여 데이터베이스의 레코드를 쉽게 생성, 조회, 수정, 삭제할 수 있다. 이로 인해 개발 과정이 단순화되고, 코드의 가독성이 향상된다.
또한 관계형 데이터베이스와 애플리케이션 코드(객체) 간의 중간 계층 역할을 하여, 데이터베이스의 구조가 변경되더라도 애플리케이션 코드를 수정하지 않아도 된다. 이는 유지보수 과정을 간소화시키며, 개발 효율성을 높일 수 있다

2. Spring Boot Data JPA(Java Persistence API)
Spring Boot JPA(Java Persistence API)란 데이터베이스를 쉽게 다루기 위한 데이터 액세스 기술로 ORM(Object-Relational Mapping) 기법을 사용하여 자바 애플리케이션에서 사용하는 객체와 관계형 데이터베이스 사이의 매핑을 관리하는 ORM 기술에 대한 API 표준 명세서(인터페이스) 의미한다. 이를 통해, 개발자가 직접적인 SQL을 작성하지 않고도 데이터베이스에서 데이터를 저장, 업데이트, 삭제, 조회하는 등의 작업을 수행할 수 있게 해준다.

여기서 중요하게 여겨야 할 부분은, JPA 자체는 말 그대로 인터페이스라는 점이다. JPA는 특정 기능을 하는 라이브러리가 아니다. 마치 일반적인 백엔드 API가 클라이언트가 어떻게 서버를 사용해야 하는지를 정의한 것처럼, JPA 역시 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 한 방법일 뿐이다. 이에 대해 Spring Data JPA는 JPA라는 것을 쓰기 편하게 만들어놓은 모듈이라고 한다.
2. H2 Database
h2는 자바로 작성된 관계형 데이터베이스 관리 시스템이다. 일반적인 DB와 다른점이라고 하면, H2는 메모리 데이터베이스 기반이며 휘발성데이터를 관리하는 DB이다. 보통 통용되는 데이터베이스는 DB 서버에 실제 메모리를 유지시키므로 영구적인 데이터를 사용할 수 있는 반면, H2는 데이터가 시스템 메모리에 저장이 되어 서버를 종료하거나, 재시작하면 해당 데이터가 삭제되는 데이터베이스이다.
H2 특징
- 매우 빠른 속도를 지원하는 오픈 소스이다.
- 인 메모리 데이터베이스이다.
- 브라우저 기반 콘솔 프로그램을 지원한다.
- 2MB jar 파일 크기로 굉장히 작은 설치 공간을 갖고있다.

나는 그래서 이 정보들로 "Spring Data JPA는 자바 언어로 ORM을 구현한 라이브러리(?)이고 이는 프로그래밍 언어(자바) 객체를 데이터베이스로 연결해주는 일종의 번역기이다. 그리고 이렇게 번역된 데이터는 H2 데이터베이스라는 관계형 데이터베이스 저장소이다. 이 H2는 휘발성 데이터베이스로 한 번 실행할 때마다 저장소가 새로고침된다."고 이해했다.
많은 데이터베이스 중 내가 H2를 고른 이유는 현재 프로젝트 규모에서는 H2 데이터베이스로도 충분할 것이라고 생각했고 개발에 비중을 더 두고 싶었기 때문에 MySQL과 같은 외부 데이터베이스를 쓰기보다는 간편하게 데이터 베이스를 추가할 수 있는 H2가 적합하다고 판단했기 때문이다. 그리고 이후에 데이터베이스의 형태를 바꾸고 싶을 때 H2 의존성을 MySQL 의존성으로 바꾸고 application.yml에 DB 주소만 적어주면 된다고 한다!
JPA 를 사용해서 H2 DB에 객체를 넣으려면 JPA를 어떻게 사용해야 하는 지를 알아야한다.
https://docs.oracle.com/javaee/7/api///javax/persistence/package-summary.html
javax.persistence (Java(TM) EE 7 Specification APIs)
Interface Summary Interface Description AttributeConverter A class that implements this interface can be used to convert entity attribute state into database column representation and back again. AttributeNode Represents an attribute node of an entity gr
docs.oracle.com
데이터베이스에 어떻게 넣을 지에 대해서 Annotation을 붙여줘야한다. 각 코드들이 어떤 역할을 하는 지 명시적으로 표현해주는 것이다!
DB에 저장해야 하는 것들
- Lotto (엔진)
- MyLotto (즐겨찾기)
- PurchasedLotto (구매 내역)
- WinningLotto (당첨 결과)
당첨 규칙과 계산을 수행하는 객체이므로 따로 DB에 저장할 필요가 없다.
- LottoRank (Enum)
- LottoResult
생각보다 JPA를 이해하는 데 시간이 많이 들어서 객체에 Annotation을 붙여서 객체를 데이터베이스로 옮겨 넣는 작업은 내일 해야할 것 같다😱 계획이 미뤄진 것에 대해서 반성하고 내일부터는 더 열심히 해야할 것 같다. 이제 시작이다 더 몰입하고 한계에 도전하자 아자자!!