1. ORM Object relational mapping
자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
데이터베이스에 age와 name 컬럼에 데이터를 꺼내올때 보통은 SQL언어로 데이터를 꺼내 사용함
하지만 ORM으로 사용하면 마치 객체처럼 사용이 가능하고 SQL을 몰라도 원하는 데이터를 받아올 수 있음
즉 객체와 데이터베이스를 연결해 자바 언어로만 데이터베이스를 다룰 수 있게 하는 도구를 ORM이라고 함
장점
1. sql을 직접 작성하지 않고 사용하는 언어로 데이터베이스에 접근 할 수 있다.
2. 객체지향적으로 코드를 작성할 수 있기 때문에 비즈니스 로직에만 집중할 수 있다.
3. 데이터 베이스 시스템이 추상화 되어있기 때문에 mysql 에서 postgresql로 전환하더라도 추가로 드는 작업비용이 거의 없다. 즉, 데이터베이스 시스템에 대한 종속성이 줄어듬
4. 매핑하는 정보가 명확하기 때문에 erd에 대한 의존도를 낮추 수 있고 유지보수 할 때 유리하다.
단점
1. 프로젝트 복잡성이 커질수록 사용 난이도도 올라감
2. 복잡하고 무거운 쿼리는 ORM으로 해결이 불가능한 경우가 있다.
2. JPA와 하이버네이트
ORM에도 여러종류가 존재함. 자바에서는 JPA java persitence API 를 표준으로 사용함
JPA는 자바에서 관계형 데이터베이스를 사용하는 방식을 정희한 인터페이스인데, 인터페이스 이므로 실제 사용을 위해서는 ORM 프레임워크를 추가로 선택해야함.
대표적으로 하이버네이트 hibernate를 많이 사용함. 하이버네이트는 JPA인터페이스를 구현한 구현체이자 자바용 ORM 프레임워크임. 내부적으로는 JDBC API를 사용함
JDBC java database connectivity API
애플리케이션이 데이터베이스와 상호작용 할 수 있도록 하는 java api이다.
JDBC는 관계형 데이터베이스에 연결하고, sql문을 실행하고, 결과를 검색하기 위한 표준 인터페이스를 제공함
엔티티 entity
데이터베이스의 테이블과 매핑되는 객체를 의미
엔티티는 본질적으로는 자바 객체이므로 일반객체와 다르지 않지만, 데이터베이스의 테이블과 직접 연결된다는 아주 특별한 특징이 있어 구분지어 부른다.
즉, 엔티티는 객체이긴 하지만 데이터베이스에 영향을 미치는 쿼리를 실행하는 객체임
엔티티 매니저 entity manager
엔티티를 관리해 데이터베이스와 어플리케이션 사이에서 객체를 생성, 생성, 수정, 삭제하는 등의 역할을 한다.
그리고 이런 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리 entity manage factory 이다.
ex) 2명이 동시에 회원가입 시도시
회원 1 요청에 대해서 가입처리 할 엔티티매니저를 엔티티 매니저 팩토리가 생성하면 이를 통해 가입 처리해 데이터베이스에 회원정보를 저장하는 것이다. 회원2 도 마찬가지로 엔티티매니저를 엔티티 매니저 팩토리가 생성해서 가입처리 한다.
그리고 회원 1,2 를 위해 생성된 엔티티 매니저는 필요한 시점에 데이터베이스와 연결한 뒤에 쿼리를 처리함
영속성 컨텍스트
엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장한다는 특징이 있다.
영속성 컨텍스트는 jpa의 중요한 특징중 하나로, 엔티티를 관리하는 가상의 공간이다.
영속성 컨텍스트에는 1차캐시, 쓰지지연, 변경감지, 지연로딩이라는 특징이 있다.
- 1차캐시
영속성 컨텍스트는 내부에 1차 캐시를 가지고 있다.
이때 캐시의 키는 엔티티의 @Id 애너테이션이 달린 기본키 역할을 하는 식별자 이며 값은 엔티티이다.
엔티티를 조회하면 1차 캐시에서 데이터를 조회하고 값이 있으면 반환합니다. 값이 없으면 데이터베이스에서 조회해 1차 캐시에 저장한 다음 반환한다 이를 통해 캐시된 데이터를 조회할 때에는 데이터베이스를 거치지 않아도 되므로 매우 빠르게 데이터를 조회 할 수 있다.
- 쓰기지연 transactional write-behind
트랜잭션을 커밋하기 전까지는 데이터베이스에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 모았던 쿼리를 한번에 실행하는 것을 의미한다.
예를 들어 데이터 추가 쿼리가 3개라면 영속성 컨텍스트는 트랜잭션을 커밋하는 시점에 3개의 쿼리를 한꺼번에 쿼리를 전송한다. 이를 통해 적당한 묶음으로 쿼리를 요철할 수 있어 데이터베이스 시스템의 부담을 줄 일 수 있다.
- 변경감지
트랜잭션을 커밋하면 1차캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 변경 사항을 감지해 변경된 값을 데이터베이스에 자동으로 반영한다.
이를 통해 쓰기지연과 마찬가지로 적당한 묶음으로 쿼리를 요청할 수 있고, 데이터베이스 시스템의 부담을 줄 일 수 있다.
- 지연로딩 lazy loading
쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 떄 쿼리를 날려 데이터를 조회하는 것을 의미한다. ( 반대로 조회할 때 쿼리를 보내 연관된 모든 데이터를 가져오는 즉시 로딩도 있다.)
위 특징들이 갖는 공통점은 모두 데이터베이스의 접근을 최소화해 성능을 높일 수 있다는 거다.
캐시를 하거나, 자주쓰지 않게 하거나, 변화를 자동 감지해서 미리 준비하거나 하는 등의 방법을 통해서.
엔티티 상태
앤티티는 4가지 상태를 가진다. 영속성 컨텍스트가 관리하고 있지 않는 분리 detached 상태, 영속성 컨텍스트가 관리하는 관리 managed 상태, 영속성 컨텍스트와 전혀 관계가 없는 비영속 transient상태, 삭제된 removed 상태로 나눠진다.
스프링데이터와 스프링 데이터 JPA
스프링데이터 spring data 는 비즈니스 로직에 더 집중할 수 있게 데이터베이스 사용 기능을 클래스 레벨에서 추상화 했다.
스프링데이터에서 제공하는 인터페이스를 통해서 스프링데이터를 사용 할 수 있다.
인터페이스에서는 CRUD를 포함한 여러 메서드가 포함되어 있으며, 알아서 쿼리를 만들어 준다.
또한 이외에도 페이징 처리 기능과 메서드 이름으로 자동으로 쿼리 빌딩하는 기능이 제공되는 등 많은 장점이 있다.
추가로 데이터베이스에 맞게 기능을 확장해 제공하는 기술도 제공한다.
예를 들어 표준스펙 JPA는 스프링에서 구현한 스프링데이터JPA spring data jpa를 사용
몽고디비는 스프링 데이터 몽고디비 spring data mongoDB 를 사용
스프링 데이터 JPA
스프링 데이터의 공통적인 기능에서 jpa의 용한 기술이 추가된 기술이다.
스프링 데이터 jpa에서는 스프링 데이터의 인터페이스인 pagingAndSortingRepository를 상속받아 jpaRepository 인터페이스를 만들어으며, jpa를 더 편리하게 사용하는 메서드를 제공한다.
스프링데이터 jpa를 사용하면 리포지터리 역할을 하는 인터페이스를 만들어 데이터베이스의 테이블 조회, 수정, 생성, 삭제 같은 작업을 간단히 할 수 있습니다.
다음과 같이 jpaRepository 인터페이스를 우리가 만든 인터페이스에서 상속받고 제네릭에는 관리할 <엔티티이름, 에티티 기본키의 타입>을 입력하면 기본 CRUD를 위해 만든 메서드를 사용 할 수 있다.
public interface MemberRepository extends JpaRepository<Member, Long> {
}
'dev > 스프링' 카테고리의 다른 글
스프링부트3 - 테스트케이스 작성, junit @test작성, AssertJ (0) | 2024.02.02 |
---|---|
[전자정부 프레임워크] id 생성방식 정리 (0) | 2021.02.23 |
[eclipse] export, import, maven 프로젝트 변환 (0) | 2021.01.28 |
[maven] GroupId, ArtifactId, Version (0) | 2021.01.27 |