ORM이란?

lavender_je
|2025. 4. 4. 17:37
728x90

✅ ORM이란?

🔸 ORM = Object Relational Mapping

  • Object: 자바 객체 (User, Post, Product 같은 클래스)
  • Relational: 관계형 데이터베이스 (MySQL, PostgreSQL, Oracle 등)
  • Mapping: 서로 연결(Mapping) 한다는 뜻

즉, 자바 객체와 데이터베이스 테이블을 자동으로 매핑해주는 기술

 


✅ 왜 ORM이 필요해?

전통적인 방식(JDBC)에서는 데이터베이스에 직접 SQL을 짜서 주고받았어야 했어:

// JDBC 방식
Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM user WHERE id = ?");
stmt.setLong(1, 1L);
ResultSet rs = stmt.executeQuery();

➡ 이런 코드 너무 복잡하고, 실수도 많고, 재사용하기도 어려움 😩

 


그런데 ORM을 쓰면?

User user = entityManager.find(User.class, 1L);

➡ 끝! 자동으로 SQL 짜고 실행하고 객체로 바꿔줌. 👏

 


✅ ORM의 대표 기술들

기술 설명
JPA 자바 ORM을 위한 공식 인터페이스 (Java 표준)
Hibernate JPA의 가장 대표적인 구현체 (실제로 일하는 애)
Spring Data JPA JPA를 더 쉽게 쓸 수 있게 도와주는 Spring 프레임워크

 


✅ 그럼 정리하면...

  • ORM은 개념이자 기술 전반을 말해
  • JPA는 ORM을 위한 표준 인터페이스
  • Hibernate는 JPA를 실제로 구현한 라이브러리
  • Spring Data JPA는 JPA를 더 쉽게 쓸 수 있게 도와주는 도구

 


🔁 관계 요약!

ORM (개념)
 └─ JPA (자바 ORM 표준)
      └─ Hibernate (JPA 구현체)
           └─ Spring Data JPA (JPA + Hibernate를 더 쉽게!)

 

 

 


✅ ORM(JPA)을 Spring에서 사용하기 위한 초기 세팅

1️⃣ 의존성 추가 (build.gradle 또는 pom.xml)

// build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'com.h2database:h2' // 테스트용 인메모리 DB (또는 MySQL, PostgreSQL 등)
}

 


2️⃣ application.yml 또는 application.properties 설정

 
spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: update  # create, update, validateshow-sql: true      # 콘솔에 SQL 보이기
    properties:
      hibernate:
        format_sql: true

ddl-auto 옵션 설명:

옵션 설명
create 실행할 때마다 테이블 새로 생성
update 변경된 엔티티 정보로 테이블 수정
validate 테이블 구조 확인만, 수정 안 함
none 아무것도 안 함

 


✅ ORM 사용 흐름 (기본 예제)

예를 들어 "User"라는 사용자를 저장하고 싶다고 해보자!

🔸 1. Entity 클래스 만들기

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter @Setter
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // auto-increment
    private Long id;

    private String username;
    private int age;
}

@Entity: 이 클래스는 테이블과 매핑된다
@Id: 기본 키
@GeneratedValue: 자동 생성 전략

 


🔸 2. Repository 인터페이스 만들기

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 기본 CRUD는 자동 제공
    // 여기에 메서드 이름만으로 쿼리를 추가로 만들 수 있음
    List<User> findByUsername(String username);
}

JpaRepository를 상속받으면
👉 CRUD, 페이징, 정렬, 커스텀 쿼리 등을 자동으로 사용할 수 있음

 


🔸 3. Service 또는 Controller에서 사용

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    public void createUser() {
        User user = new User();
        user.setUsername("지은");
        user.setAge(24);

        userRepository.save(user);  // SQL 없이 저장!
    }
}

 


✅ 핵심 정리

구성 요소역할
@Entity 자바 클래스 → DB 테이블로 매핑
JpaRepository ORM 기반으로 DB 접근하는 인터페이스 (SQL 거의 안 씀)
@Service, @Controller 로직과 사용자 요청 처리, 리포지토리 사용

 


✅ ORM 시작 요약 흐름

🧑‍💻 자바 클래스 작성 (@Entity)
⬇️
📄 테이블로 자동 매핑 (ORM)
⬇️
📦 Repository로 DB 접근 (SQL 직접 작성 X)
⬇️
🌐 Controller/Service에서 호출

 


이제 ORM으로 자바 객체만 잘 만들고 save(), findById() 같은 메서드를 쓰면
💥 알아서 SQL 날리고, 결과를 객체로 변환해줌!


 

728x90