Daily Dev Q&A: JPA vs MyBatis

2026. 1. 9. 17:29·Archive/Daily Dev Q&A

Topic (오늘의 주제)

JPA (ORM) vs MyBatis (SQL Mapper)

Why (왜 사용하는가? 왜 중요한가?)

  • 실무: 프로젝트의 성격(SI vs 자체 서비스), 팀의 스킬셋, 데이터의 복잡도에 따라 적절한 기술을 선택해야 개발 생산성과 유지보수 효율을 확보할 수 있습니다.
  • 구조적 의미: 데이터를 다루는 패러다임의 차이입니다. 객체지향적으로 데이터를 다룰 것인가(JPA), 철저히 쿼리 중심으로 데이터를 다룰 것인가(MyBatis)의 차이입니다.
  • 면접 의도: 두 기술의 **장단점(Trade-off)**을 명확히 알고 있는지, 상황에 따라 "왜 이 기술을 선택했는지" 논리적으로 설명할 수 있는지 확인합니다.

Core Concept (핵심 개념 정리)

두 기술은 DB에 접근한다는 목적은 같지만, 접근 방식과 철학이 완전히 다릅니다.

비교 항목 JPA (Java Persistence API) MyBatis
기술 분류 ORM (Object-Relational Mapping) SQL Mapper
핵심 철학 "SQL은 내가 짤게, 넌 객체에 집중해."

객체와 DB 테이블을 자동으로 매핑.
"SQL은 네가 직접 짜, 난 실행만 도와줄게."

자바 코드와 SQL 문을 매핑.
SQL 작성 개발자가 작성 X (프레임워크가 자동 생성). 개발자가 작성 O (XML이나 어노테이션에 직접 기술).
장점 1. 생산성: CRUD 쿼리 작성 시간 단축.

2. 유지보수: 필드 변경 시 객체만 수정하면 됨.

3. 표준: 특정 DB에 종속되지 않음.
1. 제어권: 복잡한 쿼리나 최적화된 SQL 작성 용이.

2. 직관성: SQL을 직접 보므로 튜닝이 쉬움.

3. 학습곡선: SQL만 알면 금방 배움.
단점 1. 학습곡선: 매핑 설정, 영속성 컨텍스트 등 어렵다.

2. 복잡성: 복잡한 통계 쿼리는 처리가 까다로움.
1. 반복 노동: 단순 CRUD도 일일이 SQL을 짜야 함.

2. 종속성: DB가 바뀌면 쿼리를 다 수정해야 함.
주 사용처 스타트업, 자체 서비스 기업, 해외 (표준) 국내 SI(공공기관, 금융권), 레거시 시스템

Interview Answer Version (면접 답변식 요약)

"JPA는 ORM 기술로 개발자가 객체지향적으로 코드를 작성하면 프레임워크가 SQL을 대신 생성해주는 방식입니다. 생산성과 유지보수성이 좋아 최근 서비스 기업에서 표준으로 사용합니다.

반면 MyBatis는 SQL Mapper로, 개발자가 직접 SQL을 작성하여 쿼리와 결과 객체를 매핑하는 방식입니다. 복잡한 통계 쿼리나 세밀한 쿼리 튜닝이 필요한 경우, 혹은 기존 SI 환경에서 여전히 강점을 가집니다.

최근에는 기본적으로 JPA를 사용하되, 복잡한 쿼리는 QueryDSL을 함께 사용하여 두 기술의 장점을 모두 취하는 추세입니다."

Practical Tip (사용시 주의할 점 or 활용 예)

1. 대한민국 개발 생태계의 특수성

  • SI / 금융권 / 공공기관: 여전히 MyBatis 점유율이 압도적입니다. 복잡한 프로시저 호출이나 수천 줄짜리 통계 쿼리를 최적화해야 하기 때문입니다.
  • 네카라쿠배 / 스타트업: JPA(Spring Data JPA) + QueryDSL 조합이 표준입니다. 빠른 기능 개발과 변경에 유연하게 대처하기 위함입니다.

2. QueryDSL의 등장 (JPA의 구원 투수)

  • JPA만으로는 복잡한 검색 조건(동적 쿼리)이나 조인을 처리하기 어렵고, MyBatis는 문자열로 쿼리를 짜다 보니 오타(Runtime Error)가 잦습니다.
  • QueryDSL은 자바 코드로 쿼리를 짜므로 컴파일 시점에 문법 오류를 잡을 수 있고, 동적 쿼리 작성이 매우 쉽습니다. JPA를 쓴다면 선택이 아닌 필수입니다.

3. 하이브리드 전략

  • 꼭 하나만 써야 하는 것은 아닙니다.
  • 하나의 프로젝트에서 기본 로직은 JPA로 처리하고, 성능이 중요한 배치(Batch) 작업이나 복잡한 대시보드 쿼리는 MyBatis나 JdbcTemplate을 혼용해서 설정할 수도 있습니다.

예상 꼬리질문 정리

  1. Q: JPA를 쓰다가 복잡한 쿼리 문제에 부딪히면 어떻게 해결하실 건가요?
    • 핵심 키워드: 1차적으로 QueryDSL을 도입해 해결하고, 그래도 성능이 안 나오거나 너무 복잡하면 Native SQL(@Query)이나 MyBatis/JdbcTemplate을 부분적으로 사용하겠습니다.
  2. Q: MyBatis에서 동적 쿼리(Dynamic Query)는 어떻게 처리하나요?
    • 핵심 키워드: XML 파일 내에서 <if>, <choose>, <foreach> 등의 태그를 사용하여 조건에 따라 SQL이 바뀌도록 작성합니다.
  3. Q: JPA의 N+1 문제는 MyBatis에서는 발생하지 않나요?
    • 핵심 키워드: MyBatis도 연관된 데이터를 가져올 때 반복적으로 조회 쿼리를 날리도록 짰다면 발생합니다. 다만, MyBatis는 애초에 조인 쿼리(Join Query)를 직접 짜는 경우가 많아 N+1을 개발자가 의도적으로 피하기 쉬운 구조일 뿐입니다.

'Archive > Daily Dev Q&A' 카테고리의 다른 글

Daily Dev Q&A: N+1 문제 & 해결책  (0) 2026.01.13
Daily Dev Q&A: Spring MVC  (0) 2026.01.13
Daily Dev Q&A: 영속성 컨텍스트  (0) 2026.01.09
Daily Dev Q&A: ORM (Object-Relational Mapping)의 개념과 한계(Trade-off)  (0) 2026.01.07
Daily Dev Q&A: Web Server vs WAS (Web Application Server)  (1) 2026.01.06
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: N+1 문제 & 해결책
  • Daily Dev Q&A: Spring MVC
  • Daily Dev Q&A: 영속성 컨텍스트
  • Daily Dev Q&A: ORM (Object-Relational Mapping)의 개념과 한계(Trade-off)
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
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: JPA vs MyBatis
상단으로

티스토리툴바