728x90
Java 기반 백엔드 개발에서 데이터베이스 연동은 필수적입니다. 이때 주로 사용되는 기술이 JPA (Java Persistence API)와 MyBatis입니다. 이 두 기술은 모두 데이터 영속성(Persistence)을 처리하지만, 접근 방식과 철학에서 큰 차이를 보입니다.
1. 개념 및 구조적 차이 : ORM vs SQL Mapper
| 핵심 역할 | ORM (Object-Relational Mapping) 기술의 자바 표준 명세 | SQL Mapper 프레임워크 |
| 구조적 접근 | 객체 중심 개발. 자바 객체와 데이터베이스 테이블을 자동으로 매핑 | SQL 중심 개발. 개발자가 작성한 SQL과 자바 객체(DTO/VO)를 매핑 |
| SQL 작성 | 직접 작성할 필요가 적음. 엔티티 매핑과 메소드 이름/JPQL을 통해 자동 생성/실행 | SQL을 직접 작성하고 XML 파일 또는 애노테이션으로 관리 |
| 핵심 구현체 | Hibernate, EclipseLink 등 (JPA는 명세, 구현체가 실제 기능 제공) | MyBatis 프레임워크 자체 |
| 데이터 독립성 | 높음. DB가 변경되어도 객체 모델만 유지되면 코드 수정이 적음 (방언(Dialect) 지원) | 낮음. 특정 DB에 최적화된 SQL을 사용하면 DB 변경 시 SQL 전체를 수정해야 함 |
JPA (ORM)
JPA는 객체 지향 프로그래밍의 패러다임을 관계형 데이터베이스로 확장하는 것을 목표로 합니다.
- 객체 중심 : 개발자는 테이블이 아닌 엔티티(Entity) 객체를 다루며, 데이터베이스와의 상호작용은 JPA가 대신 처리합니다.
- 생산성 : 기본적인 CRUD(Create, Read, Update, Delete) 작업은 메소드 호출만으로 자동 처리되어 반복적인 SQL 작성 부담이 크게 줄어듭니다.
- 영속성 컨텍스트 : 데이터를 캐싱(1차 캐시), 변경 감지(Dirty Checking), 지연 로딩(Lazy Loading) 등 고급 기능을 제공하여 성능 최적화와 트랜잭션 관리를 돕습니다.
MyBatis (SQL Mapper)
MyBatis는 개발자가 작성한 SQL과 자바 객체 간의 매핑을 단순화해주는 프레임워크입니다.
- SQL 중심 : SQL을 직접 작성하고, 그 결과를 DTO(Data Transfer Object)나 VO(Value Object)에 매핑합니다.
- 세밀한 제어 : 복잡하고 특수한 SQL 튜닝 및 최적화가 필수적인 경우에 개발자가 직접 SQL의 모든 것을 제어할 수 있어 유리합니다.
- 명확한 분리 : SQL 코드를 XML 파일 등에 명확하게 분리하여 관리하므로, SQL 전문가와의 협업이 용이합니다.
2. 사용 방식 및 코드 예시
JPA 사용 방식
SQL 없이 객체 메소드 호출로 데이터 작업을 수행합니다.
- 엔티티(Entity) 정의 : @Entity, @Id 등의 어노테이션으로 클래스와 필드를 테이블 및 컬럼에 매핑합니다.
- Repository 인터페이스 : Spring Data JPA에서는 JpaRepository를 상속받는 인터페이스를 정의합니다.
- 쿼리 : 간단한 조회는 메소드 이름을 규칙에 맞게 정의하고(예: findByUserIdAndName(...)), 복잡한 쿼리는 JPQL (Java Persistence Query Language)이나 QueryDSL을 사용합니다.
// Spring Data JPA Repository 예시
public interface UserRepository extends JpaRepository<User, Long> {
// 메소드 이름으로 쿼리 자동 생성
List<User> findByEmail(String email);
// JPQL을 사용한 쿼리
@Query("SELECT u FROM User u WHERE u.age > :minAge")
List<User> findUsersOlderThan(@Param("minAge") int minAge);
}
MyBatis 사용 방식
SQL을 직접 작성하고 이를 자바 메소드와 연결하여 사용합니다.
- Mapper 인터페이스 : SQL을 실행할 메소드를 정의합니다.
- XML Mapper 파일 : <select>, <insert>, <update>, <delete> 태그를 사용하여 SQL 쿼리를 직접 작성하고, 동적 쿼리는 <if>, <choose>, <foreach> 등의 태그로 처리합니다.
- 매핑 : XML 내에서 쿼리 결과를 DTO/VO에 매핑합니다.
<!-- MyBatis XML Mapper 예시 -->
<mapper namespace="com.example.UserMapper">
<select id="selectUsersByEmail" resultType="com.example.UserDTO">
SELECT user_id, name, email
FROM users
WHERE email = #{email}
</select>
<select id="selectUsersOlderThan" resultType="com.example.UserDTO">
SELECT *
FROM users
WHERE age > #{minAge}
</select>
</mapper>
3. 프로젝트 용도에 따른 선택
| JPA (ORM) | 객체 지향 설계 및 생산성 최우선 - 복잡한 도메인 모델: 상속, 연관관계 등 객체 관계가 복잡하여 객체지향적인 접근이 필요한 경우 - 유지보수 용이성: DB 스키마 변경이 잦거나, DB 독립성이 중요할 때 - 개발 초기 속도: 기본적인 CRUD가 많아 빠른 개발이 필요할 때 - 적합 프로젝트: 신규 프로젝트, 엔터프라이즈 애플리케이션, 비즈니스 로직이 복잡한 서비스 |
| MyBatis (SQL Mapper) | SQL 제어 및 성능 최적화 최우선 - 레거시/대규모 서비스: 기존 SQL 인프라를 활용하거나, 복잡하고 최적화된 SQL을 반드시 사용해야 하는 경우 - 동적 쿼리: 조건에 따라 SQL 구조가 크게 변하는 동적 쿼리가 많은 경우 (XML로 제어 용이) - DB 함수/프로시저: 특정 DB의 고급 기능(함수, 저장 프로시저)을 적극적으로 활용할 때 - 적합 프로젝트: 성능 튜닝이 매우 중요한 서비스, 기존 DB 구조에 맞춰야 하는 레거시 통합 프로젝트 |
최신 트렌드 : 많은 기업에서는 기본적인 CRUD는 JPA로 처리하고, JPA로 해결이 어렵거나 성능 최적화가 필요한 복잡한 조회 쿼리에 한해서만 MyBatis 또는 Native Query를 혼용하는 전략을 사용하고 있습니다.
반응형
'프로그래밍 언어 > JAVA(JSP, Spring)' 카테고리의 다른 글
| [JSP] MYSQL 연동 (0) | 2023.08.12 |
|---|---|
| [Error/JAVA] Eclipse와 Github 연동 시, 연속 로그인 나올 때 (0) | 2023.03.08 |
| [ALL] Eclipse와 Github 연동하기 (0) | 2023.03.08 |
| [ALL] Git Downloads (0) | 2022.11.04 |
| [JSP] Microsoft Visual Studio Code Insider Download (0) | 2022.11.03 |