Back-end/Spring Boot

스프링부트3 백엔드개발자되기 / 5장 데이터베이스 조작이 편해지는 ORM

Bay Im 2023. 11. 18. 13:00
  • 데이터베이스
    • DBMS(Database managements system)
      • 데이터베이스 관리 및 운영
      • MySQL, 오라클
    • 관계형 DBMS(RDBMS)
      • 테이블 형태로 이루어진 데이터 저장소
      • 각 행은 고유의 키(아이디)를 가지고 있고 값들이 들어간다.
  • ORM(object-relational mapping)
    • 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
    • SQL을 직접 작성하지 않고 데이터베이스에 접근
  • JPA(Java Persistence API)
    • 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
    • 사용시 ORM 프레임워크 사용(hibernate, 내부적으로는 JDBC API 사용)
    • 데이터베이스- JDBC- 하이버네이트- JPA- 스프링데이터JPA- 애플리케이션
  • 엔티티(Entity)
    • 데이터베이스의 테이블과 매핑되는 객체 (직접 연결)
    • 스프링 부트는 내부에서 엔티티 매니저 팩토리를 하나만 생성해서 관리하고 @PersistenceContext 또는 @Autowired 어노테이션을 사용해서 엔티티 매니저를 사용
  • 영속성 컨테스트
    • 영속성 컨테스트는 엔티티를 관리하는 가상의 공간이다.
    • 엔티티 매니저는 엔티티를 영속성 컨테스트에 저장한다는 특징이 있다.
    • 1차 캐시
      • 영속성 컨텍스트는 내부의 1차 캐시를 가지고 있다.
      • 캐시의 키는 엔티티의 @Id 어노테이션이 달린 기본키 역할을 하는 식별자이며 값은 엔티티이다.
      • 엔티티를 조회하면 1차 캐시에서 데이터를 조회하고 값이 있으면 반환, 없으면 DB에서 조회 후 1차 캐시에 저장한 다음 반환. 캐시된 데이터를 조회할 때는 DB를 거치지 않아서 빠르게 조회 가능
    • 쓰기 지연
      • 트랜잭션을 커밋하기 전에는 DB에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 모았던 쿼리를 한번에 실행하는 것을 의미
    • 변경 감지
      • 트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 변경 사항을 감지해 변경된 값을 DB에 자동 반영
    • 지연 로딩
      • 쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회하는 것
  • 엔티티의 상태
    • 엔티티는 4가지의 상태를 가지며, 특정 메서드를 호출해 변경 가능하다.
    • 분리 상태(detached)
      • 영속성 컨텍스트가 관리하고 있지 않은 상태
    • 관리 상태(managed)
      • 영속성 컨텍스트가 관리하고 있는 상태
    • 비영속 상태(transient)
      • 영속성 컨텍스트와 전혀 관계가 없는 상태
    • 삭제된 상태(removed)
    • 엔티티 상태 변경 예)
    public class EntityManagerTest {
    
    @Autowired
    EntityManager em;
    
    public void example() {
    	// 엔티티 매니저가 엔티티를 관리하지 않는 상태(비영속 상태)
    	Member member = new Member(1L, "홍길동");
    
    	// 엔티티가 관리되는 상태
    	em.persist(member);
    	// 엔티티 객체가 분리된 상태
    	em.detach(member);
    	// 엔티티 객체가 삭제된 상태
    	em.remove(member);
    	}
    }
    
  • Repository
    • 레포지토리란 엔티티에 있는 데이터들을 조회, 저장, 변경, 삭제를 할 때 사용하는 인터페이스로 스프링 데이터 JPA에서 제공하는 JpaRepository 클래스를 상속받아 간단하게 구현할 수 있다.
  • 스프링 데이터 JPA(JpaRepository 인터페이스)
    • JpaRepository 인터페이스를 내가 만든 인터페이스에서 상속받고, 제네릭에는 관리할 <엔티티 이름, 엔티티 기본키의 타입>을 입력하면 기본 CRUD 메서드 사용 가능
    • JpaRepository 상속 예)
    public interface MemberRepository extends JpaRepository<Member, Long> {
    }
    
    • 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);
    }
}
728x90