728x90

* 주로 전자정부 표준 프레임워크를 사용하는 입장에서 비교 대상은 전자정부 표준 내를 기준으로 한다.

 

전자정부 표준 프레임워크(eGovFrame) 환경에서 Spring Data JPA(JpaRepository)와 MyBatis를 비교할 때, 가장 중요한 관점은 "공공사업(SI)의 특성"과 "프레임워크 버전(3.x vs 4.x/5.0)"입니다.

전자정부 프레임워크 4.x 버전부터 Spring Boot가 본격적으로 도입되면서 JPA 사용률이 늘고 있지만, 여전히 공공사업에서는 MyBatis가 주류를 이룹니다. 이 두 기술의 장단점을 전자정부 표준 프레임워크 관점에서 명확하게 비교해 드리겠습니다.

1. 한눈에 보는 요약 비교

비교 항목 Spring Data JPA (JpaRepository) MyBatis
패러다임 ORM (객체와 DB 테이블 매핑) SQL Mapper (자바 코드와 SQL 매핑)
전자정부 표준 적합성 4.x(Spring Boot 기반) 이상에서 강력 추천 iBatis 시절부터 이어져 온 공공 표준 (가장 친숙함)
생산성 매우 높음 (간단한 CRUD는 SQL 작성 없음) 보통 (CRUD도 XML에 일일이 쿼리 작성 필요)
통계 및 복잡한 쿼리 Querydsl 등 추가 설정 필요 (학습 곡선 높음) 매우 유리 (XML 안에서 Dynamic SQL 완벽 제어)
인력 수급 (SI 관점) 상대적으로 어려움 (고급 인력 필요) 매우 쉬움 (대부분의 프리랜서/초급 개발자 가능)

 

2. Spring Data JPA (JpaRepository)

장점 (Pros)

  • 압도적인 CRUD 생산성 및 유지보수성 공공 데이터의 단순 테이블 관리, 마스터 성격의 데이터 등록/수정/삭제 시 save(), findById() 만으로 해결됩니다. 전자정부 공통 컴포넌트나 단순 가공 기능 개발 시 속도가 배로 빨라집니다.
  • DBMS 종속성 탈피 공공 사업 특성상 오라클(Oracle), 티베로(Tibero), 큐브리드(Cubrid), 포스트그레SQL(PostgreSQL) 등 다양한 DBMS가 제안서에 따라 바뀝니다. JPA는 방언(Dialect) 설정만 바꾸면 쿼리를 자동 수정해주므로 DBMS 마이그레이션이 매우 매끄럽습니다.
  • 전자정부 4.x / 5.0 아키텍처와의 궁합 최신 전자정부 프레임워크는 Spring Boot를 기본 실행환경으로 채택하고 있습니다. Boot 환경에서 JpaRepository는 설정이 극도로 단순하며 표준 아키텍처에 잘 맞물립니다.

단점 (Cons)

  • SI 시장의 인력 수급 문제 (가장 큰 걸림돌) 공공 사업은 단기간에 많은 개발자를 투입해야 하는 경우가 많습니다. JPA의 영속성 컨텍스트, 지연 로딩(Lazy Loading) 개념을 정확히 모르고 쓰면 성능 장애(N+1 문제)나 데이터 미반영 오류가 발생하기 쉬워 인력 관리가 어렵습니다.
  • 공공 표준 대용량 통계/배치 쿼리의 한계 공공 시스템 특성상 수십 개의 테이블을 조인하거나 화면 하나에 수백 줄짜리 복잡한 통계 쿼리가 들어가는 경우가 많습니다. JpaRepository만으로는 이를 표현하기 어렵고, 결국 Querydsl 같은 추가 라이브러리를 도입하거나 Native Query를 써야 해서 빛이 바랩니다.

3. MyBatis

장점 (Pros)

  • 공공 SI 시장에서의 "압도적인 익숙함" 과거 iBatis 시절부터 전자정부 표준 프레임워크의 기본 데이터 접근 기술이었습니다. 웬만한 공공 SI 개발자(초급~고급, 프리랜서 포함) 중 MyBatis를 다루지 못하는 사람은 없으므로 인력 수급과 리스크 관리에 절대적으로 유리합니다.
  • 복잡한 SQL 및 튜닝의 용이성 정부 기관의 데이터 모델은 복잡하게 얽혀있는 경우가 많습니다. SQL을 직접 XML에 작성하기 때문에, DBA가 준 튜닝된 쿼리나 힌트(Hint)절을 그대로 복사·붙여넣기 하여 적용하기 매우 좋습니다.
  • 동적 쿼리(Dynamic SQL)의 직관성 <if>, <choose>, <foreach> 등 XML 태그를 이용해 검색 조건에 따라 동적으로 변하는 쿼리를 작성하는 것이 매우 직관적이고 강력합니다.

단점 (Cons)

  • 반복적인 단순 작업 (Boilerplate Code) 테이블 하나를 새로 만들 때마다 VO(DTO), Mapper 인터페이스, Mapper XML을 만들고 Insert, Update, Delete, Select 쿼리를 일일이 다 짜야 합니다. 단순 CRUD가 수백 개 레이어로 존재하는 대형 시스템에서는 이 작업 자체가 큰 낭비가 됩니다.
  • DBMS 변경 시 수정 지옥 만약 국산 DBMS(예: Tibero)나 오픈소스(예: PostgreSQL)로 전환하게 될 경우, 오라클 전용 함수(NVL, DECODE, SYSDATE 등)나 페이징 처리 쿼리를 XML 파일마다 찾아다니며 직접 사람이 수정해야 합니다.

4. 최종 결론 및 추천 (전자정부 프레임워크 기준)

공공 사업의 예산, 기간, 투입 인력의 수준을 고려하여 선택해야 합니다.

  • MyBatis를 선택해야 하는 경우:
    • 투입되는 개발자 층이 다양하고 단기 프리랜서 비중이 높은 경우
    • 통계, 정산, 대용량 일괄 배치(Batch) 등 복잡한 SQL 중심의 시스템인 경우
    • 기존에 구축된 전자정부 3.x 버전 기반의 시스템을 고도화/유지보수 하는 경우
  • Spring Data JPA를 선택해야 하는 경우:
    • 최신 전자정부 4.x 이상 + Spring Boot 환경에서 신규 구축(MSA 등)하는 경우
    • 비즈니스 로직이 복잡하고, 단순 CRUD 및 데이터 검증(Validation)이 많은 대내 시스템인 경우
    • 추후 DBMS가 변경될 가능성이 제안서에 명시되어 있는 경우

💡 현업의 절충안 (하이브리드) 요즘 고도화되는 공공 프로젝트에서는 **기본적인 단건 조회 및 C·U·D 처리는 Spring Data JPA**로 묶어 생산성을 높이고, **복잡한 통계 화면이나 조인이 많이 걸리는 대용량 조회는 MyBatis**나 Querydsl로 이원화하여 개발하는 아키텍처를 많이 채택합니다.

 

 

728x90

'Spring boot' 카테고리의 다른 글

JpaRepository  (0) 2026.06.24
728x90

JpaRepository는 Spring Data JPA에서 제공하는 핵심 인터페이스로, Java 객체(Entity)를 데이터베이스에 쉽게 저장, 수정, 삭제, 조회(CRUD)할 수 있도록 도와주는 마법 같은 도구입니다.

 

과거에는 데이터베이스에 접근하려면 복잡한 SQL문을 매번 작성하거나, JPA의 EntityManager를 직접 다루며 지루한 반복 코드를 짜야 했습니다. JpaRepository는 인터페이스를 선언하는 것만으로 이 모든 반복 작업을 프레임워크가 대신 처리해 줍니다.

 

1. 기본 개념과 구조

JpaRepository는 Spring Data JPA의 상위 인터페이스들을 상속받아, 단순 CRUD뿐만 아니라 페이징(Paging)정렬(Sorting) 기능까지 기본으로 포함하고 있습니다.

인터페이스 상속 구조

  • Repository (마커 인터페이스)
    • CrudRepository (기본적인 CRUD 기능 제공)
      • PagingAndSortingRepository (페이징 및 정렬 기능 추가)
        • JpaRepository (JPA 전용 기능, 배치 삭제, 영속성 컨텍스트 플러시 등의 기능 추가)

2. 어떻게 사용하나요?

사용법은 정말 간단합니다. 내가 만든 Entity 클래스와 해당 Entity의 PK(Primary Key) 타입을 지정하여 인터페이스를 상속받기만 하면 됩니다.

 

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // 아무런 코드를 작성하지 않아도 기본적인 CRUD 메서드를 바로 사용할 수 있습니다!
}

 

 

  • User: 대상이 되는 엔티티 클래스
  • Long: User 엔티티의 @Id (기본키) 타입

3. 주요 제공 메서드

JpaRepository를 상속받으면 아래와 같은 메서드들을 별도의 구현 없이 즉시 호출할 수 있습니다.

메서드 역할 비고
save(S entity) 새로운 엔티티는 저장(Insert), 기존 엔티티는 수정(Update) 내부적으로 persist 또는 merge 수행
findById(ID id) ID(PK) 값으로 특정 엔티티 하나를 조회 Optional<T> 반환
findAll() 테이블의 모든 데이터 조회 List<T> 반환
deleteById(ID id) ID(PK) 값으로 데이터 삭제  
delete(T entity) 특정 엔티티 객체를 넘겨 데이터 삭제  
count() 전체 데이터 개수 반환 long 반환

 

4. JpaRepository의 강력한 무기: 쿼리 메소드 (Query Methods)

기본 제공 메서드 외에 특정 조건으로 조회를 하고 싶다면, 메서드 이름만 규칙에 맞게 잘 지어주면 Spring이 자동으로 SQL(JPQL)을 생성해 줍니다. 이를 '쿼리 메소드'라고 합니다.

Java
 
public interface UserRepository extends JpaRepository<User, Long> {
    
    // 1. 이메일로 유저 찾기 (WHERE email = ?)
    Optional<User> findByEmail(String email);
    
    // 2. 이름과 가입일로 유저 찾기 (WHERE name = ? AND created_at > ?)
    List<User> findByNameAndCreatedAtAfter(String name, LocalDateTime date);
    
    // 3. 특정 단어가 포함된 이름 찾기 (WHERE name LIKE '%...%')
    List<User> findByNameContaining(String keyword);
}

만약 조건이 너무 복잡해서 메서드 이름이 길어진다면, @Query 어노테이션을 사용해 직접 JPQL이나 Native SQL을 작성할 수도 있습니다.

 

@Query("SELECT u FROM User u WHERE u.status = 'ACTIVE' AND u.email LIKE %:email%")
List<User> findActiveUsersByEmail(@Param("email") String email);

 

요약

  • JpaRepository는 Spring Data JPA가 제공하는 데이터 접근용 인터페이스입니다.
  • 개발자가 SQL을 직접 짜지 않아도 기본적인 CRUD, 페이징, 정렬 기능을 자동으로 제공합니다.
  • 인터페이스에 규칙에 맞는 메서드 이름만 적어주면 알아서 쿼리를 만들어 날려주는 아주 편리한 친구입니다.

 

 

전자정부 사용 예시.

private final EgovLoginPolicyRepository loginPolicyRepository; // 로그인정책관리

LoginPolicy loginPolicy = loginPolicyRepository.findById(loginPolicyVO.getEmployerId()).orElse(null);

 

 

@Repository("uiaEgovLoginPolicyRepository")
public interface EgovLoginPolicyRepository extends JpaRepository<LoginPolicy, String> {
}

 

package egovframework.com.uat.uia.entity;

import lombok.Getter;
import lombok.Setter;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.LocalDateTime;

@Entity(name="uiaLoginPolicy")
@Getter
@Setter
@Table(name="COMTNLOGINPOLICY")
public class LoginPolicy {

    @Id
    @Column(name="EMPLYR_ID")
    private String employerId;

    @Column(name="IP_INFO")
    private String ipInfo;

    @Column(name="DPLCT_PERM_AT")
    private String dplctPermAt;

    @Column(name="LMTT_AT")
    private String lmttAt;

    @Column(name="FRST_REGISTER_ID")
    private String frstRegisterId;

    @Column(name="FRST_REGIST_PNTTM")
    private LocalDateTime frstRegisterPnttm;

    @Column(name="LAST_UPDUSR_ID")
    private String lastUpdusrId;

    @Column(name="LAST_UPDT_PNTTM")
    private LocalDateTime lastUpdtPnttm;

}
728x90

'Spring boot' 카테고리의 다른 글

Spring Data JPA VS MyBatis 장단점  (0) 2026.06.27

+ Recent posts