- SQL Mapper
- 개발자가 작성한 SQL 실행 결과를 객체에 매핑시켜주는 프레임워크
- MyBatis
- ORM(Object Relational Mapping)
- 객체와 DB의 데이터를 자동으로 매핑시켜주는 프레임워크
- JPA
데이터를 관계형 데이터베이스에 저장(= 영속화, persistence)
DB를 사용할 때 번거로운 반복작업 없애줌
- MyBatis: SQL 문 → Java와 분리 ⇒ 별도 파일로 관리 → SQL 개발, 유지 보수 용이
- JPA: SQL 문 만들 필요 X ⇒ 자동화, 반복작업 줄여줌
복잡한 쿼리와 SQL 제어 필요 → MyBatis
간단한 매핑 및 객체 지향적인 접근 필요 → JPA
MyBatis
- 반복적인 JDBC 프로그래밍 단순화 → 불필요한 Boilerplate 코드 제거
- Java 소스코드에서 SQL문 분리 → 별도의 XML 파일로 저장
- 이 둘을 서로 연결시켜주는 기능 제공
특징
- Java 코드와 SQL 매핑
- 내부에 Boilerplate 코드 구현, MyBatis에서 Java 메소드와 SQL 간에 매핑 → 개발자는 Java 메소드 선언과 SQL 문만 만들면 MyBatis가 자동으로 연결
- SQL 문장이 Java 코드 내에 들어가 있어 수정, 보기 어려움 → 별도로 분리 ⇒ 관리 편함 + 분리된 SQL 문 찾아서 실행
- ⇒ 반복적인 JDBC 프로그래밍 단순화 → 불필요한 Boilerplate 코드 제거 , Java 소스코드에서 SQL 문 분리 → 별도의 XML 파일로 저장, 이 둘 서로 연결
- 동적(Dynamic) SQL 생성 기능 ⇒ 유연성 = 검색 조건 같이 사용자가 입력하는 값에 따라 서로 다른 SQL 문장 생성되어 실행 = 실행 시점에 조건에 따라 SQL 쿼리 동적으로 생성하는 것
- 프로그램 실행 중에 입력되는 파라미터 → 서로 다른 SQL 문 동적으로 생성해 내는 기능 제공
- 검색 조건 or 결과값 등이 동적으로 변할 때 유용하게 사용
- 게시판 테이블 검색
- 사용자가 작성자만 입력하여 검색
`SELECT * FROM BOARD WHERE AUTHOR = '파라미터'` - 제목을 입력하여 검색
`SELECT * FROM BOARD WHERE TITLE LIKE '%파라미터%'` - if, choose, when, otherwise, foreach 등의 문법 지원
`SELECT * FROM BLOG WHERE state = 'active' AND title like #{title}` - title 파라미터 없이 호출
`SELECT * FROM BLOG WHERE state = 'active'`
- 사용자가 작성자만 입력하여 검색
장점
- SQL 직접 제어
- SQL 직접 작성, 최적화할 수 있음
- 복잡한 쿼리 or 특정 데이터베이스에 최적화된 쿼리 작성이 필요한 경우에 적합
- DB에 적합한 성능 좋은 SQL 문 만들어서 사용 O
- 통계/분석용 데이터 추출 → 복잡한 쿼리 만들어야 하는 경우에 자유롭게 테이블 간 Join ~> 원하는 데이터 추출 가능
- 학습 용이성
- SQL을 잘 아는 경우에 JPA에 비해 학습이 용이하고 쉽게 사용이 가능
- 캐시 기능 제공
- 데이터베이스 연산 속도 ↑
단점
- CRUD 단순 작업에 반복 수작업 필요
- SQL 직접 만들어야 함 → CRUD 같은 기본적인 코드에 대해 단순한 코드 계속 만들어야 함 ⇒ 개발 생산성 ↓, 코드에 대한 유지보수 힘들어짐
- 데이터베이스에 종속적
- 특정 DB를 기준으로 SQL 문 작성 → DB 변경시 SQL 문 전체 다 확인 후 수정
DB Access 아키텍처
=> `Repository`와 `JDBC API` 사이에 위치
주요 컴포넌트
이름 | 설명 |
MyBatis 설정파일 (mybatis-config.xml) |
DB의 접속 정보, Mapping 파일의 경로, alias 등을 설정하는 XML 파일 |
SqlSessionFactoryBuilder | MyBatis 설정파일을 읽고 SqlSessionFactory를 생성 |
SqlSessionFactory | SqlSession을 생성 |
SqlSession | 가장 핵심적인 역할을 SQL의 실행이나 트랜잭션 관리를 수행Thread-Safe 하지 않으므로 thread 마다 필요에 따라 생성 |
Mapping File (mapper.xml) | SQL과 객체 매핑 설정을 하는 XML 파일 |
DB Access 순서
어플리케이션 실행
- 어플리케이션 → SqlSessionFactoryBuilder에게 SqlSessionFactory 빌드하도록 요청
- SqlSessionFactoryBuilder) SqlSessionFactory를 생성하기 위해 MyBatis 설정 파일을 읽음
- SqlSessionFactoryBuilder) MyBatis 설정 파일의 정의에 따라SqlSessionFactory 생성
클라이언트 요청
- 클라이언트의 어플리케이션에 대한 요청
- 어플리케이션) SqlSessionFactoryBuilder 사용 → 빌드된 SqlSessionFactory에서 SqlSession 가져옴
- SqlSessionFactory) SqlSession 생성, 이를 어플리케이션에 반환
- 어플리케이션) SqlSession에서 Mapper Interface 구현 개체 가져옴
- 어플리케이션) Mapper Interface의 메서드 호출
- Mapper Interface의 구현 개체) SqlSession 메소드 호출, SQL 실행 요청
- SqlSession) Mapping File에서 실행할 SQL 찾아서 실행
JPA(Java Persistence API)
- Java 객체와 관계형 데이터베이스 간의 매핑을 위한 API
- ORM을 구현하는 자바 표준 스펙
- 개발자가 객체지향 프로그래밍 언어에서 사용하는 객체 모델과 관계형 데이터베이스 테이블 간의 매핑을 자동으로 처리해줌
탄생 배경
SQL 문과 Java 코드 연계하는 방식(MyBatis) X
Java 객체와 DB 엔티티(테이블) 자체를 그대로 매핑해서 처리할 수 있는 접근 방식을 채택한 새로운 기술표준 등장 → ORM
⇒ 객체지향 관점에서 개발 + 개발을 용이하게 해줘서 DB와 Java 간의 불일치 해소
→ ORM 기술을 실제 구현해서 만들어진 프레임워크: Hibernate
+EcliseLink, DataNucleus,…
특징
- SQL 문 작성 불필요(↔ MyBatis), ORM 내부적으로 java 메소드에 적합한 SQL 문 자동 생성되어 실행 Java 개발자) 클래스만 만들어서 사용/ ORM 프레임워크) 자동으로 관련된 SQL 만듦
- `jpa.persist(member)` → `Insert SQL` 문 자동 생성 ⇒ DB에 저장
- `jpa.find(memberId)` → `Select SQL` 문 자동 생성 ⇒ DB에 조회
장점
- Java에서 ORM을 위한 표준화된 인터페이스 제공
- Hibernate, EclipseLink, Apache OpenJPA 등 구현체 → JPA 표준 따름
- JPA 표준을 따르기 때문에 좋은 것 X, JPA가 자바 표준 기술이기 때문에 다른 프레임워크들이 표준을 따라 만들어진 것
- 표준 이용 → 특정 제품에 종속 X, 개발자 간에 협업 용이, 일관된 방식으로 개발 O
- Hibernate, EclipseLink, Apache OpenJPA 등 구현체 → JPA 표준 따름
- 자동 매핑 → 개발 및 유지보수성 향상
- 별도의 SQL 작성 X 데이터베이스와 객체 간의 매핑 이뤄짐
- 객체 지향적인 접근 지원
- 테이블 간의 연관 관계와 객체 간의 연관 관계 쉽게 다룰 수 있음
- DBMS에 독립적
- DB 종류 관계 X JPA에서 자동으로 적합한 SQL Dialect(방언) 만들어줌 → DB가 변경돼도 SQL 문 다시 작성할 필요 X
단점
- 높은 학습곡선
- JPA 관련 다양한 스펙과 작성법 학습
- `@Entitity`, `@Table`, `@Column`, `@Id`, `@OneToMany`, `@ManyToOn`
- JPA 적용으로 생기는 다양한 이슈 등에 대한 해결 방법 학습
- 즉시 로딩(EAGER LOADING), 지연 로딩(LASY LOADING), 영속성 전이(CascadeType), 복합키 매핑(`@EmbededId`, `@IdClass`) 등
- JPA 관련 다양한 스펙과 작성법 학습
- 복잡한 SQL 생성의 어려움
- 시스템 개발시 단순한 CRUD가 아닌 통계 or 분석과 같은 화면 기능 개발 필요 → 여러 테이블 Join 해서 데이터 결과 가져와야 함
- 직접적인 SQL 작성 ~> 복잡한 쿼리 만들어야 하는 경우 ⇒ 원하는 결과 정확히 얻기 힘든 경우 ↑
- 성능에 대한 고려 필요
- JPA에 의해 자동으로 SQL 만들어짐 → DB의 특성(index, join 등) 이해하고 DB에 맞는 SQL을 직접 튜닝해서 만들면 성능 뛰어날 수 있음 But, 자동화된 SQL 문으로 데이터 조회 성능 떨어질 가능성 O
- 일반적인 간단한 CRUD에는 큰 문제 X 데이터 ↑, 테이블 간 Join ↑ → 어떻게 튜닝하는 가로 인한 성능 차이 O
출처
[MyBatis] MyBatis란? 개념 및 구조
Mybatis는 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object relational Mapping)프레임워크이다.
velog.io
MyBatis
MyBatis has 37 repositories available. Follow their code on GitHub.
github.com
The MyBatis Blog
A blog about the the MyBatis data mapper framework.
blog.mybatis.org
JPA vs Mybatis, 현직 개발자는 이럴 때 사용합니다. I 이랜서 블로그
서버에서 데이터 베이스를 효율적으로 사용하기 위해 사용하는 JPA와 Mybatis를 실무에서는 언제 어떻게 사용할까요? 이랜서에서 알려드립니다. I 소트프웨어, 소프트웨어 개발자, 네이버 소프트
www.elancer.co.kr
[Spring Boot] MyBatis란?
MyBatis란? MyBatis는 객체 지향 언어인 Java의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 도와주는 퍼시스턴스 프레임워크(Persistence Framework, 데이터를 다루는 클래스 및 설정파일 집합)이다. MyBat
jangjjolkit.tistory.com
'BE' 카테고리의 다른 글
Saga & 2PC (0) | 2025.02.23 |
---|---|
gRPC (0) | 2025.02.23 |