[스프링부트와 AWS로 혼자 구현하는 웹 서비스] JPA

세이라·2023년 7월 22일
0

스터디를 통해 스프링부트와 AWS로 혼자 구현하는 웹 서비스(저자 이동욱) 서적을 공부하는 중입니다.

공부/실습한 내용을 정리한 포스팅입니다.
책에 모르는 부분이 있으면 구글링하거나 챗gpt에 물어봐서 보충하였습니다.
(아직 초보라 모르는 부분이 많아 이것저것 다 적었습니다.)

참고한 사이트 출처는 포스팅 맨 하단에 적었습니다.

JPA(Java Persistence API)

Java ORM 기술 Interface 표준. 이를 구현한 가장 대표적 기술은 Hibernate.
이때, persistence는 '영속성'이며 데이터가 프로그램이 종료되어도 사라지지 않고 저장됨을 의미.

ORM VS SQL Mapper

Java에서는 데이터 영속성을 위한 JDBC(Java DataBase Connectivity, Java 프로그램이 DB와 연결되어 데이터를 주고 받을 수 있게 해주는 자바 API이자 인터페이스) 지원.
하지만, JDBC에서 DB에 접근하여 SQL 수행하고 결과값을 다시 data type에 맞게 매핑해주는 작업을 개발자가 일일이 수행해야 하는 번거로움 존재.
그래서 개발자가 직접 JDBC Programmin을 하지 않도록 하는 Persistence Framework인 SQL Mapper와 ORM 등장

ORM(Object Relational Mapping) - 객체지향적 프로그래밍 가능 / 객체를 매핑

  • Object와 DB 테이블을 매핑하여 데이터를 객체화하는 기술.
  • DBMS에 종속적이지 않고 SQL을 직접 작성하지 않아도 됨.
  • 복잡한 쿼리의 경우, JPQL 사용 OR SQL Mapper 혼용 사용 가능.
  • 도메인과 비즈니스 로직 설계에 더 집중 가능.
  • 객체지향적 프로그래밍이 가능하므로 생산성 향상 및 유지보수 용이함 장점이 있음

※ 비즈니스 로직 : 프로그램에서 실세계의 규칙에 따라 데이터를 생성·표시·저장·변경하는 부분

SQL Mapper - SQL 의존적 / 쿼리를 매핑

  • Object와 SQL의 필드를 매핑하여 데이터를 객체화하는 기술.
  • 객체와 테이블간의 관계를 매핑X SQL문을 직접 작성하고 쿼리 수행결과를 어떠한 객체에 매핑하여 줄 지 바인딩하는 방법.
  • SQL 의존으로 실제로 개발하는 시간보다 SQL을 다루는 시간이 더 많아짐. 객체 모델링보다는 테이블 모델링에만 집중하고, 객체를 단순히 테이블에 맞추어 데이터 전달 역할만 하는 개발 방식을 따라야 함.
    → 객체지향 프로그래밍이 아닌 SQL에 맞춘 프로그래밍을 하게 됨
    (상속, 1:N 등 다양한 객체 모델링 적용X)
  • 예) Mybatis(SQL을 xml파일에 분리하여 관리. SQL결과와 객체 인스터스 매핑 도와주는 역할 수행. 동적 쿼리 지원.)

패러다임 불일치 문제 해결

대부분의 웹 애플리케이션 RDB 사용. 객체를 RDB에서 관리하는데, RDB가 SQL만 인식할 수 있어서 객체지향프로그래밍에서 SQL을 쓰는 건 피할 수 없음.
이때, 패러다임 불일치 문제가 발생.

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

※ 메세지 : 객체가 특정 작업을 수행하도록 요청하는 것

  • RDB : 어떻게 데이터를 저장할지에 초점이 맞춰진 기술

서로 패러다임이 다르므로, 객체를 DB에 저장하려면 문제 발생.
이때, 이 둘의 패러다임을 중간에서 일치 시켜주는 기술이 나오는데 그게 바로 ORM이며, Spring Boot에서 ORM인 JPA 이용.

Spring Data JPA

JPA는 표준명세서이므로 구현체를 사용해야하는데 대표적으로 Hibernate, Eclipse Link 등이 있음.
Spring에서는 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용하여 JPA 기술을 다룸.

  • Hibernate를 쓰는 것과 큰 차이는 없어도 Spring에서 Spring Data JPA 등장 이유
    - 구현체 교체의 용이성 : Spring Data JPA 내부에서 구현체 매핑 지원
    - 저장소 교체의 용이성 : Spring Data 하위 프로젝트들은 기본적인 CRUD의 인터페이스가 같기 때문(Spring Data JPA, Spring Data Redis, Spring Data MongoDB 등)

H2 / Spring Data Jpa 의존성 등록

  • build.gradle 의존성에 아래와 같이 추가
dependencies {
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
    implementation('com.h2database:h2')
}
  • spring-boot-starter-data-jpa
    : 스프링부트용 Spring Data Jpa 추상화 라이브러리. 스프링 부트 버전에 맞춰 자동으로 JPA 관련 라이브러리 버전 관리.
  • h2
    : 인메모리 RDB. 별도의 설치 없이 프로젝트 의존성으로 관리. 메모리 실행으로 애플리케이션 재시작마다 초기화되어 테스트용으로 사용.

출처

JDBC란 무엇일까?
SQL Mapper와 ORM 차이
위키백과 - 비즈니스 로직
[OOP]메시지와 메소드의 개념과 관계
[JPA] JPA와 Hibernate 그리고 Spring Data JPA

0개의 댓글