[ZB_BOOK STUDY] 스프링 부트 핵심 가이드 (6-1)

Dreamer·2024년 4월 7일
0
post-thumbnail

📖 스프링 부트 핵심 가이드

: 스프링 부트를 활용한 애플리케이션 개발 실무


📝 목차

6장. 데이터베이스 연동

6-1. 마리아DB 설치
6-2. ORM
6-3. JPA
6-4. 하이버네이트
- Spring Data JPA

6-5. 영속성 컨텍스트
- 엔티티 매니저
- 엔티티의 생명 주기


6장. 데이터베이스 연동

  • 마리아DB (MariaDB) 애플리케이션에 적용하기

6-1. 마리아DB 설치

⬇️ 다운로드 사이트
https://mariadb.org/download/

  • MariaDB Server Version : MariaDB Server 10.6.5
  • Operating Systems : Windows
  • Architecture : x84_64
  • Package Type : MSI Package

① 처음 데이터 베이스를 설치하면 root 계정이 부여
➙ root 계정에 패스워드 지정하기

② UTF-8 문자 인코딩 방식을 기본값으로 설정하기 위해 체크
✅ Use UTF8 as default server's character set

③ 서버 이름과 포트 번호 설정
: 마리아DB 기본 포트번호 3306
➙ 만약 별도 데이터베이스를 설치한 적이 있다면 포트가 겹치기 때문에,
자동으로 3307 매칭

  • 서드파티 도구로 HeidiSQL이 함께 설치
  • HeidiSQL은 데이터베이스에 접속해서 관리하는 GUI도구

④ HeidiSQL 실행 후 앞으로 사용할 데이터베이스 접속 정보 등록하기

6-2. ORM (Object Relation Mapping)

= 관계 매핑
: 객체지향 언어에서의 의미하는 객체와 RDB의 테이블을 자동으로 매핑하는 방법

클래스는 데이터베이스의 테이블과 매핑하기 위해 만들어진 것이 아니기 때문에 RDB 테이블과 필연적으로 불일치가 존재
➙ ORM은 이 둘의 불일치와 제약사항을 해결하는 역할

ORM의 역할

ORM을 이용하면 퀴리문이 아닌 코드(메서드)로 데이터 조작이 가능

👍 ORM의 장점

✅ ORM을 사용하면서 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다.
- 쿼리문을 작성하는 양이 현저히 줄어 개발 비용 저하
- 객체지향적으로 데이터베이스에 접근할 수 있어 코드의 가독성 증가

✅ 재사용 및 유지보수가 편리하다.
- ORM을 통해 매핑된 객체는 모두 독립적으로 작성되어 있어 재사용이 용이
- 객체들은 각 클래스로 나뉘어 있어 유지보수가 수월

✅ 데이터베이스에 대한 종속성이 줄어든다.
- 객체를 기반으로 데이터베이스 테이블을 관리하기 때문에 데이터베이스에 독립적
- 데이터베이스를 교체하는 상황에서도 비교적 적은 리스크를 부담

👎 ORM의 단점

✅ ORM만으로 온전한 서비스를 구현하기에는 한계가 있다.
- 복잡한 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어려움
- 또한 정확한 설계없이 ORM만으로 구성하게 되면 속도 저하 등의 성능 문제 발생

✅ 애플리케이션의 객체 관점과 데이터베이스의 관계 관점의 불일치가 발생한다.
- 세분성(Granularity)
: 데이터베이스에 있는 테이블의 수와 
애플리케이션의 엔티티(Entity) 클래스의 수가 다른 경우 발생할 수 있다.
(클래스가 테이블의 수보다 많아질 수 있음)

- 상속성(inheritance)
: RDBMS에는 상속이라는 개념이 없다.

- 식별성(identity)
: RDBMS는 기본키로 동일성을 정의,
자바는 두 객체의 값이 같아도 다르다고 판단할 수 있다.

- 연관성(Associations)
: 객체지향 언어는 객체를 참조함으로써 연관성을 나타내지만,
RDBMS에서는 외래키를 사입함으로써 연관성을 표현. 

객체지향 언어에서 객체를 참조할 때는 방향성이 존재하지만, 
RDBMS에서 외래키를 삽입하는 것은 양방향의 관계를 가지기 때문에 방향성이 없다.

- 탐색(Navigation)
: 자바와 RDBMS는 어떤 값(객체)에 접근하는 방식이 다르다.

자바에서는 특정 값에 접근하기 위해 객체 참조 같은 연결 수단을 활용
➡️ 이 방식은 객체를 연결하고 또 연결해서 접근하는 그래프 형태의 접근 방식입니다.
(예 : 멤버의 회사 주소 구하기 ➙ member.getOrganization().getAddress() 로 접근) 

RDBMS에서는 
쿼리를 최소화하고 조인을 통해 여러 테이블을 로드하고 값을 추출하는 접근 방식을 채택

6-3. JPA (Java Persistence API)

: 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음

  • JPA 또한 실제로 동작하는 것이 아니고,
    어떻게 동작해야 하는지 매커니즘을 정리한 표준 명세라고 생각

JPA의 역할

JPA 메커니즘을 보면 내부적으로 JDBC를 사용
개발자가 직접 JDBC를 구현 ➙ 개발 효율성 저하 (SQL에 의존)

⭐ JPA는 이를 보완 ⭐
➙ 개발자 대신 적절한 SQL을 생성
➙ 데이터베이스를 조작해서 객체를 자동 매핑하는 역할을 수행

대표적인 3가지 JPA 기반의 구현체
① 하이버네이트 (Hibernate) ➡️ 가장 많이 사용되는 구현체
② 이클립스 링크 (EclipseLink)
③ 데이터 뉴클리어스 (DataNucleus)

대표적인 JPA 구현체

6-4. 하이버네이트

: 자바의 ORM 프레임워크로,
JPA가 정의하는 인터페이스를 구현하고 있는 JPA 구현체 중 하나
(하이버네이트의 기능을 더욱 편하게 사용하기위해 Spring Data JPA 사용)

Spring Data JPA

: JPA를 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나

  • CRUD처리에 필요한 인터페이스를 제공

  • 엔티티 매니저(Entity Manager)를 직접 다루지 않고 리포지토리를 정의해 사용
    ➙ 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작

  • 하이버네이트에서 자주 사용되는 기능을 사용할 수 있는 라이브러리

Spring Data JPA의 도식화

6-5. 영속성 컨텍스트 (Persistence Context)

① 애플리케이션 ↔ 데이터베이스 사이에서 엔티티와 레코드의 괴리를 해소
② 객체를 보관

엔티티 객체가 영속성 컨텍스트에 들어오면,
JPA는 엔티티 객체의 매핑 정보를 데이터베이스에 반영
➙ 엔티티 객체가 영속성 컨텍스트에 들어와 JPA의 관리대상이 되는 시점부터 해당 객체를 영속 객체라고 부른다.

영속성 컨텍스트

엔티티 매니저 (Entity Manager)

: 엔티티를 관리하는 객체

엔티티 매니저는 데이터베이스에 접근해서 CRUD 작업을 수행
Spring Data JPA를 사용하면 리포지토리(Repository)를 사용해서 데이터베이스에 접근
➙ 리포지토리에서 엔티티 매니저를 사용

엔티티 매니저 ➙ 엔티티 매니저 팩토리(EntityManagerFactory)가 만든다.

  • 엔티티 매니저 팩토리?
    : 데이터베이스에 대응하는 객체
✅ 스프링부트에서는 자동설정 기능이 있기 때문에 
application.properties에서 작성한 최소한의 설정만으로도 동작

✅ 엔티티 매니저 팩토리는 애플리케이션에서 단 하나만 생성 되며, 
모든 엔티티가 공유해서 사용

(JPA 구현 체 중 하나)
✅ 하이버네이트에서는 persistence.xml이라는 설정 파일을 구성하고 사용해야하는 객체

[ 정리 ]
엔티티 매니저 팩토리로 ➙ 엔티티 매니저 생성
엔티티 매니저는,
⭐ 엔티티를 영속성 컨텍스트에 추가해서 영속 객체로 만드는 작업을 수행
영속성 컨텍스트 ↔ 데이터베이스를 비교하면서 실제 데이터베이스 대상으로 작업

엔티티의 생명 주기

: 엔티티 객체는 영속성 컨텍스트에서 다음과 같은 4가지 상태로 구분

✅ 비영속 (New)
: 영속성 컨텍스트에 추가되지 않은 엔티티 객체의 상태를 의미

✅ 영속 (Managed)
: 영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태

✅ 준영속 (Detached)
영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태

✅ 삭제 (Removed)
데이터베이스에서 레코드를 삭제하기 위해 영속성 컨텍스트에 삭제 요청을 한 상태
profile
Moving forward based on records

0개의 댓글