devtools

DDL → Java DTO · MyBatis

CREATE TABLE을 붙여넣으면 DTO, resultMap, Mapper XML까지 한 번에. 컬럼명만 넣으면 camelCase ↔ snake_case 변환표가 나옵니다.

접미사
날짜
CREATE TABLE 또는 컬럼명 목록
이름 변환

왼쪽에 CREATE TABLE 문을 붙여넣으면 DTO·resultMap·Mapper XML이 나옵니다. 컬럼명만 넣으면 camelCase·snake_case 변환표가 나와요.

사용법

  1. DBeaver·DataGrip·Workbench 등에서 테이블의 CREATE TABLE 문을 복사해 왼쪽에 붙여넣습니다.
  2. 위 탭에서 Java DTO, resultMap, Mapper XML, 매핑표 중 필요한 결과를 고릅니다.
  3. 클래스 접미사(Dto·VO·Entity), Lombok 여부, 날짜 타입(LocalDateTime / Date), 패키지명을 프로젝트에 맞게 바꿉니다. 설정은 다음에 와도 그대로 남아요.
  4. 복사 버튼으로 가져가서 쓰면 끝. 여러 테이블이면 ‘전체 복사’로 한 번에.

변환 예시

입력 DDL

CREATE TABLE tb_notice (
  notice_id  BIGINT NOT NULL AUTO_INCREMENT COMMENT '공지 번호',
  title      VARCHAR(200) NOT NULL COMMENT '제목',
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (notice_id)
) COMMENT='공지사항';

Java DTO

/** 공지사항 */
@Getter
@Setter
@NoArgsConstructor
@ToString
public class NoticeDto {
    /** 공지 번호 */
    private Long noticeId;

    /** 제목 */
    private String title;

    private LocalDateTime createdAt;
}

MyBatis resultMap

<resultMap id="noticeResultMap" type="NoticeDto">
    <id property="noticeId" column="notice_id"/>
    <result property="title" column="title"/>
    <result property="createdAt" column="created_at"/>
</resultMap>

DB 타입 → Java 타입 매핑

DB 타입JavajdbcType
BIGINT, NUMBER(10~19)LongBIGINT
INT, SMALLINT, NUMBER(1~9)IntegerINTEGER
TINYINT(1), BIT(1), BOOLEANBooleanBOOLEAN
DECIMAL, NUMERIC, NUMBER(p,s)BigDecimalDECIMAL
VARCHAR, CHAR, TEXT, ENUM, JSONStringVARCHAR
CLOBStringCLOB
DATELocalDate (Oracle: LocalDateTime)DATE
DATETIME, TIMESTAMPLocalDateTimeTIMESTAMP
TIMESTAMP WITH TIME ZONEOffsetDateTimeTIMESTAMP_WITH_TIMEZONE
BLOB, BYTEA, VARBINARYbyte[]BLOB

wrapper 타입(Long, Integer)을 쓰는 건 NULL 컬럼을 0으로 오해하지 않기 위해서예요. 날짜를 java.util.Date로 받는 옛 프로젝트라면 날짜 옵션을 Date로 바꾸면 됩니다.

자주 묻는 질문

Q.어떤 DDL을 넣으면 되나요?

DB 툴에서 'Show CREATE TABLE'이나 'DDL 복사'로 뽑은 CREATE TABLE 문을 그대로 붙여넣으면 됩니다. 여러 테이블을 한 번에 넣어도 테이블마다 따로 만들어지고, 인덱스·외래키 줄은 알아서 건너뜁니다.

Q.컬럼 코멘트도 가져오나요?

네. MySQL/MariaDB의 COMMENT '...'와 PostgreSQL/Oracle의 COMMENT ON COLUMN ... IS '...' 둘 다 읽어서 필드 위 Javadoc 주석으로 넣습니다. 테이블 코멘트는 클래스 주석이 됩니다.

Q.resultMap을 쓰면 mapUnderscoreToCamelCase는 필요 없나요?

resultMap에 column과 property를 직접 짝지어 두면 그 설정 없이도 매핑됩니다. 반대로 mapUnderscoreToCamelCase=true를 켜 두었다면 resultMap 없이 resultType에 DTO를 바로 써도 되니, 필요한 쪽만 복사해서 쓰세요.

Q.INSERT·UPDATE에서 빠지는 컬럼이 있어요.

AUTO_INCREMENT·IDENTITY·serial 컬럼, DEFAULT CURRENT_TIMESTAMP(now(), SYSDATE) 등록일, ON UPDATE CURRENT_TIMESTAMP 수정일은 DB가 채우도록 뺍니다. AUTO_INCREMENT가 있으면 insert에 useGeneratedKeys도 붙여줍니다.

Q.Oracle DATE가 LocalDateTime으로 나와요.

Oracle의 DATE는 시·분·초까지 저장하는 타입이라 LocalDateTime으로 매핑합니다. VARCHAR2·NUMBER·CLOB처럼 Oracle 전용 타입이 있으면 Oracle DDL로 판단하고, 그 외에는 DATE를 LocalDate로 둡니다.

Q.컬럼명만 camelCase로 바꾸고 싶어요.

CREATE TABLE 없이 컬럼명만 한 줄에 하나씩(또는 쉼표로) 넣으면 camelCase, PascalCase, snake_case, UPPER_SNAKE, kebab-case 변환표가 나옵니다. 열마다 복사 버튼이 있어서 엑셀 컬럼 목록을 바로 필드명으로 바꿀 수 있어요.

쿼리 로그에서 실제 실행된 SQL을 뽑을 땐 MyBatis 로그 → SQL 변환기를 같이 써보세요.

Gunmo Lee