JPA와 Hibernate란

마법사 슬기·2025년 10월 23일

JPA란?

Java Persistence API의 약자.
자바에서 객체(클래스)와 DB 테이블을 연결해주는 표준 인터페이스(스펙).
즉, SQL을 직접 안 쓰고도, 자바 객체로 DB 작업을 할 수 있게 해줘.
JPA 자체는 “규격”일 뿐이고, 실제 동작은 구현체가 처리.

Hibernate란?

JPA 구현체 중 하나 (가장 많이 씀).
JPA가 “이렇게 만들어라”라고 규칙만 정해주면, Hibernate가 실제 SQL을 만들어서 DB랑 통신함.
스프링부트에서 spring-boot-starter-data-jpa 쓰면 기본 구현체가 바로 Hibernate.

JPQL 이란?

Java Persistence Query Language
JPA에서 쓰는 “객체지향 쿼리 언어”
SQL처럼 생겼지만 테이블/컬럼이 아니라 엔티티/필드 기준으로 작성
👉 즉,

SQL: SELECT * FROM board WHERE user_id = 'hong';
JPQL: SELECT b FROM Board b WHERE b.userId = 'hong'

JPQL vs SQL 차이

구분 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>

JPA 기본

  • application.properties에 저장
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; }
}
profile
주니어 웹개발자의 성장 일지

0개의 댓글