728x90
반응형
  • 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 아키텍처

=> RepositoryJDBC 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 순서

어플리케이션 실행

  1. 어플리케이션 → SqlSessionFactoryBuilder에게 SqlSessionFactory 빌드하도록 요청
  2. SqlSessionFactoryBuilder) SqlSessionFactory를 생성하기 위해 MyBatis 설정 파일을 읽음
  3. SqlSessionFactoryBuilder) MyBatis 설정 파일의 정의에 따라SqlSessionFactory 생성

 

클라이언트 요청

  1. 클라이언트의 어플리케이션에 대한 요청
  2. 어플리케이션) SqlSessionFactoryBuilder 사용 → 빌드된 SqlSessionFactory에서 SqlSession 가져옴
  3. SqlSessionFactory) SqlSession 생성, 이를 어플리케이션에 반환
  4. 어플리케이션) SqlSession에서 Mapper Interface 구현 개체 가져옴
  5. 어플리케이션) Mapper Interface의 메서드 호출
  6. Mapper Interface의 구현 개체) SqlSession 메소드 호출, SQL 실행 요청
  7. SqlSession) Mapping File에서 실행할 SQL 찾아서 실행

JPA(Java Persistence API)

  • Java 객체와 관계형 데이터베이스 간의 매핑을 위한 API
  • ORM을 구현하는 자바 표준 스펙
  • 개발자가 객체지향 프로그래밍 언어에서 사용하는 객체 모델과 관계형 데이터베이스 테이블 간의 매핑을 자동으로 처리해줌

 

탄생 배경

SQL 문과 Java 코드 연계하는 방식(MyBatis) X

Java 객체와 DB 엔티티(테이블) 자체를 그대로 매핑해서 처리할 수 있는 접근 방식을 채택한 새로운 기술표준 등장 → ORM

⇒ 객체지향 관점에서 개발 + 개발을 용이하게 해줘서 DB와 Java 간의 불일치 해소

→ ORM 기술을 실제 구현해서 만들어진 프레임워크: Hibernate

+EcliseLink, DataNucleus,…

출처: https://www.elancer.co.kr/blog/detail/231?seq=231


특징

  • SQL 문 작성 불필요(↔ MyBatis), ORM 내부적으로 java 메소드에 적합한 SQL 문 자동 생성되어 실행 Java 개발자) 클래스만 만들어서 사용/ ORM 프레임워크) 자동으로 관련된 SQL 만듦
    • jpa.persist(member)Insert SQL 문 자동 생성 ⇒ DB에 저장
    • jpa.find(memberId)Select SQL 문 자동 생성 ⇒ DB에 조회

출처: https://www.elancer.co.kr/blog/detail/231?seq=231


장점

  • Java에서 ORM을 위한 표준화된 인터페이스 제공
    • Hibernate, EclipseLink, Apache OpenJPA 등 구현체 → JPA 표준 따름
      • JPA 표준을 따르기 때문에 좋은 것 X, JPA가 자바 표준 기술이기 때문에 다른 프레임워크들이 표준을 따라 만들어진 것
    • 표준 이용 → 특정 제품에 종속 X, 개발자 간에 협업 용이, 일관된 방식으로 개발 O
  • 자동 매핑 → 개발 및 유지보수성 향상
    • 별도의 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) 등
  • 복잡한 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

 

 

728x90
반응형

'BE' 카테고리의 다른 글

Saga & 2PC  (0) 2025.02.23
gRPC  (0) 2025.02.23
김앩옹