Spring 데이터베이스와 ORM알아보기
Spring에서 쓰는 RDBMS알아보기
H2
자바로 되어있는 RDBMS
스프링부트가 지원하는 인메모리형 관계형 데이터베이스
데이터를 다른 공간에 보관하는 것이 아니라 애플리케이션 자체 내부에 데이터를 저장한다.
그래서 애플리케이션을 다시 실행하면 데이터는 초기화된다.
개발 시 테스트용도로 많이 사용한다.
실제 서비스에는 사용하지 않음
ORM(object relational mapping)이란?
자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법이다.
보통은 SQL이라는 언어로 데이터를 꺼내사용한다.
하지만 ORM이 있다면 데이터베이스의 값을 객체처럼 사용할 수 있다.
쉽게 말해 SQL을 몰라도 자바 언어로만 데이터베이스에 접근해서 원하는 데이터를 받아 올 수 있다.
=> 객체와 데이터베이스를 연결해 자바 언어로만 데이터베이스를 다룰 수 있게 하는 도구를 ORM이라고 한다.
장점
1. SQL을 직접 작성하지 않고 사용하는 언어로 데이터베이스에 접근한다.
2. 객체지향적 코드를 작성할 수 있어 비즈니스 로직에 집중할 수 있다.
3. 데이터베이스 시스템이 추상화 되어 있기 때문에 MySQL에서 PostgreSQL로 전환하다고 해도 추가로 드는 작업이 별로 없다.
4. 매핑하는 정보가 명확하기 때문에 ERD에 대한 의존도를 낮추고 유지보수할 때 유리
단점
1. 프로젝트의 복잡성이 커질수록 사용 난이도가 높아진다.
2. 복잡하고 무거운 쿼리는 ORM으로 불가능한 경우가 있다.
DBMS에도 여러 종류가 있듯이 ORM에도 여러 종류가 있다.
자바에는 JPA(Java persistence API)를 표준으로 사용한다.
JPA는 자바에서 정의한 인터페이스이다,.
인터페이스를 사용하기 위해서는 ORM 프레임워크를 추가로 사용
대표적으로 하이버네이트(hibernate)를 사용
하이버 네이트는 JPA인터페이스를 구현한 구현체이자 자바용 ORM프레임 워크이다.
내부적으로는 JDBC API를 사용
엔티티매니저
JPA의 중요한 컨셉 중 하나인 엔티티 매니저와 영속성 컨텍스트에 대해 알아보겠습니다.
엔티티
데이터베이스의 테이블과 매핑되는 객체를 의미
본질적으로 자바 객체이기때문에 일반 객체와 다르지 않다.
하지만 데이터베이스 테이블과 직접 연결된다는 아주 특별한 특징이 있어 구분지어 말한다.
엔티티 매니저
엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성,수정,삭제하는 등의 역할을 한다.
이런 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리이다.
영속성 컨텍스트
엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장한다는 특징이 있다.
영속성 컨텍스트는 JPA에 중요한 특징 중 하나로 엔티티를 관리하는 가상의 공간이다.
이것 덕분에 데이터베이스에서 효과적으로 데이터를 가져오고 엔티티를 편하게 사용할 수 있다.
영속성 컨텍스트의 특징
1. 1차 캐시쓰기
영속성 컨텍스트는 내부에 1차캐시를 가짐
이 때 캐시의 키는 엔티티의 @Id 애너테이션이 달린 기본키 역할을 하는 식별자이며 값은 엔티티이다.
엔티티를 조회하면 1차 캐시에서 데이터를 조회하고 값이 있으면 반환
값이 없으면 데이터베이스에서 조회해 1차 캐시에 저장한 뒤 반환
이를 통해 캐시된 데이터를 조회할 때 에는 데이터베이스를 거치지 않아도 되므로 매우 빠르게 데이터를 조회한다.
2. 쓰기 지연
트랜잭션을 커밋하기 전 까지는 데이터베이스에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 모았던 쿼리를 한번에 실행하는 것
ex)
데이터 추가 쿼리가 3개라면 영속성 컨텍스트는 트랜잭션을 커밋하는 시점에 3개의 쿼리를 한꺼번에 전송
=> 이를 통해 적당한 묶음으로 쿼리를 요청할 수 있어 데이터베이스에 부담을 줄인다.
3. 변경 감지
트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 변경사항을 감지해 변경된 값을 데이터베이스에 저장으로 반
4. 지연 로딩
쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회한다.
엔티티는 4가지 상태를 가진다.
1. 영속성 컨텍스트가 관리하지 않는 분리상태
2. 영속성 컨텍스트가 관리하는 관리상태
3. 영속성 컨텍스트와 전혀 관계가 없는 비영속 상태
4. 삭제된 상태
스프링 데이터 JPA란?
스프링 데이터 JPA는 스프링 데이터의 공통적인 기능에서 JPA의 유용한 기술이 추가된 기술이다.
실습해보기
save 메서드를 호출하여 데이터 객체를 저장
전달인수로 엔티티 Member넘기면 반환값으로 저장한 엔티티를 반환
findById()메서드에서 id를 지정해 엔티티를 하나 조회
findAll() 메서드를 통해 전체 엔티티를 조회
deleteById() 메서드를 통해 id를 지정하면 엔티티를 삭제한다.