0. JPA, MyBatis 등장 배경
기존에 JDBC를 사용헀을 때는 sql문이 코드에 섞여 있었고 만들어 요청하는 과정에서 sql문 생성시 String을 붙이고 자르는 등의 작업이 필요해서 sql문이 조금만 길어져도 번거롭고 관리도 힘들었다. 따라서 코드와 sql문을 분리해서 관리하기 위해서 JPA, MyBatis 등을 사용한다.
1. MyBatis란 ?
1. SQL 실행 결과를 자바 빈즈 또는 Map 객체에 매핑해주는 Persistence 솔루션으로 관리한다. SQL을 소스 코드가 아닌 XML로 분리한다.
2. SQL문과 프로그래밍 코드를 분리해서 구현한다.
3. 데이터소스 기능과 트랜잭션 처리 기능을 제공한다.
2. MyBatis의 장점, 단점
장점:
1. 접근이 쉽고 코드가 간결하다. (배우기가 쉽다.)
2. SQL문과 프로그래밍 코드가 분리되어 있어서 SQL문에 변경이 있을 때마다 자바 코드를 수정하거나 컴파일 하지 않아도 된다.
3. 다양한 프로그래밍 언어로 구현이 가능하다. (이식성이 뛰어나다)
단점:
1. 스키마 변경시 SQL 쿼리를 직접 수정해주어야 한다.
2. 반복된 쿼리가 발생하여 반복 작업이 있다.
3. 쿼리를 직접 작성하기 때문에 데이터베이스에 종속된 쿼리문이 발생할 수 있다.
4. 데이터베이스 변경시 로직도 함께 수정해주어야 한다.
3. JPA란 ? (Java Presistence API)
1. Java ORM 기술에 대한 API 표준 명세이다. 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.
- ORM (Object-Relational Mapping)
Class와 RDB(Relational DataBase)의 테이블을 매핑한다는 뜻,
객체를 RDB 테이블에 자동으로 영속화 해주는 것
2. 구현체로는 Hibernate, EclipseLink, Data Nucleus가 있으며 Hibernate가 가장 대중적이다.
4. JPA의 장점, 단점
장점:
1. 쿼리를 하나하나 작성할 필요가 없어 코드량이 줄어든다.
2. 가독성이 좋다.
3. 간편하게 수정이 가능하다. (유지보수, 리팩토링 용이)
4. 동일한 쿼리에 대한 캐시 기능을 사용하기 때문에 더욱 높은 성능을 낼 수 있다.
단점:
1. 매핑 설계를 잘못했을 때 성능 저하가 발생할 수 있다.
2. JPA를 제대로 사용하려면 알아야할 것이 많아서 학습하는데 시간이 오래 걸린다.
3. 다수의 테이블 조인시 신경써야 할게 많다.
5. 설정의 복잡성
MyBatis:
SQL 매핑과 설정이 비교적 수동적이고 상세하다. 이것은 개발자가 SQL을 완전히 제어할 수 있게 하지만, 동시에 설정과 SQL 매핑을 위한 상당한 시간 투자를 요구한다.
JPA:
매핑 작업을 위한 어노테이션과 ORM(Object-Relational Mapping)을 통해 더 높은 수준의 추상화를 제공한다. 이로 인해 초기 설정이 더 복잡해 보일 수 있지만, 일단 설정되고 나면 반복적인 CRUD 작업을 자동화할 수 있다.
6. 개발 생산성
MyBatis:
개발자가 SQL을 직접 작성해야 하므로, 복잡한 쿼리를 자유롭게 다루고자 할 때 유용하다. 그러나 이것은 또한 개발자가 모든 SQL을 직접 관리해야 한다는 것을 의미한다.
JPA:
CRUD 작업을 위한 표준화된 API를 제공하며, 복잡한 쿼리를 위해 JPQL(Java Persistence Query Language) 또는 Criteria API를 사용한다. 이는 개발자가 보일러플레이트 코드 작성에 덜 시간을 할애하게 함으로써 개발 생산성을 향상시킨다.
7. 데이터베이스 추상화 수준
MyBatis:
데이터베이스 작업에 대한 세밀한 제어를 가능하게 하지만, 그만큼 데이터베이스의 구조에 밀접하게 의존한다.
JPA:
데이터베이스와의 상호작용을 위해 더 높은 수준의 추상화를 제공하며, 이는 데이터베이스 간의 이식성을 높여준다. 개발자는 데이터베이스의 구체적인 세부사항보다는 객체 모델에 더 집중할 수 있다.
8. 성능 측면
MyBatis:
직접 작성한 SQL에 의존하기 때문에, 성능 최적화가 상대적으로 쉽다.
JPA:
동적인 쿼리 생성과 ORM의 복잡성으로 인해 성능 이슈가 발생할 수 있으나, 캐싱과 같은 JPA의 고급 기능을 통해 이를 보완할 수 있다.
9. 유지보수와 확장성
MyBatis:
SQL이 분산되어 있기 때문에 변경 사항이 발생할 경우 관련된 모든 SQL을 찾아 수정해야 한다. 이는 유지보수를 어렵게 만들 수 있다.
JPA:
ORM을 통해 객체 중심으로 데이터베이스를 관리하기 때문에 유지보수와 확장성이 좋다. 객체 모델의 변경이 데이터베이스에 자동으로 반영되기 때문에 코드의 일관성을 유지하기 쉽다.
10. JPA vs MyBatis
결론적으로, JPA는 객체 중심의 개발 방식을 지원하며, 개발자가 직업 SQL을 작성하지 않고도 객체를 관리할 수 있다는 장점이 있고, Mybatis는 SQL을 직접 작성할 수 있어 개발자가 더욱 자유롭게 데이터베이스를 다룰 수 있다는 장점이 있다. 따라서, 프로젝트의 목적과 상황에 따라 적절한 ORM 기술을 선택해야 한다.
'Spring' 카테고리의 다른 글
API 문서 자동화: Swagger와 Spring REST Docs의 특징과 장단점 (0) | 2023.10.13 |
---|---|
[Spring] VO에서 null 값을 없애고 싶다면? (@JsonInclude) (0) | 2022.07.13 |
[Spring] 프로퍼티(properties) 파일을 이용한 값 설정 (0) | 2022.06.16 |
[Spring] enum(이늄) 사용자 레벨 관리 기능 (0) | 2022.06.15 |
[Spring] @Controller, @RestController의 차이 (0) | 2022.06.14 |