본문 바로가기

Study

[내일배움캠프 TIL] 6일차 - Entity, 영속성 등 복습

728x90
반응형

실습에 들어가기 앞서서 오늘은 

헷깔리고 어려웠던 부분을 복습하는 시간을 가졌습니다.

모든 강의를 다 듣고 코드도 따라한뒤 다시 복습하니까

이해가 더 잘되고 내것으로 만들수 있는 것 같습니다.

몰랐던 부분도 확실히 더 잘 알 수 있게 되었습니다.

 

ORM을 왜 쓰는지? 에 대해 이해가 잘 안되었는데, 

db에 항목이 바뀔때마다 관련 sql문도 수정하고 db도 수정하는 작업들을 실무에서는 항상했었습니다.

ORM을 쓰면 그것을 자동으로 해줘서 편리하게 관리할 수 있다는 것을 알게되었습니다.

1. 오늘의 학습 키워드

 

  • Web: Servlet, Dispatcher Servlet
  • ORM: JPA, Hibernate, Entity
  • Persistence: Persistence Context (영속성 컨텍스트), Entity Manager
  • Optimization: 1차 캐시, 쓰기 지연 저장소, 변경 감지 (Dirty Checking)
  • Status: 비영속, 영속, 준영속 (Detached), Merge

 

2. 핵심 키워드 상세 정리

🔹 Servlet & Dispatcher Servlet

  • Servlet: 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램의 규격입니다. HttpServlet을 상속받아 HTTP 요청을 처리합니다.
  • Dispatcher Servlet: 스프링 MVC의 핵심으로, 모든 요청을 맨 앞에서 받아 적절한 컨트롤러로 뿌려주는 'Front Controller' 역할을 하는 거대 서블릿입니다.

-> 결국 servlet은 뭔가 하나의 프로그램? 느낌으로 http요청을 쉽게 처리해주는 것

🔹 ORM & JPA (Java Persistence API)

  • ORM: 객체(Object)와 관계형 데이터베이스(Relational)를 매핑해주는 기술입니다.
  • JPA: 자바 ORM 기술에 대한 **표준 명세서(인터페이스 모음)**입니다.
  • Hibernate: JPA라는 명세서를 실제로 구현한 가장 대중적인 구현체로, 사실상의 표준(de facto standard)으로 통합니다.

🔹 Entity (엔티티)

  • DB의 테이블과 1:1로 매핑되는 자바 객체입니다.
  • JPA에 의해 관리되며, 클래스 위에 @Entity 어노테이션을 붙여 선언합니다.
import jakarta.persistence.*; // JPA 어노테이션 패키지

@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name = "memo") // 매핑할 테이블의 이름을 지정 (DB에는 memo 테이블로 생성됨)
public class Memo {

    @Id // 테이블의 기본키(PK)와 매핑
    @GeneratedValue(strategy = GenerationType.IDENTITY) // ID 자동 생성 전략 (Auto Increment)
    private Long id;

    // nullable: null 허용 여부 (false면 NOT NULL)
    // unique: 중복 허용 여부 (true면 UNIQUE 제약조건)
    @Column(name = "username", nullable = false, unique = true)
    private String username;

    // length: 컬럼 길이 지정 (기본값 255)
    @Column(name = "contents", nullable = false, length = 500)
    private String contents;

    // JPA는 기본 생성자가 필수입니다.
    public Memo() {
    }

    // 데이터를 넣기 위한 생성자
    public Memo(String username, String contents) {
        this.username = username;
        this.contents = contents;
    }

    // Getter/Setter (보통 Getter는 필수, Setter는 필요한 경우만 생성)
    public Long getId() { return id; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getContents() { return contents; }
    public void setContents(String contents) { this.contents = contents; }
}

🔹 영속성 컨텍스트 (Persistence Context)

  • 정의: 엔티티 객체들을 효율적으로 관리하기 위한 가상의 관리 공간입니다.
  • 특징: 엔티티를 영구 저장하는 환경이라는 뜻으로, Entity Manager를 통해 접근합니다.

🔹 Entity Manager & 내부 구조

  • 1차 캐시: 조회한 엔티티를 보관하는 메모리 공간입니다. 동일한 ID 조회 시 DB를 거치지 않고 캐시에서 바로 반환하여 성능을 높입니다.
  • 쓰기 지연 저장소 (Write-Behind): persist() 호출 시 즉시 DB에 쿼리를 보내지 않고, SQL 쿼리를 모아두는 곳입니다. 트랜잭션 커밋 시 한꺼번에 DB에 반영합니다.
  • 변경 감지 (Dirty Checking): 엔티티의 최초 상태(Loaded State)를 스냅샷으로 저장해두고, 커밋 시점에 현재 상태와 비교하여 변경된 부분이 있으면 자동으로 UPDATE 쿼리를 생성합니다.

🔹 영속 상태의 변화

  • 영속 -> 준영속 (Detach): 영속성 컨텍스트의 관리에서 벗어난 상태입니다. 변경 감지가 작동하지 않습니다.
    • detach(entity): 특정 엔티티만 제외
    • clear(): 영속성 컨텍스트 전체 비우기
    • close(): 영속성 컨텍스트 종료
  • 준영속 -> 영속 (Merge): merge()를 통해 준영속 상태의 데이터를 바탕으로 새로운 영속 상태의 엔티티를 반환하여 다시 관리 대상으로 만듭니다.

🔹 트랜잭션과 Flush

  • JPA 트랜잭션: 여러 SQL 작업을 하나로 묶어 처리하며, 마지막에 commit이 호출되어야 실제 DB에 저장됩니다.
  • Flush: 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 작업입니다. (보통 커밋 시 자동 발생)

🔹 Spring Data JPA

  • JPA를 한 단계 더 추상화하여, 인터페이스 선언만으로도 공통적인 CRUD(저장, 조회, 수정, 삭제)를 처리할 수 있게 해주는 강력한 프레임워크입니다.

 

반응형