카테고리 없음

SPRING DATA JPA...

영하10도 아아 2024. 5. 6. 23:55
Spring Data JPA

 

우선 ORM을 알아야한다.

object-relational mapping은 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법.

 

예를 들어 DB에 age,name 컬럼에 20, 홍길동 이라는 값이 들어있다고 생각해보자. 이것을 자바에서 사용하려면 어떻게 해야할까?

보통의 경우 SQL이라는 언어로 데이터를 꺼내 사용한다. 그러면 SQL을 새로 공부해야하니 골치가 아프다,,,

 

하지만 ORM이 있다면 데이터베이스의 값을 마치 객체처럼 사용가능하다.

쉽게 말해 SQL을 전혀 몰라도 자바 언어로만 DB에 접근해서 원하는 데이터를 받아올 수 있다. ( 내가 지금 해야하는 것들...! /로그인,회원가입,게임포인트....)

 

 

장점과 단점

 

장점

 

  1. SQL을 직접 작성하지 않고 현재 사용하는 언어로 DB에 접근 가능.
  2. 객체지향적으로 코드를 작성할 수 있기 떄문에 비즈니스 로직에만 집중가능함.
  3. 데이터베이스 시스템이 추상화되어 있기 때문에 MySQL에서 PostgreSQL로 전환하다고 해도 추가비용 발생 ㄴ. 즉 , DB 시스템에 대한 종속성이 줄어든다.
  4. 매핑하는 정보가 명확하기 때문에 ERD에 대한 의존도를 낮추고 유지보수할 때 유리함.

 

 

단점

 

  1. 프로젝트의 복잡성이 커질수록 사용 난이도 올라감.(규모가 작을 때는 괜찮다.)
  2. 복잡하고 무거운 쿼리는 ORM으로 해결이 불가능한 경우도 있음.

 

 


 

 

JPA와 하이버네이트?

 

DBMS에도 여러 종류가 있는 것처럼 ORM에도 여러 종류가 있다.

자바에서는 JPA(Java Persistence API)를 표준으로 사용한다. JPA는 자바에서 관계형 DB를 사용하는 방식을 정의한 인터페이스이다.

인터페이스이므로 실제 사용을 위해서는 ORM 프레임워크를 추가로 선택해야한다. 대표적으로는 하이버네이트(Hibernate)를 많이 사용한다.

 

 

 

하이버네이트는 JPA 인터페이스를 구현한 구현체이자 자바용 ORM 프레임 워크이다.

 

하이버네이트의 목표..?

>자바 객체를 통해 DB 종류에 상관없이 DB를 자유자재로 사용할 수 있게 하는 것.

 

 


 

 

엔티티 매니저(EntityManager)란?

 

 

 

엔티티(Entity)

우선 엔티티란...

DB의 테이블과 매핑되는 객체를 뜻함. 

엔티티는 본질적으로는 자바 객체이므로 일반 객체와 다르지 않다. 하지만 DB 테이블과 직접 연결된다는 특징이 있다.(중요함)

 

즉, 엔티티는 객체이긴 하나 DB에 영향을 미치는 쿼리를 실행하는 객체인 것.

 

 

엔티티 매니저(Entity Manager)

 

엔티티 매니저는 엔티티를 관리해 DB와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할을 한다.

그리고 이런 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리(Entity Manager Factory)이다.

DB에는 여러 사용자가 접근할 수 있다.

예를 들어 회원 2명이 동시에 회원 가입을 하려는 경우 엔티티 매니저는 다음과 같이 업무를 처리한다.

엔티티 매니저 팩토리, 엔티티 매니저의 역할 수행

 

 

하지만 스프링 부트는 그렇지 않다. 스프링 부트는 내부에서 엔티티 매니저 팩토리를 하나만 생성해서 관리하고

@PersistenceContext 또는 @Autowired 애너테이션을 사용해서 엔티티 매니저를 사용한다.

 

@PersistenceContext
EntityManager em;	//프록시 엔티티 매니저.
			//필요할 때 진짜 엔티티 매니저 호출

 

그리고 스프링 부트는 기본적으로 빈은 하나만 생성해서 공유하므로 동시성 문제가 발생할 수 있다.

그래서 실제로는 엔티티 매니저가 아닌 실제 엔티티 매니저와 연결하는 프록시(가짜) 엔티티 매니저를 사용한다.

필요할 때 DB 트랜잭션과 관련된 실제 엔티티 매니저를 호출하는 것이다.

 

쉽게말해 엔티티 매니저는 Spring Data JPA에서 관리하므로 우리가 직접 생성하거나 관리할 필요 X