◆ PART · DB

카멜 ↔ 스네이크 함정

데이터와 MyBatis — 읽기 자료

📍 지금 어디를 만지고 있나요?
브라우저
데이터와 MyBatis
DB

핵심 용어

카멜 케이스userId, createdAt — 자바 컨벤션.
스네이크 케이스user_id, created_at — DB 컨벤션.
mapUnderscoreToCamelCaseMyBatis 글로벌 옵션. true 로 두면 자동 변환.

1. 문제

전 차시까지의 답답함

"분명히 SELECT 했는데 객체에 데이터가 안 들어와요. 모두 null 이에요!"

2. 새 도구

이름 규칙의 차이

DB 는 user_id (스네이크), 자바는 userId (카멜). 둘이 자동으로는 매핑 안 됨.

3. 코드

-- DB (일반 예시)
CREATE TABLE sample (
    user_id    VARCHAR(50),     -- 스네이크
    created_at TIMESTAMP
);

// 자바 VO
public class Sample {
    private String userId;        // 카멜
    private LocalDateTime createdAt;
}

-- 결과: SELECT 해도 userId, createdAt 이 null

// 해법 1: AS 로 매핑
SELECT user_id AS userId, created_at AS createdAt FROM sample

// 해법 2: 글로벌 설정 (권장)
<!-- mybatis-config.xml -->
<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

4. 정리

5. Before / After

전 차시 끝

"분명히 SELECT 했는데 객체에 데이터가 안 들어와요. 모두 null 이에요!"

이번 차시 끝

null 이 되는 함정을 만나면 어디를 의심할지 안다.