[Spring&AWS][3-1] 스프링 부트에서 JPA로 데이터베이스 다뤄보자

kiteB·2022년 3월 13일
0

Spring-AWS

목록 보기
2/13
post-thumbnail

이 글은 책 「스프링 부트와 AWS로 혼자 구현하는 웹 서비스」를 공부하고 정리한 글입니다.

이번 시간에는 다양한 DB 접근 방법과 JPA 특징에 대해서 알아보도록 하겠다.


[ Spring을 이용하여 데이터베이스 사용하기 ]

웹 서비스를 개발하고 운영하다 보면 데이터베이스를 다루는 일은 필수적이다.
Spring을 이용하여 데이터베이스를 사용하는 방법은 다음과 같이 다양하다.

  • 순수 Jdbc (Java Database Connectivity)
    • Database에 접근하기 위한 Java의 표준 API
    • low level 코드를 작성해야 한다. → 코드의 양이 많아진다.
  • Jdbc Template
    • JDBC를 효율적으로 사용하기 위한 Spring API
    • JDBC를 그냥 사용하는 것보다 훨씬 코드의 양이 적어진다.
  • SQL Mapper
    • SQL과 Java 객체를 매핑하는 기술
    • SQL의 input 또는 output을 Java 객체와 매핑
  • ORM (Object Relational Mapping)
    • RDBMS의 테이블과 Java 객체를 매핑하는 기술
    • ORM Framework가 객체와 테이블을 매핑하는 역할을 수행한다.
    • ORM Framework가 SQL을 자동으로 생성한다.

Jdbc는 별도의 학습 없이 개발이 가능하며 안정적이고 유연한 기술이지만,
다음과 같은 이유로 개발의 효율성이 떨어진다는 한계점을 갖는다.

  • 로우 레벨로 코드를 작성해야 하며,
  • DB에 접근하여 SQL을 수행하고, 결과값을 dataType으로 일일이 매핑시켜주는 작업을 개발자가 직접 해야한다.

SQL Mapper와 ORM는 위와 같은 Jdbc 프로그래밍을 직접 하지 않도록 기능을 제공해주는 Persistence Framework이다.

💡 Persistence Framework란

데이터베이스와의 연동되는 시스템을 빠르게 개발하고 안정적인 구동을 보장해주는 프레임워크를 의미한다.

SQL Mapper는 Jdbc에 비하면 효율적이지만, 여전히 직접 데이터베이스 쿼리를 작성해야 하기 때문에 실제로 개발하는 시간보다 SQL을 다루는 시간이 더 많아지는 경우가 발생하게 된다.

SQL Mapper의 문제점까지 해결하기 위해, JPA라는 자바 표준 ORM이 등장하게 되었다.
아직 SI 환경에서는 Spring & MyBatis를 많이 사용하지만, 자사 서비스를 개발하는 곳에서는 SpringBoot & JPA를 전사 표준으로 사용하고 있다.

그러므로 이번 프로젝트에서는 JPA를 사용하도록 하겠다!


[ JPA 소개 ]

0. SQL 중심 개발의 문제점

현대의 웹 애플리케이션에서 관계형 데이터베이스(RDB, Relational Database)는 빠질 수 없는 요소이며, 이로 인해 객체를 관계형 데이터베이스에서 관리하는 것은 무엇보다 중요해졌다.

이러한 RDB는 SQL만 인식할 수 있기 때문에 점점 모든 코드가 SQL 중심으로 변하게 되는데, 이러한 SQL 중심 개발지루한 코드의 무한 반복패러다임의 불일치라는 문제점을 갖는다.

하나씩 자세히 살펴보자.

✅ 지루한 코드의 무한 반복

  • 기능을 하나 추가해서 테이블이 생성될 때마다 CRUD SQL을 다 만들어줘야 한다.
  • "자바 객체 ↔ SQL" 과정의 반복

너무 비효율적이며, SQL에 의존적인 개발을 할 수 밖에 없다.

✅ 패러다임 불일치 문제 - 객체 vs 관계형 데이터베이스

  • 객체 지향 프로그래밍 언어: 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술이다.
  • 관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술이다.
    → 패러다임이 다른 두 가지를 억지로 매핑하기 때문에 여러 가지 문제가 생긴다. 이를 패러다임 불일치라고 한다.

JPA는 이러한 문제들을 해결하기 위해서 등장하게 되었다.

  • JPA는 서로 지향하는 바가 다른 2개 영역을 중간에서 패러다임 일치를 시켜주기 위한 기술이다.
  • 즉, 개발자는 객체지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행한다.
  • 개발자는 항상 객체지향적으로 코드를 표현할 수 있으니 더는 SQL에 종속적인 개발을 하지 않아도 된다.

객체 중심으로 개발을 하게 되니 생산성도 향상되며 유지보수가 용이해진다. 이런 점 때문에 JPA는 규모가 크고 365일 24시간, 대규모 트래픽과 데이터를 가진 서비스에서 점점 표준 기술로 자리 잡고 있다.


1. Spring Data JPA

JPA는 인터페이스인터페이스인 JPA를 사용하기 위해서는 구현체가 필요하다.

구현체로 Hibernate, Eclipse Link 등이 있지만 Spring에서 JPA를 사용할 때는 이 구현체들을 직접 다루지 않는다. 그 대신 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈들을 이용하여 JPA 기술을 다룬다.

💡 JPA, Hibernate, Spring Data JPA의 관계

JPA ← Hibernate ← Spring Data JPA

Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것은 큰 차이가 없지만, 그럼에도 스프링 진영에서는 Spring Data JPA를 권장하고 있다.

이렇게 한 단계 더 감싸놓은 Spring Data JPA가 등장한 이유는 다음과 같다.

  • 구현체 교체의 용이성: Hibernate 외에 다른 구현체로 쉽게 교체하기 위함
    • Spring Data JPA 내부에서 구현체 매핑을 지원해주기 때문에 가능하다.
  • 저장소 교체의 용이성: 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함
    • Spring Data의 하위 프로젝트들은 기본적인 CRUD의 인터페이스가 같기 때문에 가능하다.

2. JPA 특징

JPA를 잘 쓰려면 객체지향 프로그래밍과 관계형 데이터베이스를 둘 다 이해해야 하기 때문에 높은 러닝 커브를 가진다. 하지만 그만큼 JPA를 사용해서 얻는 보상은 크다.

  • CRUD 쿼리를 직접 작성할 필요가 없다.
  • 부모-자식 관계 표현, 1:M 관계 표현, 상태와 행위를 한 곳에서 관리하는 등 객체지향 프로그래밍을 쉽게 할 수 있다.

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


3. 요구사항 분석

앞으로 만들 게시판의 요구사항은 다음과 같다.

  • 게시판 기능
    • 게시글 조회
    • 게시글 등록
    • 게시글 수정
    • 게시글 삭제
  • 회원 기능
    • 구글/네이버 로그인
    • 로그인한 사용자 글 작성 권한
    • 본인 작성 글에 대한 권한 관리

다음 시간에는 JPA를 적용해보자!


[ 참고자료 ]

https://deveun.tistory.com/entry/SQL-Mapper%EC%99%80-ORM-%EC%B0%A8%EC%9D%B4
https://velog.io/@mmy789/JPA-Basic-JPA%EB%9E%80

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글