프레임워크 · JPA
JPA
Java 객체와 데이터베이스 테이블을 자동으로 연결해주는 표준 ORM입니다. SQL을 직접 쓰지 않고도 Java 객체를 저장·조회하는 것처럼 DB를 다룰 수 있어요.
한 줄로
JPA? 는 엔티티? 클래스 하나를 테이블 한 개에 매핑하고, 객체 한 개를 테이블의 한 줄(row)에 대응시킵니다. 저장·조회 같은 기본 작업은 리포지토리? 인터페이스만 선언하면 구현을 스프링이 만들어줘요.
엑셀 표(테이블)의 한 줄을 Java 객체 하나로 바꿔 주는 자동 번역기 같은 것입니다. 표에 직접 손대는 대신 객체를 다루면, JPA가 알아서 그에 맞는 SQL을 만들어 실행해요.
왜 / 어디에 쓰나
- 기본 CRUD — 저장·조회·수정·삭제를 SQL 없이 객체로 처리
- 이름으로 쿼리 —
findByUserid처럼 메서드 이름만으로 조회 생성 - 관계 매핑 — 사용자↔역할 같은 테이블 간 관계를 객체로 표현
- DB 독립성 — 같은 코드로 PostgreSQL 등 여러 DB에 대응
핵심 개념 3가지
| 개념 | 설명 |
|---|---|
| 엔티티? | @Entity 로 테이블에 매핑되는 클래스. @Id(기본키), @Column(열), 관계 애너테이션으로 구성. |
| 리포지토리? | DB 접근을 맡는 인터페이스. 메서드 이름만으로 쿼리가 만들어지고, 구현은 스프링이 생성. |
| QueryDSL? | 조건이 동적으로 바뀌는 복잡한 조회를 타입 안전한 Java 코드로 작성. |
엔티티 — 객체를 테이블에
@Entity
@Table(name = "tb_user", schema = "lds")
public class User extends BaseAuditEntity {
@Id
@GeneratedValue
private UUID id; // 기본키
@Column
private String userid; // 열(column)
@Column
private String name;
}리포지토리 — 이름으로 쿼리
인터페이스만 선언하면 됩니다. findByUserid 라는 이름을 보고 JPA가 WHERE userid = ? 쿼리를 자동으로 만들어줘요.
public interface UserRepo extends BaseRepo<User, UUID> {
// 메서드 이름만으로 쿼리 생성: SELECT ... WHERE userid = ?
Optional<User> findByUserid(String userid);
}동적 조회는 QueryDSL로
검색어·필터처럼 조건이 런타임에 달라지는 조회는 메서드 이름으로 표현하기 어렵습니다. 이때는 QueryDSL? 로 조건을 코드로 조립해요.
var q = queryFactory.selectFrom(user);
if (filter.keyword() != null) {
q.where(user.name.containsIgnoreCase(filter.keyword()));
}
return q.fetch();이 프로젝트와의 관계
이 프로젝트는 JPA + QueryDSL 을 실제로 사용합니다. 단순 CRUD·이름 쿼리는
core/repo 의 리포지토리로, 복잡한 동적 조회는 core/query 의 QueryDSL로 나눠 둡니다.
jOOQ·MyBatis는 의존성만 잡혀 있고 실제로는 쓰지 않아요.
실제 코드와 깊은 내용은 be-04 데이터 접근 에서 다룹니다.
다음 단계
- 엔티티(클래스 ↔ 테이블) 매핑부터 → JPA 1 · 엔티티 매핑
- JPA를 감싸는 백엔드 프레임워크 → Spring
- 엔티티가 저장되는 실제 DB → PostgreSQL
- 실제 코드로 배우는 데이터 접근 → be-04 데이터 접근