Super Kawaii Cute Cat Kaoani
본문 바로가기
⚙️ Back-end/SpringBoot

Springboot [5] : 데이터베이스 개념

by wonee1 2024. 3. 15.
728x90

* 책 스프링부트 3 백엔드 개발자 되기 자바편을 공부하면서 정리한 내용입니다
 
 
 

데이터베이스란

 
 
☑️데이터베이스란?
 
데이터를 효율적으로 보관하고 꺼내볼 수 있는 곳 
 
 
데이터베이스 관리자
 

  • 데이터베이스를 관리하기 위한 소프트웨어 DBMS
  • <예시> MySQL, 오라클
  • 관리 특징에 따라서  관계형,객체-관계형, 도큐먼트형, 비관계형 등으로 분류 
  • 가장 많이 사용하는 DBMS는 관계형 

 
관계형 DBMS 
 

  • RDBMS (Relational DBMS) 
  • 테이블 형태로 이루어진 데이터 저장소 

 
H2 
 

  • 자바로 작성되어 있는 RDBMS
  • 스프링부트가 지원하는 인메모리 관계형 데이터베이스
  • H2는 데이터를 다른 공간에 따로 보관하는 것이 아니라 애플리케이션 자체 내부에 데이터를 저장함 
  • 개발 시 테스트 용도로 많이 사용함 (실제 서비스에선 MySQL과 같은 제품을 많이 사용)

 
 

ORM 이란?

 
 
 
☑️ORM이란?
 
자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법 
 
장점

  • SQL을 직접 작성하지 않고 사용하는 언어로 데이터베이스에 접근할 수 있음
  • 객체지향적으로 코드를 작성할 수 있음 따라서 비즈니스 로직에만 집중가능
  • 데이터베이스 시스템에 대한 종속성이 줄어듦

 
단점 

  • 프로젝트의 복잡성이 커질수록 사용 난이도도 올라감
  • 복잡하고 무거운 쿼리는 ORM로 해결이 불가능한 경우도 있음

 

JPA와 하이버네이트

 
 
☑️JPA이란 

  • 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 (Java Persistence API)
  • 인터페이스이므로 실제 사용을 위해서는 ORM 프레임워크를 추가로 선택해야함 
  • 자바 객체와 데이터베이스를 연결해 데이터를 관리

 
☑️ 하이버네이트
 

  • JPA의 인터페이스를 구현한 구현체이자 자바용 ORM프레임워크

 
 

엔티티 매니저 

 
 
☑️엔티티
 

  • 데이터베이스의 테이블과 매핑되는 객체를 의미
  • 엔티티는 본질적으로는 자바 객체 이므로 일반 객체와 다르지 않음
  • 하지만 데이터베이스의 테이블과 직접 연결된다는 아주 특별한 특징이 있어 구분지어 부름
  • 객체이긴 하지만 데이터베이스에 영향을 미치는 쿼리를 실행하는 객체 

엔티티 매니저 
 

  • 엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성 수정 삭제하는 등의 역할을 함 
  • 엔티티 매니저를 만드는 곳을 엔티티 매니저 펙토리라고 함

 
스프링부트는 내부에서 엔티티 매니저 펙토리를 하나만 생성해서 관리
@PersistenceContext 또는 @Autowired 애너테이션을 사용해서 엔티티 매니저를 사용
 

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

 
 
📌 엔티티 매니저는 Spring Data JAP에서 관리하므로 직접 생성하거나 관리할 필요가 없다 
 
 
 

영속성 컨텍스트란?

 
 
엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장하는 특징이 있
 
 
☑️영속성 컨텍스트
 
JPA의 중요한 특징 중 하나로, 엔티티를 관리하는 가상의 공간 
특징으로 1차 캐시, 쓰기 지연, 변경 감지, 지연로딩이 있다 
 
 
 
1차 캐시 
 

  • 캐시의 키는 엔티티의 @Id 애너테이션이 달린 기본키 역할을 하는 식별자이며 값은 엔티티
  • 엔티티를 조회하면 1차 캐시에서 데이터를 조회하고 값이 있으면 반환 
  • 값이 없으면 데이터베이스에서 조회해 1차 캐시에 저장한 다음 반환 
  • 이를 통해 캐시된 데이터를 조회할 때 데이터베이스를 거치지 않아도 되므로 매우 빠르게 데이터를 조회할 수 있음

 
 
 
쓰기 지연
 

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

 
변경 감지 
 

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

 
 
지연로딩 
 

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

(반대로 조회할 때 쿼리를 보내 연관된 모든 데이터를 가져오는 즉시 로딩도 있음)
 
 

엔티티의 상태 

 
 
영속성 컨테스트가 관리하고 있지 않은 분리 상태
 
영속성 컨테스트가 관리하는 관리 상태
 
영속성 컨테스트와 전혀 관계가 없는 비영속 상태
 
삭제된 상태 
 
 

public class EntityManagerTest{


@Autowired
EntityManager em;

public void example(){
     // 1) 엔티티 매니저가 엔티티를 관리하지 않는 상태 
	Member member = new Member(1L, "홍길동");
    //2) 엔티티가 관리되는 상태
    em.persist(member);
    //3) 엔티티 객체가 분리된 상태 
    em.detach(member);
    //4) 엔티티 객체가 삭제된 상태 
    em.remove(member);


  }


}

 
 
 

스프링 데이터와 스프링 데이터 JPA

 
 
☑️스프링 데이터 JPA란?
 
스프링 데이터의 공통적인 기능에서 JPA의 유용한 기술이 추가된 기술 
 
 
 
스프링 데이터 JPA에서 제공하는 메서드 사용해보기 
 
 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@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);

    }
}

 
 
 

애너테이션 역할 

 
 
@Entity 애너테이션 
 
Member 객체를 JPA가 관리하는 엔티티로 지정 
즉 Member 클래스와 실제 데이터베이스의 테이블을 매핑시킴 
 

@Entity(name = "member_list")
pulic class Article{
 //생성자 
}

 
 
@Id 애너테이션
 
long 타입의 id필드를 테이블의 기본키로 지정한다
 
@GeneratedValue 애너테이션
 
기본키의 생성 방식을 결정한다.
 
자동키 생성 설정 방식 
 

  • auto: 선택한 데이터베이스 방언에 /다라 방식을 자동으로 선택 (기본값)
  • identity: 기본키 생성을 데이터베이스에 위임 (=AUTO_INCERMENT)
  • sequence: 데이터베이스 시퀀스를 사용해서 기본키를 할당하는 방법, 오라클에서 주로 사용
  • table: 키 생성 테이블 사용

 
@Column 애너테이션
 
속성
 

  • name: 필드와 매핑할 컬럼이름, 설정하지 않으면 필드 이름으로 지정
  • nullable: 컬럼의 null 허용 여부, 설정하지 않으면 true
  • unique:컬럼의 유일한 값 여부 
  • columnDefinition: 컬럼 정보 설정, default 값을 줄 수 있음

 
 
 

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

}

MemberReposiotry.java
 
리포지토리는 엔티티에 있는 데이터를 조회하거나 저장, 변경 ,삭제를 할 때 사용하는 인터페이스로 스프링 데이터 jpa에서 제공하는 인터페이스인 JpaRepository 클래스를 상속받아 간단하게 구현할 수 있음 
 
 
 

728x90