[Springboot] MyBatis에서 JPA로 — ORM과 영속성 기초
목차
DAO / VO / DTO
| 약어 | 풀네임 | 설명 |
|---|---|---|
| DAO | Data Access Object | DB 접근을 담당하는 추상화 객체. 스프링에서는 Repository 빈으로 정의. “택배원” |
| VO | Value Object | 값을 저장하는 단순 객체. 같음을 값 기준으로 판단 |
| DTO | Data Transfer Object | 서로 다른 프로세스 간 데이터를 전송하기 위한 객체. HTTP Body 정의에도 활용. “소포” |
비유: **DTO(소포)**를 **DAO(택배원)**가 **매퍼 인터페이스(오토바이)**를 타고 **MyBatis(도로)**를 통해 전달한다.
이론이라 하기엔 작은 단위이지만, 역할이 뒤섞이지 않도록 구분해 사용하는 것이 중요하다.
MyBatis 구조


MyBatis의 동작 흐름:
- SqlSessionFactoryBuilder: MyBatis 설정을 읽어 SqlSessionFactory 생성
- SqlSessionFactory: 요청마다 SqlSession 연결 생성
- SqlSession: 미리 정의된 매퍼 인터페이스를 통해 실제 SQL 실행
- 매핑 파일(XML): 인터페이스 함수와 실제 쿼리문을 연결
MyBatis 개발 순서


사실 명확한 순서는 없지만 일반적으로 아래 순서로 진행한다.
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)

- JDBC URL, 사용자 ID, 비밀번호 등 DB 연결 정보를 설정
- 스프링 부트를 사용하면 세부 설정의 상당 부분을 자동으로 처리해줌
| 설정 방식 | 특징 |
|---|---|
| yml | 계층 구조로 표현, 가독성 높음 |
| properties | key=value 쌍으로 표현, 단순 |
쓰는 형식만 다를 뿐 기능적 차이는 없다.
참고:
- https://mybatis.org/mybatis-3/configuration.html
- https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

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

MyBatis 바인딩 문법
| 표기 | 동작 |
|---|---|
#{} | 문자열 형태로 바인딩 (SQL Injection 방지, 숫자도 받을 수 있음) |
${} | Raw 텍스트로 삽입 (숫자·바이너리 등에 사용, 주의 필요) |
JPA 이전 — ORM이란?
- ORM (Object-Relational Mapping): 테이블의 row를 OOP 객체에 매핑하는 기술
- MyBatis는 SQL을 직접 작성하는 SQL 매퍼, 엄밀한 ORM은 아님
MyBatis vs JPA 비교
| 항목 | MyBatis | JPA (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진수 난수로 변환
- 비밀번호 저장 등 보안 목적에 활용