
: 스프링 부트를 활용한 애플리케이션 개발 실무
📝 목차
6장. 데이터베이스 연동
6-1. 마리아DB 설치
6-2. ORM
6-3. JPA
6-4. 하이버네이트
- Spring Data JPA
6-5. 영속성 컨텍스트
- 엔티티 매니저
- 엔티티의 생명 주기
⬇️ 다운로드 사이트
https://mariadb.org/download/
① 처음 데이터 베이스를 설치하면 root 계정이 부여
➙ root 계정에 패스워드 지정하기
② UTF-8 문자 인코딩 방식을 기본값으로 설정하기 위해 체크
✅ Use UTF8 as default server's character set
③ 서버 이름과 포트 번호 설정
: 마리아DB 기본 포트번호 3306
➙ 만약 별도 데이터베이스를 설치한 적이 있다면 포트가 겹치기 때문에,
자동으로 3307 매칭
④ HeidiSQL 실행 후 앞으로 사용할 데이터베이스 접속 정보 등록하기
= 관계 매핑
: 객체지향 언어에서의 의미하는 객체와 RDB의 테이블을 자동으로 매핑하는 방법
객체지향 언어에서의 의미하는 객체?
: 클래스를 의미
RDB (Relational Database) : 관계형 데이터베이스
클래스는 데이터베이스의 테이블과 매핑하기 위해 만들어진 것이 아니기 때문에 RDB 테이블과 필연적으로 불일치가 존재
➙ ORM은 이 둘의 불일치와 제약사항을 해결하는 역할

ORM을 이용하면 퀴리문이 아닌 코드(메서드)로 데이터 조작이 가능
👍 ORM의 장점
✅ ORM을 사용하면서 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다.
- 쿼리문을 작성하는 양이 현저히 줄어 개발 비용 저하
- 객체지향적으로 데이터베이스에 접근할 수 있어 코드의 가독성 증가
✅ 재사용 및 유지보수가 편리하다.
- ORM을 통해 매핑된 객체는 모두 독립적으로 작성되어 있어 재사용이 용이
- 객체들은 각 클래스로 나뉘어 있어 유지보수가 수월
✅ 데이터베이스에 대한 종속성이 줄어든다.
- 객체를 기반으로 데이터베이스 테이블을 관리하기 때문에 데이터베이스에 독립적
- 데이터베이스를 교체하는 상황에서도 비교적 적은 리스크를 부담
👎 ORM의 단점
✅ ORM만으로 온전한 서비스를 구현하기에는 한계가 있다.
- 복잡한 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어려움
- 또한 정확한 설계없이 ORM만으로 구성하게 되면 속도 저하 등의 성능 문제 발생
✅ 애플리케이션의 객체 관점과 데이터베이스의 관계 관점의 불일치가 발생한다.
- 세분성(Granularity)
: 데이터베이스에 있는 테이블의 수와
애플리케이션의 엔티티(Entity) 클래스의 수가 다른 경우 발생할 수 있다.
(클래스가 테이블의 수보다 많아질 수 있음)
- 상속성(inheritance)
: RDBMS에는 상속이라는 개념이 없다.
- 식별성(identity)
: RDBMS는 기본키로 동일성을 정의,
자바는 두 객체의 값이 같아도 다르다고 판단할 수 있다.
- 연관성(Associations)
: 객체지향 언어는 객체를 참조함으로써 연관성을 나타내지만,
RDBMS에서는 외래키를 사입함으로써 연관성을 표현.
객체지향 언어에서 객체를 참조할 때는 방향성이 존재하지만,
RDBMS에서 외래키를 삽입하는 것은 양방향의 관계를 가지기 때문에 방향성이 없다.
- 탐색(Navigation)
: 자바와 RDBMS는 어떤 값(객체)에 접근하는 방식이 다르다.
자바에서는 특정 값에 접근하기 위해 객체 참조 같은 연결 수단을 활용
➡️ 이 방식은 객체를 연결하고 또 연결해서 접근하는 그래프 형태의 접근 방식입니다.
(예 : 멤버의 회사 주소 구하기 ➙ member.getOrganization().getAddress() 로 접근)
RDBMS에서는
쿼리를 최소화하고 조인을 통해 여러 테이블을 로드하고 값을 추출하는 접근 방식을 채택
: 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음

JPA 메커니즘을 보면 내부적으로 JDBC를 사용
개발자가 직접 JDBC를 구현 ➙ 개발 효율성 저하 (SQL에 의존)
⭐ JPA는 이를 보완 ⭐
➙ 개발자 대신 적절한 SQL을 생성
➙ 데이터베이스를 조작해서 객체를 자동 매핑하는 역할을 수행
대표적인 3가지 JPA 기반의 구현체
① 하이버네이트 (Hibernate) ➡️ 가장 많이 사용되는 구현체
② 이클립스 링크 (EclipseLink)
③ 데이터 뉴클리어스 (DataNucleus)

: 자바의 ORM 프레임워크로,
JPA가 정의하는 인터페이스를 구현하고 있는 JPA 구현체 중 하나
(하이버네이트의 기능을 더욱 편하게 사용하기위해 Spring Data JPA 사용)
: JPA를 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나
CRUD처리에 필요한 인터페이스를 제공
엔티티 매니저(Entity Manager)를 직접 다루지 않고 리포지토리를 정의해 사용
➙ 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작
하이버네이트에서 자주 사용되는 기능을 사용할 수 있는 라이브러리

① 애플리케이션 ↔ 데이터베이스 사이에서 엔티티와 레코드의 괴리를 해소
② 객체를 보관
엔티티 객체가 영속성 컨텍스트에 들어오면,
JPA는 엔티티 객체의 매핑 정보를 데이터베이스에 반영
➙ 엔티티 객체가 영속성 컨텍스트에 들어와 JPA의 관리대상이 되는 시점부터 해당 객체를 영속 객체라고 부른다.

: 엔티티를 관리하는 객체
엔티티 매니저는 데이터베이스에 접근해서 CRUD 작업을 수행
Spring Data JPA를 사용하면 리포지토리(Repository)를 사용해서 데이터베이스에 접근
➙ 리포지토리에서 엔티티 매니저를 사용
엔티티 매니저 ➙ 엔티티 매니저 팩토리(EntityManagerFactory)가 만든다.
✅ 스프링부트에서는 자동설정 기능이 있기 때문에
application.properties에서 작성한 최소한의 설정만으로도 동작
✅ 엔티티 매니저 팩토리는 애플리케이션에서 단 하나만 생성 되며,
모든 엔티티가 공유해서 사용
(JPA 구현 체 중 하나)
✅ 하이버네이트에서는 persistence.xml이라는 설정 파일을 구성하고 사용해야하는 객체
[ 정리 ]
엔티티 매니저 팩토리로 ➙ 엔티티 매니저 생성
엔티티 매니저는,
⭐ 엔티티를 영속성 컨텍스트에 추가해서 영속 객체로 만드는 작업을 수행
영속성 컨텍스트 ↔ 데이터베이스를 비교하면서 실제 데이터베이스 대상으로 작업
: 엔티티 객체는 영속성 컨텍스트에서 다음과 같은 4가지 상태로 구분
✅ 비영속 (New)
: 영속성 컨텍스트에 추가되지 않은 엔티티 객체의 상태를 의미
✅ 영속 (Managed)
: 영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태
✅ 준영속 (Detached)
영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태
✅ 삭제 (Removed)
데이터베이스에서 레코드를 삭제하기 위해 영속성 컨텍스트에 삭제 요청을 한 상태