프레임워크 · 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 데이터 접근 에서 다룹니다.

다음 단계