본문 바로가기

Spring 공부

spring 공부 - 앤티티, ORM, JPA, 스프링데이터 JPA

728x90
반응형

 

데이터베이스

 

데이터를 매우 효율적으로 보관하고 꺼내볼 수 있는 곳

 

DBMS

 

데이터베이스를 관리하기 위한 소프트웨어 database management system
데이터베이스는 많은 사람이 공유할 수 있어야 하므로 동시 접근할 수 있어야한다.

 

관계형 DBMS

 

관계형데 모델 기반
테이블 형태로 이루어진 데이터 저장소

 

ORM

 

object-relational mapping 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
ORM이 있다면 데이터베이스의 값을 마치 객체처럼 사용할 수 있다.
자바 언어로만 데이터베이스에 접근해서 원하는 데이터 받아올 수 있다.
자바 언어로만 데이터베이스 다룰 수 있게 하는 도구

 

장점:
SQL 직접 작성하지 않음
객체지향적 코드 작성할 수 있기 때문에 비즈니스 로직에만 집중
데이터베이스 시스템이 추상화되어 있기 때문에 MySQL -> PostgreSQL 전환해도 추가로 드는 작업이 없다.
데이터베이스 시스템에 대한 종속성이 줄어듦
매핑하는 정보가 명확하기 때문에 ERD 에 대한 의존도를 낮출 수 있고 유지보수가 유리함

 

단점:
프로젝트 복잡성이 커질 수록 사용 난이도 올라감
복잡하고 무거운 쿼리는 ORM으로 해결이 불가능할 수 있음

 

 

JPA, 하이버네이트

 

JPA: 자바에서 관계형 데이터베이스를 사용하는 방식 정의한 인터페이스
실제 사용을 위해서 ORM 프레임워크 보통 (하이버네이트) 추가해야서 사용함
하이버네이트: JPA 인터페이스 구현한 구현체이자 자바용 ORM 프레임워크
내부적으로 JDBC API 사용한다.
목표는 자바 객체를 통해 데이터베이스 종류에 상관없이 데이터베이스를 자유자재로 사용할 수 있게 하는데 있다.

 

JPA(Java Persistence API)
자바 객체와 데이터베이스를 연결해 데이터를 관리한다. 객체 지향 도메인 모델과 데이터베이스의 다리 역할한다.
하이버네이트(Hibernate)
JPA 인터페이스를 구현한다. 내부적으로 JDBC API 사용

 

앤티티

 

데이터베이스의 테이블과 매핑되는 객체
데이터베이스의 테이블과 직접 연결되기 때문에 구분지어 부름
객체이긴 하지만 데이터베이스에 영향을 미치는 쿼리를 실행하는 객체

 

앤티티 매니저

 

앤티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할
앤티티 매니저 팩토리에서 만듦, 두명이 회원가입 요청하면 팩토리에서 매니저 두개 만듦
스프링 부트는 내부에서 엔티티 매니저 팩토리를 하나만 생성해서 관리하고 @Persistence Context 또는 @Autowired 로 엔티티 매니저 사용함

 

@PersistenceContext
EntityManager em;

 

영속성 컨텍스트

 

JPA의 중요한 특징, 엔티티를 관리하는 가상의 공간
데이터베이스에서 효과적으로 데이터를 가져올 수 있고, 엔티티를 편하게 사용할 수 있다.

 

4가지 특징:

 

1차 캐시
영속성 컨텍스트는 1차 캐시를 가진다. 캐시의 키는 @Id 애너테이션이 달린 기본키 역할하는 식별자 이며 값은 엔티티

쓰기 지연


트랜잭션을 커밋하기 전까지는 데이터베이스에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 모았던 쿼리를 한번에 실행하는 것

 

변경 감지
트랜잭션 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 변경 사항 감지해 변경된 값을 데이터베이스에 자동 반영

 

지연 로딩
쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회하는 것

 

앤티티 상태

 

4가지 상태를 가진다. 분리, 관리, 비영속, 삭제된 상태

 

public class EntityManagerTest{
	
    @Autowired
    EntityManager em;
    
    public void example(){
    	// 엔티티 매니저가 엔티티를 관리하지 않는 상태(비영속)
    	Member member = new Member(1L, "홍길동");
        
        // 엔티티가 관리되는 상태 (관리)
        em.persist(member);
        
        // 엔티티 객체가 분리된 상태 (분리)
        em.detach(member);
 		
        // 엔티티 객체가 삭제된 상태 (삭제)
        em.remove(member);
    }
}
   

 

스프링 데이터

 

비즈니스 로직에 더 집중할 수 있게 데이터베이스 사용 기능을 클래스 레벨에서 추상화
스프링데이터에서 제공하는 인터페이스를 통해서 스프링 데이터를 사용할 수 있다.
CRUD를 포함한 여러 메서드가 포함되어 있으며, 알아서 쿼리를 만들어 줌
페이지 처리기능, 메서드 이름으로 자동으로 쿼리를 빌딩하는 기능
각 데이터베이스의 특서엥 맞춰 기능을 확장해 제공하는 기술

 

스프링 데이터 JPA

 

스프링 데이터의 공통적인 기능 + JPA 유용한 기술이 추가된 기술

 

기존 엔티티 상태를 바꾸는 방법(메서드를 호출해서 상태 변경) :

 

@PersistenceContext
EntityManager em;

public void join(){
	Member member = new Member(1L, "홍길동");
    em.persist(member);
}


스프링 데이터 JPA를 사용하면 리포지터리 역할을 하는 인터페이스를 만들어 데이터베이스의 조회, 수정, 생성, 삭제 작업을 간단히 한다.

public interface MemberRepository extends JpaRepository<Member, Long> {
}

 

스프링 데이터 JPA에서 제공하는 메서드

 

Service

 

@Service
public class MemberService {
  @Autowired
  MemberRepository memberRepository;
  public void test() {
    memberRepository.save(new Member(1L, "A"));
    // 생성

    Optional<Member> member = memberRepository.findById(1L);
    List<Member> allMembers = memberRepository.findAll();
    // 조회

    memberRepository.deleteById(1L);
    // 삭제
  }
}

 

Member

@NoArgsConstructor(access = AccessLevel.PROTECTED) // 접근제한자가 protected인  기본 생성자
@AllArgsConstructor
@Getter
@Entity // 엔터티로 지정
public class Member {
  @Id // id 필드를 기본키로 지정
  @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키를 자동으로 1씩 증가
  @Column(name = "id", updatable = false) // @Column 컬럼과 필드 매핑ㅍ
  private Long id;
  @Column(name = "name", nullable = false) // name이라는 not null 컬럼과 매칭
  private String name;
}

 

여기서는 테이블 이름을 지정하지 않았으므로 클래스 이름과 같은 데이터베이스 테이블 member 테이블과 매핑됨
지정하고 싶으면:

 

@Entity(name = "member_List")
public class Article {
...
}

 

 

자동키 생성 설정 방식
AUTO: 선택한 데이터베이스 방언(dialect)에 따라 방식을 자동으로 선택(기본값)
IDENTITY: 기본키 생성을 데이터베이스에 위임(=AUTO_INCREMENT)
SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본키를 할당하는 방법. 오라클에서 주로사용
TABLE: 키 생성 테이블 사용

 

 

@Column 속성
데이터베이스의 칼럼과 필드를 매핑해준다.
name: 필드와 매핑할 칼럼 이름. 설정하지 않으면 필드 이름으로 지정
nullable: 컬럼의 null 허용 여부. 설정하지 않으면 true(nullable)
unique: 컬럼의 유일한 값(unique)여부. 설정하지 않으면 false(non unique)
columnDefinition: 컬럼 정보 설정, default 값 줄 수 있다.

 

Repository

 

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
   
}

 

레포지토리: 엔티티에 있는 데이터들을 조회 , 저장, 변경, 삭제할 때 사용하는 인터페이스
JpaRepository 상속받아 간단하게 구현할 수 있다.

반응형