Don't Panic
in Springboot ☕ 3분 읽기

[Springboot] MyBatis에서 JPA로 — ORM과 영속성 기초

목차

DAO / VO / DTO

약어풀네임설명
DAOData Access ObjectDB 접근을 담당하는 추상화 객체. 스프링에서는 Repository 빈으로 정의. “택배원”
VOValue Object값을 저장하는 단순 객체. 같음을 값 기준으로 판단
DTOData Transfer Object서로 다른 프로세스 간 데이터를 전송하기 위한 객체. HTTP Body 정의에도 활용. “소포”

비유: **DTO(소포)**를 **DAO(택배원)**가 **매퍼 인터페이스(오토바이)**를 타고 **MyBatis(도로)**를 통해 전달한다.

이론이라 하기엔 작은 단위이지만, 역할이 뒤섞이지 않도록 구분해 사용하는 것이 중요하다.


MyBatis 구조

MyBatis 전체 흐름

MyBatis 세션 팩토리 흐름

MyBatis의 동작 흐름:

  1. SqlSessionFactoryBuilder: MyBatis 설정을 읽어 SqlSessionFactory 생성
  2. SqlSessionFactory: 요청마다 SqlSession 연결 생성
  3. SqlSession: 미리 정의된 매퍼 인터페이스를 통해 실제 SQL 실행
  4. 매핑 파일(XML): 인터페이스 함수와 실제 쿼리문을 연결

MyBatis 개발 순서

MyBatis 개발 순서

MyBatis DB 설정 화면

사실 명확한 순서는 없지만 일반적으로 아래 순서로 진행한다.

create database demo_community;

grant insert,
delete,
create,
drop,
select,
update,
alter,
references
on demo_community.* to staff;

테이블 생성 예시

  • timestamp 타입: 생성/수정 시각 기록
  • 유저 ID는 UQ(Unique) 제약을 걸어야 중복 로그인 문제를 방지할 수 있음

MyBatis 설정 (yml / properties)

MyBatis yml 설정 예시

  • JDBC URL, 사용자 ID, 비밀번호 등 DB 연결 정보를 설정
  • 스프링 부트를 사용하면 세부 설정의 상당 부분을 자동으로 처리해줌
설정 방식특징
yml계층 구조로 표현, 가독성 높음
propertieskey=value 쌍으로 표현, 단순

쓰는 형식만 다를 뿐 기능적 차이는 없다.

참고:

MyBatis 매퍼 인터페이스 예시

  • 테이블마다 매퍼를 만들고, MyBatis가 XML을 읽어 인터페이스에 연결
  • @Autowired: 스프링이 관리하는 빈으로 주입
  • SqlSessionFactory도 스프링·MyBatis 통합 시 Bean으로 정의됨
  • try-with-resources 구문으로 SqlSession 자원을 자동 해제

SqlSession 예시

MyBatis 바인딩 문법

표기동작
#{}문자열 형태로 바인딩 (SQL Injection 방지, 숫자도 받을 수 있음)
${}Raw 텍스트로 삽입 (숫자·바이너리 등에 사용, 주의 필요)

JPA 이전 — ORM이란?

  • ORM (Object-Relational Mapping): 테이블의 row를 OOP 객체에 매핑하는 기술
  • MyBatis는 SQL을 직접 작성하는 SQL 매퍼, 엄밀한 ORM은 아님

MyBatis vs JPA 비교

항목MyBatisJPA (Hibernate)
SQL 방식직접 SQL 작성프레임워크가 SQL 자동 생성
DB 의존성DB마다 쿼리 수정 필요DB 독립적 (Dialect 설정만 변경)
코드량쿼리·매퍼·DTO 모두 작성어노테이션 기반으로 코드량 감소
참조 방식Call by Value (결과값 복사)Call by Reference (엔티티 참조)
특징쿼리 에러를 바로 확인 가능복잡한 관계 자동 처리, 확장성 좋음

참고: https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

  • Hibernate: JPA 스펙을 구현한 ORM 프레임워크, DB와 소통하는 Dialect 정의 보유
  • JPA 어노테이션은 테이블 row를 설명하기 위한 것 → AOP 개념과 연결됨
  • @OneToOne, @JoinColumn 등으로 엔티티 간 관계 정의
  • JPA의 ddl-auto 옵션으로 테이블 자동 생성·갱신 가능 (운영에서는 주의)

해시(Hash)

해시 개념 다이어그램

  • 입력 데이터를 고정 길이의 16진수 난수로 변환
  • 비밀번호 저장 등 보안 목적에 활용