데이터베이스 관리자
: DBMS(Database Management System)
데이터베이스는 많은 사람이 공유
할 수 있어야 하므로 동시 접근
을 할 수 있어야함관리가 필요
관계형 DBMS
: RDBMS(Relation Database Management System)
관계형이라고 하는 이유
: DBMS가 관계형 모델을 기반
을 하기 때문테이블 형태
의 Key, Value
형태H2, MySQL
H2
: 자바로 작성된 RDBMS
스프링 부트가 지원
하는 인메모리 관계형 데이터베이스
데이터를 다른 공간에 보관하는 것이 아닌 애플리케이션 내부에 데이터를 저장
애플리케이션 재실행? 전부 리셋
개발 테스트용
으로 많이 사용테이블
: 데이터베이스에서 데이터를 구성하는 가장 기본적인 단위행
: row, record고유한 식별자 필요 Primary Key
열
: column무결성을 보장
기본키
: 행을 구분하는 식별자
NOT NULL
쿼리
: SQL DB 전용 언어 사용ORM
: Object Relation Mapping
자바의 객체와 데이터베이스를 연결하는 프로그램
객체와 데이터베이스를 연결
해 자바 언어로만 데이터베이스를 다룰 수 있게
하는 도구SQL을 직접 작성하지 않고 사용하는 언어로 DB 접근
객체지향적으로 코드를 작성
할 수 있기 때문에 비즈니스 로직에만 집중
DB 시스템이 추상화
-> MySQL에서 PostgreSQL전환시 추가 작업 거의 없음 DB 시스템에 대한 종속성 감소
Mapping하는 정보 명확
하게 있어서 ERD에 대한 의존도 낮고 유지보수 유리
복잡성
증가 -> 난이도 증가
복잡하고 무거운
쿼리 -> ORM으로 해결 불가능
JPA
: Java Persistance API
자바에서 관계형 DB를 사용하는 방식
을 정의한 인터페이스
ORM 프레임워크 필요
: 하이버네이트
하이버네이트
: JPA 인터페이스를 구현한 구현체이자 자바용 ORM 프레임워크
내부적
으로 JDBC API
사용목표
: 자바 객체를 통해 DB 종류에 상관없이 DB를 자유자재로 사용
할 수 있게 함JPA, 하이버네이트 역할
JPA
: 자바 객체와 DB를 연결
해 데이터를 관리
하이버네이트
: JPA의 인터페이스 구현
Entity Manager
Entity
: DB의 테이블과 매핑되는 객체
DB의 테이블
과 직접 연결
됨Entity Manager
: 엔티티를 관리
해, DB와 애플리케이션 사이
에서 객체를 생성, 수정, 삭제하는 등의 역할스프링 부트 내부
에서 Entity Manager Factory
1개
만 생성해서 관리
@PersistanceContext
또는 @Autowired
로 엔티티 매니저 사용
스프링 부트는 기본적으로 Bean을 1개만 생성해서 공유
-> 동시성 문제 가능
따라서 Entity Manager가 아닌 Proxy Entity Manager를 사용
필요할 때 DB 트랜젝션과 관련된 실제 Entity Manager 호출
즉, Spring Data JPA에서 Entity Manager를 알아서 관리해준다
@PersistanceContext
EntityManager em; // Proxy Entity Manager, 필요할 때 진짜 Entity Manager 생성
영속성 컨텍스트
: Persistance Context
Entity Manager는 Entity를 Persistance Context에 저장
공통점
은 DB접근 최소화
해서 성능 향상
1차 캐싱
Persistance Context는 내부에 1차 캐시를 가짐
캐시 키
: @Id
붙어있는 것 식별자
캐싱의 유무에 따라 DB에서 가져오는 속도 다름
쓰기 지연
: transactiona write behind트랜잭션을 커밋하기 전까지 DB에 보내지 않고, 트랜젝션이 커밋되는 시점에 한번에 쿼리를 실행
적당한 묶음으로 쿼리를 요청
-> DB 시스템 부담 줄임
변경 감지
트랜젝션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티값 비교
쓰기 지연과 마찬가지로 적당한 묶음으로 쿼리를 요청
-> DB 시스템 부담 줄임
지연 로딩
: LAZY <-> EAGER분리상태
: detached
관리상태
: managed
비영속상태
: trasient
삭제상태
: removed
public class EntityManagerTest {
@Autowired
EntityManager em;
public void example() {
Member member = new Member(1L, "홍길동"); // 비영속
em.persist(member); // 관리
em.detach(member); // 분리
em.remove(member); // 삭제
}
}
스프링 데이터
비즈니스 로직에 집중
하기 위해, DB사용 기능을 클래스 레벨에서 추상화
페이징 처리 기능, 네임드 쿼리 기능 포함
스프링 데이터 JPA
스프링 데이터의 공통적인 기능
에서 JPA의 유용한 기술이 추가된 것
PagingAndSortingRepository
를 상속받아 JpaRepository 인터페이스 만듬
@Getter
@Entity // Member 객체를 JPA가 관리하는 엔티티로 지정 -> DB와 매핑
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 안전하게
@AllArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 자동증가 전략
@Column(name = "id", updatable = false)
private Long id;
@Column(name = "name", nullable = false)
private String name;
}