JPA
Java Persistence API
자바 진영의 ORM 기술 표준
구현체로는 Hibernate, EclipseLink, OpenJPA 등등 있는데 Hibernate가 가장 대중적이다.
여기서 ORM이란?
Object-relational mapping (객체 관계 매핑)의는 약어
객체는 객체대로 설계
관계형 데이터베이스는 관계형 데이터베이스대로 설계
ORM 프레임워크가 중간에서 매핑
즉, ORM은 SQL문이 아닌 RDB에 데이터 그 자체를 매핑하기에 SQL을 직접 작성할 필요는 없다.
대중적인 언어에는 대부분 ORM 기술이 존재
MyBatis (Java Persistence Framework)
자바 진영의 오프젝트와 SQL 사이의 자동 매핑 기능을 지원하는 프레임워크이다.
JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다.
자바에서 SQL Mapper를 지원해주는 Framework이다.
여기서 SQL Mapper란?
객체와 관계형 데이터베이스의 데이터를 개발자가 작성한 SQL로 매핑시켜주는 프레임워크이다.
개발자가 SQL을 직접 작성해야 하며 SQL문을 실행하고 얻은 데이터를 객체로 매핑시켜준다.
여기까지 일단 각각의 정의를 내려보았고 JPA와 MyBatis 장단점을 작성할 것이다.
JPA의 장단점
장점
- 생산성과 유지보수 측에서 좋다.
- 생산성 측면에서는 Java 컬렉션의 객체를 조작하듯이 JPA 상호작용을 하면, ORM 프레임워크가 아래와 적절한 SQL문을 자동으로 생성해서 데이터베이스와 통신한다.
- 저장: jpa.persist(member)
- 조회: Member member = jpa.find(memberId)
- 수정: member.setName(“변경할 이름”)
- 삭제: jpa.remove(member)
- 유지보수 측에서는 JPA가 패러다임의 불일치 문제를 해결해주므로, 객체지향적인 장점을 활용하여 유지보수하기 좋은 설계와 개발을 할 수 있다.
또한 성능 측에서도 JPA는 애플리케이션과 데이터베이스 사이에 다양한 성능 최적화 기회를 제공한다.
String memberId = "helloId";
Member member1 = jpa.find(memberId);
Member member2 = jpa.find(memberId);
이처럼 트랜잭션 안에 같은 회원을 두 번 조회하는 코드가 있다고 가정한다.
SQL을 사용했다면 데이터베이스와 두 번 통신을 하겠지만, JPA는 SQL 한 번 통신하고 이후 같은 SQL문을 JPA가 확인하여 회원 조회 객체를 다시 사용한다. 다시 사용하는 과정은 처음 1차 캐시에 등록되고 동일성 보장되며, 쓰기 지연, SQL 저장소 -> Flush 등등 과정이 있지만 앞으로 JPA 포스팅하면서 작성할 것이다.
- RDB에 종류와 관계없이 사용이 가능하여 추후 DB변경이나 코드 재활용에 용이하다.
- 기본적인 CRUD 제공과 페이징 처리 등 상당 부분이 구현되어 비즈니스 로직에 집중적으로 구현할 수 있다.
단점
- 처음 접근하기에 난이도가 있다.
- 단방향, 양방향, 임베디드 관계, 위에 설명했듯이 1차 캐시가 등록될 영속성 컨텍스트 등 이해해야할 부분이 많다.
- 통계 처리와 같이 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화되어 있다. 따라서 SQL문을 직접 작성하는 경우가 있을텐데 이러면 장점이 사라지고 오히려 복잡성이 늘 수도 있다.
MyBatis의 장단점
장점
- JPA에 비해 난이도가 쉽다.
- SQL 쿼리를 그대로 사용하기에 복잡한 JOIN, 튜닝 등 편하게 작성하고 변경이 쉽다.
- 동적 쿼리 사용 시 JPA보다 간편하게 구현이 가능하다.
단점
- DB설정 변경 시에 수정할 부분이 많다.
- Mapper 작성부터, 인터페이스 모델 설계까지 JPA보다 많은 설계와 파일, 로직이 요구된다.
- 특정 DB에 종속적이다. DB가 바뀌면 DB문법에 맞게 Mapper를 전부 수정해야 한다.
- JPA는 DB가 바뀌어도 방언에 맞게 적절히 바꿔준다.
'Spring' 카테고리의 다른 글
[Spring boot] 열리는 port 번호 변경하기 (0) | 2022.10.13 |
---|---|
[Spring boot] @ManyToMany를 사용하면 안 되는 이유 (2) | 2022.10.12 |
[Spring] MyBatis 연동 및 API 테스트 (3) | 2022.02.11 |
[Spring] Spring Service, Bean, 의존성 주입 (0) | 2022.02.07 |
[Spring Boot] Spring 웹 개발 입문 (Spring Controller, HTTP, REST API 문서) (0) | 2022.02.03 |