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(저장, 조회, 수정, 삭제)를 처리할 수 있게 해주는 강력한 프레임워크입니다.
반응형
'Study' 카테고리의 다른 글
| [내일배움캠프] MSA 강의 총 정리 (0) | 2026.04.15 |
|---|---|
| [내일배움캠프 TIL] 7일차 - entity 연관관계 (0) | 2026.04.14 |
| [내일배움캠프 TIL] 5일차 - MSA (Microservice Architecture) (0) | 2026.04.10 |
| [내일배움캠프 TIL] 4일차 - MSA (Microservice Architecture) (0) | 2026.04.09 |
| [내일배움캠프 TIL] 3일차 - Spring 심화 (0) | 2026.04.08 |