1. ORM (Object-Relational Mapping)
ORM은 객체 지향 언어의 객체와 관계형 DB의 테이블 / 행 / 열을 매핑해, 코드를 객체 중심으로 작성하면 내부에서 적절한 SQL을 생성, 실행해 주는 기술이다.
이를 통해 간단한 CRUD는 대부분 SQL 쿼리를 직접 작성하지 않고도 사용이 가능하여 단순 반복작업이 줄어들어 개발 과정이 단순화되고, 코드의 가독성 또한 향상된다.
ORM을 이용해 작성된 쿼리는 중간에 DB가 바뀌더라도 그에 맞는 방언(dialect)으로 맞춰 번역해 주는 어댑터 역할도 한다.
2. JPA (JAVA Persistence API)
자바에서 객체와 RDB 테이블 간 매핑(ORM)을 표준화한 스펙으로 구현체로는 Hibernate, EclipseLink 등이 있지만 Hibernate가 사실상 표준처럼 쓰인다.
2-1 주요 개념
- Entitiy : 테이블과 매핑되는 클래스
- Persistence Context(영속성 컨텍스트) : 엔티티 인스턴스를 1차 캐시에 보관하고 생명주기를 관리
- 영속성 컨텍스트는 키(식별자) - 엔티티 맵을 가지고 있어 같은 식별자를 find()하면 DB 재조회 없이 캐시에서 반환
- 쓰기 지연(Write - Behind) : persist()를 실행하면 바로 Insert 쿼리가 나가지 않고 Flush 시점에 일괄 Insert
- 변경 감지(Dirty Checking) : 엔티티 스냅샷을 보관하여 달라진 필드를 감지하여 UPDATE 쿼리 생성
- 지연 로딩과 프록시 : 관계가 있는 엔티티를 필드로 가지고 있고 지연 로딩(LAZY)으로 설정되어 있다면 실제 접근 시 조회 그전까진 프록시
2-2 매핑 예시
@Entity
@Table(name = "member")
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String username;
@Column
private int age;
}
3. JPQL (JAVA Persistence Query Language)
객체 모델(Entity)를 대상으로 하는 질의 언어(Query Language)로 SQL과 매우 유사하지만 테이블과 컬럼이 아닌 Entity와 필드를 대상으로 쿼리를 작성할 수 있다
3-1 특징
- 엔티티/필드 기반
- 키워드는 대소문자 무관, 엔티티/필드명은 대소문자 구분
- ex) select m from Member m where m.name = :name
- 경로 표현식과 암시적 조인
- 단일 값 연관(@ManyToOne)은 암시적 INNER JOIN 가능 m.team.name
- 컬렉션 연관(@OneToMany)은 명시적 JOIN 필요 join m.members mm
- 조인 & 페치 조인
- join, left join 지원 (right join은 없음)
- join fetch로 연관 엔티티 즉시 로딩(N+1 방지)
- 프로젝션
- 엔티티 : select m from Member m
- 특정 필드 : select m.name, m.age Member m
- DTO : select new com.example.MemberDto(m.id, m.name) from Member m
'CS > Spring' 카테고리의 다른 글
DispatcherServlet (3) | 2025.08.25 |
---|---|
Servlet? ServletContainer? (5) | 2025.08.18 |
AOP 정리 (5) | 2025.08.13 |