Java Persistence API의 약자.
자바에서 객체(클래스)와 DB 테이블을 연결해주는 표준 인터페이스(스펙).
즉, SQL을 직접 안 쓰고도, 자바 객체로 DB 작업을 할 수 있게 해줘.
JPA 자체는 “규격”일 뿐이고, 실제 동작은 구현체가 처리.
JPA 구현체 중 하나 (가장 많이 씀).
JPA가 “이렇게 만들어라”라고 규칙만 정해주면, Hibernate가 실제 SQL을 만들어서 DB랑 통신함.
스프링부트에서 spring-boot-starter-data-jpa 쓰면 기본 구현체가 바로 Hibernate.
Java Persistence Query Language
JPA에서 쓰는 “객체지향 쿼리 언어”
SQL처럼 생겼지만 테이블/컬럼이 아니라 엔티티/필드 기준으로 작성
👉 즉,
SQL: SELECT * FROM board WHERE user_id = 'hong';
JPQL: SELECT b FROM Board b WHERE b.userId = 'hong'
구분 SQL JPQL
user_id
b.userId (엔티티 필드)
반환
ResultSet (Row)
엔티티 객체 (Board)
실행
DB 직접 실행
Hibernate가 SQL로 변환해서 실행
jpa 환경을 위한 라이브러리
pom.xml에 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
spring.jpa.open-in-view=false
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=validate
(교육용으로는 update가 편함; 운영은 none 권장)
none: 아무 것도 안 함 (운영 기본)
validate: 엔티티와 DB 스키마 일치 여부만 검사, 불일치면 에러
update: 가능한 범위에서 스키마 갱신
create: 매 기동마다 드랍 후 생성
create-drop: 기동 시 생성, 종료 시 드랍(테스트용)
JpaRepository<Entity, id> 기본제공 메소드
findAll() → 전체 목록
findById() → 단건 조회
save() → insert/update 겸용
deleteById() → 삭제
count() → 전체 행 수
findAll(Pageable) → 페이징 조회
실제 테이블과 연결되는 Entity 구현
package com.study.project.jpa;
import java.sql.Date;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name="board")
public class JpaBoardEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "board_num")
private Integer boardNum;
@Column(name = "user_id", nullable = false)
private String userId;
@Column(name = "user_name")
private String userName;
@Column(name = "board_subject")
private String boardSubject;
@Column(name = "board_content")
private String boardContent;
@Column(name = "reg_date")
private Date regDate;
@Column(name = "upt_date")
private Date uptDate;
@Column(name = "view_cnt")
private Integer viewCnt;
// === getter / setter ===
public Integer getBoardNum() { return boardNum; }
public void setBoardNum(Integer boardNum) { this.boardNum = boardNum; }
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
public String getBoardSubject() { return boardSubject; }
public void setBoardSubject(String boardSubject) { this.boardSubject = boardSubject; }
public String getBoardContent() { return boardContent; }
public void setBoardContent(String boardContent) { this.boardContent = boardContent; }
public Date getRegDate() { return regDate; }
public void setRegDate(Date regDate) { this.regDate = regDate; }
public Date getUptDate() { return uptDate; }
public void setUptDate(Date uptDate) { this.uptDate = uptDate; }
public Integer getViewCnt() { return viewCnt; }
public void setViewCnt(Integer viewCnt) { this.viewCnt = viewCnt; }
}