본문 바로가기
스프링 부트 3으로 백엔드 입문하기

5장 ORM

by hoshi03 2023. 11. 22.

• 데이터베이스와 ORM

JPA : 자바에서 RDBMS를 사용하는 방식을 정의해둔 인터페이스

하이버네이트 : JPA의 구현체인 ORM 프레임워크, 하이버네이트를 이용하면 DB 종류에 상관없이 자유롭게 사용가능하다

 

엔티티 : db 테이블과 매핑되는 객체,  db 테이블과 직접 연결되기에 일반객체와 구분되게 엔티티라 한다

엔티티 매니저 : 엔티티를 관리해 db와 어플리케이션 사이에서 crud를 한다

엔티티 팩토리 : 엔티티 매니저를 생성하는 곳

 

스프링 부트에서는 직접 엔티티 매니저 팩토리를 만들지 않고 내부에 하나의 엔티티 매니저 팩토리를 두고

@PersistenceContext나 @Autowired를 사용해서 엔티티 매니저를 사용한다

 

• 영속성 컨텍스트

영속성 컨텍스트는 엔티티를 관리하는 가상의 공간이다

1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩의 특징이 있다

 

1차 캐시 : 엔티티를 조회하면 1차 캐시내에서 조회하고 반환하고, 1차 캐시에 없으면 db에서 조회해 1차 캐시에 저장하고 반환한다, 캐시된 데이터는 db를 거치지 않고 반환되기에 빠르게 데이터를 조회할 수 있다

 

쓰기 지연 : 트랜잭션을 커밋 하기 전까지는 쿼리를 모았다가 한번에 실행한다

 

변경 감지 : 트랜잭션을 커밋하면 1차 캐시에 있는 값과 현재 값을 비교해서 변경된 점을 db에 반영한다

 

지연 로딩 : 쿼리를 바로바로 날리는 것이 아니라 필요할떄 쿼리를 날린다

 

• 엔티티의 상태

 

엔티티는 분리, 관리, 비영속, 삭제 4가지 상태로 나누어진다

 

• 스프링 데이터 JPA 메서드 사용해보기

 

@Service
public class MemberService {
    final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.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);
    }
}

 

• 기존 코드 어노테이션 해체분석기

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Getter
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false)
    private Long id;
    @Column(name = "name", nullable = false)
    private String name;
}

 

@Entity <- Member 객체를 JPA가 관리하는 엔티티가 되게 하고 Member 클래스를 테이블에 매핑시킨다

@NoArgsConstructor <- 기본 생성자, 엔티티는 반드시 public이나 protect 생성자가 있어야 한다

@ID, @GeneratedValuue <- primary key id auto_increment(1,1)의 기능