Topic (오늘의 주제)
ORM (Object-Relational Mapping)의 개념과 한계(Trade-off)
Why (왜 사용하는가? 왜 중요한가?)
- 실무: 반복적인 SQL(CRUD) 작성 노동을 줄여 생산성을 비약적으로 높이고, 스키마 변경 시 코드 수정 범위를 줄여줍니다.
- 구조적 의미: **객체지향(Java)**과 관계형 데이터베이스(RDB) 사이의 **패러다임 불일치(Impedance Mismatch)**를 해결해주는 가교 역할을 합니다.
- 면접 의도: ORM의 장점만 아는 것이 아니라, **성능 이슈(N+1)**나 복잡한 쿼리 처리의 어려움 같은 단점을 명확히 인지하고 적재적소에 기술을 선택할 수 있는지 확인합니다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | ORM: 객체(Object)와 관계형 데이터베이스의 테이블(Relation)을 자동으로 연결(Mapping)해주는 기술. 객체를 통해 간접적으로 DB 데이터를 다루게 함. |
| 동작 방식 | 1. 객체 메서드 호출 (user.save()) 2. ORM 프레임워크가 적절한 SQL 생성 (INSERT INTO...) 3. JDBC를 통해 DB에 전달 및 실행 4. 결과를 객체로 반환. |
| 패러다임 불일치 해결 | RDB에는 없는 상속, 다형성, 참조(그래프 탐색) 같은 객체지향의 특성을 DB 구조에 맞춰 변환해줌. |
| 장점 | 생산성 증대, 비즈니스 로직 집중, DBMS 종속성 하락(DB 바꿔도 코드 수정 적음). |
| 단점 (무조건 좋지 않은 이유) | 1. SQL보다 느릴 수 있음: 자동 생성 쿼리가 비효율적일 때가 있음. 2. 복잡한 쿼리 작성의 한계: 통계, 집계 등 복잡한 쿼리는 SQL보다 작성이 어려움. 3. N+1 문제: 의도치 않게 수많은 쿼리가 발생해 성능 저하 유발. |
| 대표 기술 | Java: JPA(Hibernate), Node.js: Sequelize, TypeORM, Python: Django ORM, SQLAlchemy |
Interview Answer Version (면접 답변식 요약)
"ORM은 객체와 관계형 데이터베이스 간의 데이터를 자동으로 매핑해주는 기술입니다.
반복적인 SQL 작성 없이 객체지향적으로 코드를 작성할 수 있어 개발 생산성과 유지보수성이 크게 향상됩니다.
하지만, 무조건적으로 좋은 것은 아닙니다. 복잡한 통계성 쿼리나 조인이 많은 경우 직접 SQL을 짜는 것보다 성능 튜닝이 어렵고, N+1 문제 같은 성능 이슈가 발생할 수 있어 QueryDSL이나 MyBatis 같은 기술과 혼용해서 사용하는 것이 일반적입니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. ORM이 만능이 아님을 인지 (MyBatis/JdbcTemplate 혼용)
- 실무에서는 80%의 단순 CRUD는 **JPA(ORM)**로 처리하고, 나머지 20%의 복잡한 통계/대량 데이터 처리는 QueryDSL이나 **Native SQL(MyBatis)**을 사용합니다.
- "ORM만 써야 해!"라는 강박을 버리는 것이 중요합니다.
2. N+1 문제 주의
- ORM 사용 시 가장 흔한 성능 장애입니다.
- 상황: User 목록 10명을 가져왔는데(SELECT * FROM User), 각 유저의 Team 정보를 알기 위해 추가로 10번의 쿼리가 더 나가는 현상. (1 + 10 = 11번 실행)
- 해결: 미리 데이터를 다 가져오는 Fetch Join 방식을 사용해야 합니다.
3. 영속성 컨텍스트 이해 없이 쓰지 말 것
- 단순히 "DB 저장 도구"로만 생각하면 안 됩니다. 객체의 동일성 보장, 1차 캐시, 쓰기 지연 등 내부 메커니즘을 모르면 데이터가 왜 업데이트 안 되는지, 혹은 왜 롤백이 안 되는지 디버깅할 수 없습니다.
예상 꼬리질문 정리
- Q: ORM과 SQL Mapper(MyBatis)의 차이점은 무엇인가요?
- 핵심 키워드: ORM은 SQL을 '자동 생성'해주고 객체 중심(JPA), Mapper는 SQL을 '직접 작성'하고 결과만 매핑(MyBatis).
- Q: 패러다임 불일치(Impedance Mismatch)가 구체적으로 뭔가요?
- 핵심 키워드: 객체는 상속, 참조, 다형성이 있지만 RDB는 테이블, 외래키만 존재하여 구조가 다른 문제.
- Q: 복잡한 쿼리를 JPA로 처리하기 힘들 때 어떻게 해결하나요?
- 핵심 키워드: QueryDSL을 사용하여 타입 세이프하게 동적 쿼리를 짜거나, @Query로 Native SQL을 사용합니다.
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: JPA vs MyBatis (0) | 2026.01.09 |
|---|---|
| Daily Dev Q&A: 영속성 컨텍스트 (0) | 2026.01.09 |
| Daily Dev Q&A: Web Server vs WAS (Web Application Server) (1) | 2026.01.06 |
| Daily Dev Q&A: JPA (0) | 2026.01.05 |
| Daily Dev Q&A: RESTful API 설계 원칙과 애매한 상황(Edge Case)의 현실적 해결 전략 (0) | 2025.12.31 |