Daily Dev Q&A: ORM (Object-Relational Mapping)의 개념과 한계(Trade-off)

2026. 1. 7. 18:32·Archive/Daily Dev Q&A

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차 캐시, 쓰기 지연 등 내부 메커니즘을 모르면 데이터가 왜 업데이트 안 되는지, 혹은 왜 롤백이 안 되는지 디버깅할 수 없습니다.

예상 꼬리질문 정리

  1. Q: ORM과 SQL Mapper(MyBatis)의 차이점은 무엇인가요?
    • 핵심 키워드: ORM은 SQL을 '자동 생성'해주고 객체 중심(JPA), Mapper는 SQL을 '직접 작성'하고 결과만 매핑(MyBatis).
  2. Q: 패러다임 불일치(Impedance Mismatch)가 구체적으로 뭔가요?
    • 핵심 키워드: 객체는 상속, 참조, 다형성이 있지만 RDB는 테이블, 외래키만 존재하여 구조가 다른 문제.
  3. 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
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: JPA vs MyBatis
  • Daily Dev Q&A: 영속성 컨텍스트
  • Daily Dev Q&A: Web Server vs WAS (Web Application Server)
  • Daily Dev Q&A: JPA
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    경기기후바이브코딩
    DevFestIncheon2025
    OrphanRemova
    network
    aws_s3
    SpringBoot
    클로드코드
    til
    spring
    Spring비교
    커리어리셋
    devlog
    jpa
    Project_Review
    REACT
    backend
    java
    프로덕트개발자
    데브페스트
    프로젝트회고
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: ORM (Object-Relational Mapping)의 개념과 한계(Trade-off)
상단으로

티스토리툴바