데이터베이스 프로그래밍 (JPA)

건미누·2023년 9월 12일

Spring Study

목록 보기
1/7
post-thumbnail

Api를 통해 사용자에게 지속적으로 데이터를 제공하기 위해서는 영속적인 저장소가
있어야 한다.

이럴 때 일반적으로 현업에서 RDBMS(Relational DataBase Management System)

  • Oracle, Mysql, MariaDB, MS-SQL을 사용한다

이렇게 다양한 DB서버들을 공통적으로 대응하기 위해 자바에서는 JDBC 라는 공통된
스펙을 제공, 벤더에서는 이를 기반으로 개발자에게 자바에서 사용할 수 있는 접속
라이브러리를 제공한다. 이를 통해서 다른 데이터 베이스더라도 JDBC 라이브러리를
이용하여 Connection 객체를 얻어 접속이 가능하다.

DB에서 데이터를 얻기위해서는 DML문을 DB서버로 전달해야하는데, 시스템의 규모의 커짐과 로직이 복잡도를 해결하기위해 SQLMapper(Mybatis), ORM(Jpa, Hibernate)으로 개발을 진행하게 되었다.

❗️ORM 이란?

  • Object Relational Mapping(객체-관계-매핑)의 약자이다.
  • Object와 RDBMS간의 패러다임의 차이를 해소하기 위한 도구이다
  • 객체와 데이터베이스의 관계를 매핑해주는 도구이다.
  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 도구
  • 객체와 관계형 데이터베이스 사이의 중계자(통역자) 역할을 한다.
  • MVC 패턴에서 모델(Model)을 기술하는 도구이다.
  • 객체와 모델 사이의 관계를 기술하는 도구이다.
  • 종류 : Hibernate, EclipseLink, DataNucleus

  • JPA는 애플리케이션과 JDBC 사이에서 동작하며, 개발자가 JPA를 활용했을 때 JDBC API를 통해 SQL을 호출하여 데이터베이스와 호출하는 전개가 이루어진다. 즉, 개발자는 JPA의 활용법만 익히면 DB 쿼리 구현없이 데이터베이스를 관리할 수 있다.

  • JPA는 컴파일 시점에서 오류를 잡아준다.

JPA

  • 추가적으로 알아둬야 할 것은, 스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 spring-data-jpa 프레임워크이지 JPA는 아니다.

  • JPA를 만들었을 당시에는 NoSQL이 존재하지 않았다. 이후 NoSQL을 포함한 새로운 스펙을 재정하였고 그것이 Spring Data이다.

Spring Data JPA 설정

spring-boot-starter-data-jpa관련 의존성을 추가

  • 라이브러리를 추가하면 자동으로 tomcat-jdbc이 추가된다
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

yml에도 추가로 설정 해준다

  jpa:
  	# sql 실행쿼리 콘솔 출력
    show-sql: true

    # Hibernate
    database: mysql
    hibernate:
      # create를 하면 기존 DB를 Drop하고 테이블을 새로 Create한다.
      ddl-auto: update
      # camelCase로 작성하면 DB에는 camel_case로 작성된다.
      strategy: org.hibernate.cfg.ImprovedNamingStrategy
      physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    # ddl-auto (true로 바꿔주어야 ddl-auto 사용가능)
    generate-ddl: false

Repository 작성

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
	Optinal<User> findbyUserEmail(String email);
}

Jpa 선언부

public interface JpaRepository<T, ID extends Serializable>
  • T는 Generic Type을 의미한다
    : 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미

Generic Type 장점

  1. 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.

  2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.

  3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

    타입 종류

    T : Type
    E : Element
    K : Key
    V : Value
    N : Number

profile
꺾여도 해야지

0개의 댓글