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 혼용이 좋습니다.
'TIL' 카테고리의 다른 글
| [250408 TIL] 뉴스피드 좋아요 리팩토링 및 검색기능 추가 (3) | 2025.04.08 |
|---|---|
| [250407 TIL] 뉴스피드 팀프로잭트 (3) | 2025.04.07 |
| [250403 TIL ] JPA, Lombok, Hibernate 심화 어노테이션 (3) | 2025.04.03 |
| [250402 TIL] JWT 인증 로그아웃 구현(Redis 활용) (1) | 2025.04.02 |
| [250401 TIL] Spring Security + JWT 예외 처리 정리 (2) | 2025.04.01 |