TIL

[250404 TIL] ORM

도원좀비 2025. 4. 4. 20:13

1️⃣ ORM의 기본 개념

  • O(Object): 자바의 객체(클래스, 인스턴스)
  • R(Relational): 관계형 데이터베이스(RDB)의 테이블, 행, 열
  • M(Mapping): 객체와 테이블을 1:1 또는 N:1로 연결(mapping)하는 것

즉, 자바 클래스와 DB 테이블 간의 매핑 규칙을 정의하여 SQL 없이도 데이터를 조회, 저장, 수정, 삭제할 수 있도록 해줍니다.


2️⃣ ORM의 장단점

장점

장점 설명
생산성 반복적인 SQL 작성 없이 객체 중심으로 개발 가능
유지보수성 도메인 모델 중심으로 코드 구조가 깔끔해짐
이식성 DBMS에 독립적인 코드 작성 가능 (JPA의 경우)
객체지향적 개발 객체간 관계(연관관계)를 그대로 코드에 반영 가능

단점

단점  설명
성능 튜닝 필요 복잡한 쿼리 성능 이슈 발생 가능 (N+1 문제 등)
러닝 커브 JPA의 동작 원리와 생명주기, 영속성 컨텍스트 이해 필요
추상화의 한계 복잡한 SQL은 직접 작성(MyBatis 등)하는 게 유리할 수 있음

 

3️⃣ 자바에서 대표적인 ORM 프레임워크

JPA (Java Persistence API)

  • 자바 공식 ORM 표준 인터페이스
  • Hibernate, EclipseLink 등이 JPA 구현체
  • Spring Data JPA는 JPA를 추상화하여 더 쉽게 사용 가능
@Entity 
public class User {
	@Id
    @GeneratedValue
    private Long id;
    private String username;
    }

Hibernate

  • 가장 널리 쓰이는 JPA 구현체
  • JPA를 따르면서도 독자적인 기능 추가
  • 복잡한 ORM 전략을 잘 지원

MyBatis (비표준, SQL Mapper)

  • SQL을 직접 작성하면서도 매핑을 자동으로 지원
  • 완전한 ORM은 아니지만, SQL과 객체 매핑을 지원
  • 복잡한 쿼리 처리에 유리
 
<select id="findUser" resultType="User"> SELECT * FROM users WHERE id = #{id} </select>

 

4️⃣ 핵심 개념 요약 (JPA 기준)

개념 설명
@Entity 테이블과 매핑되는 클래스 지정
@Id, @GeneratedValue PK와 자동 생성 전략
@Column 컬럼 속성 매핑 (nullable, length 등)
영속성 컨텍스트 DB와의 연결을 관리하는 JPA의 핵심 개념
FetchType.LAZY / EAGER 연관관계 조회 방식 지연/즉시 로딩 설정
Cascade, orphanRemoval 연관 엔티티 전파 설정

 


5️⃣ ORM을 써야 할 때

  • 도메인 중심 설계를 하고 싶을 때
  • CRUD가 많고, SQL 작성이 반복될 때
  • 스프링 부트와 함께 간단한 프로젝트를 빠르게 만들 때
  • DB에 종속되지 않고 유지보수성을 높이고 싶을 때

6️⃣ ORM을 지양하거나 보완적으로 써야 할 때

  • 고성능 대용량 쿼리가 필요한 서비스
  • 복잡한 조인, 서브쿼리, 동적 쿼리 중심의 앱
  • 이럴 땐 JPA + QueryDSL or JPA + MyBatis 혼용이 좋습니다.