심화/Spring

[Spring] JPA란 무엇일까?

annovation 2025. 10. 3. 09:15

DB를 직접 다룰 때의 문제점

 

💡DB를 직접 다룰 때 필요한 과정

 

아래 형태의 객체 데이터를 DB에 저장해서 관리해야한다면 어떻게 해야 할까?

public class Memo {
    private Long id;
    private String username;
    private String contents;
}

 

1️⃣ DB 테이블 생성

create table memo (
    id bigint not null auto_increment,
    contents varchar(500) not null,
    username varchar(255) not null,
    primary key (id)
);
  • 직접 DB로 접속해서 SQL 작성 필요

2️⃣ 애플리케이션에서 SQL 작성

String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
String sql = "SELECT * FROM memo";

 

3️⃣ JDBC로 SQL 실행

jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");
jdbcTemplate.query(sql, ...);

 

4️⃣ SQL 결과를 객체로 변환

@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
		// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
		Long id = rs.getLong("id");
		String username = rs.getString("username");
		String contents = rs.getString("contents");
		return new MemoResponseDto(id, username, contents);
}

 

➡️ 테이블 정의부터 SQL 작성, 실행, 결과 매핑까지 전부 직접 해줘야 함

 

💡SQL 의존성 문제

 

메모 데이터에 비밀번호를 추가해야 한다면 어떻게 될까?

public class Memo {
    private Long id;
    private String username;
    private String contents;
		
    // 비밀번호 추가
    private String password;
}

 

1️⃣ SQL 직접 수정

String sql = "INSERT INTO memo (username, contents, password) VALUES (?, ?, ?)";

 

2️⃣ MemoResponseDto 객체에 값을 넣어주는 부분도 추가

@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
		// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
		Long id = rs.getLong("id");
		String username = rs.getString("username");
		String contents = rs.getString("contents");
		String password = rs.getString("password");
		return new MemoResponseDto(id, username, contents, password);
}

 

➡️ 단순히 컬럼 하나 추가했을 뿐인데 SQL, DTO 변환, 매핑 코드까지 여러 군데를 다 수정해야 함

 

➡️ 반복적이고 번거로운 애플리케이션 단에서의 SQL 작업을 줄여주기 위해서 ORM(객체 관계 매핑)기술들이 등장 하게 된다.


ORM

ORM

 

💡ORM이란?

 

🔎 ORM : Object-Relational Mapping

  • Object : "객체"지향 언어 (자바, 파이썬)
  • Relational : "관계형" 데이터베이스 (H2, MySQL)

🔎 ORM은 이름 그대로 객체와 DB의 관계를 매핑 해주는 도구이다.

  • 객체 즉, 자바의 클래스와 DB의 데이터를 직접 매핑 하려면 앞서 살펴본 것 처럼 매우 번거롭고 많은 작업들이 필요했지만 ORM을 사용하면 이를 자동으로 처리해준다.

JPA

JPA

 

💡JPA란?

 

🔎 JPA : Java Persistence API

  • 자바 ORM 기술에 대한 표준 명세
  • 즉, "규칙"만 정의되어 있고, 실제 구현체는 따로 존재

💡JPA 동작 흐름

JPA 동작 흐름

  • 애플리케이션과 DB(JDBC) 사이에서 동작
  • JPA를 사용하면 DB 연결 과정을 직접 개발하지 않아도 자동으로 처리해준다.
  • 객체를 통해 간접적으로 DB 데이터를 다룰 수 있기 때문에 매우 쉽게 DB 작업을 처리할 수 있습니다.

💡하이버네이트(Hibernate)란?

  • JPA 는 표준 명세이고, 이를 실제 구현한 프레임워크 중 사실상 표준 Hibernate이다.
  • 스프링 부트에서는 기본적으로 ‘하이버네이트’ 구현체를 사용 중이다.
사실상 표준 (de facto, 디팩토)
보통 기업간 치열한 경쟁을 통해 시장에서 결정되는 비 공식적 표준이다.
출처 : 위키백과

출처

https://teamsparta.notion.site/2-6-JPA-2252dc3ef51481109a86d819dcc07fff

 

챕터2-6 : JPA란 무엇일까? | Notion

DB를 직접 다룰 때의 문제점

teamsparta.notion.site