[Spring] 5일차

김민지·2026년 4월 15일

kosa-Spring

목록 보기
5/13

MyBatis — BoardMapper.xml

Oracle SQL Developer 기본 설정

  1. 사용할 데이터베이스 선택 후 마우스 오른쪽 → SQL 워크시트 작성
  2. 리프레쉬 후 테이블 확인
  3. mapper 선택 후 board_dao2.xml 생성
  4. member_dao 파일에 xml 붙여넣기

Window Preferences 설정

  • Window → Preferences → XML → Web Developer → Download 관련 항목 체크

프로젝트할 때

서비스는 기능 이름으로 만들기, 컨트롤러도 마찬가지


Mapper XML 기본 구조

namespace에 매핑되는 DAO를 복붙해서 연결한다.

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.mycompany.backendapi.database.dao.MemberDao">
    <insert id="insert"></insert>
    <delete id="delete"></delete>
    <update id="update"></update>
    <select id="selectByMid"></select>
</mapper>

id의 값이 DAO 인터페이스의 메서드 이름과 매핑된다.


동적 SQL

동적 SQL은 조건에 따라 SQL 구문이 바뀌는 것이다.

Java null ↔ SQL null 매핑 설정

mybatis-config.xml에 아래 설정을 추가한다.

<configuration>
    <settings>
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
</configuration>

BoardMapper.xml — insert 전체 코드

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.mycompany.backendapi.database.dao.BoardDao">
    <insert id="insert" parameterType="Board">
        <selectKey keyProperty="bno" resultType="int" order="BEFORE">
            select board_bno_seq.nextval from dual
        </selectKey>
        insert into board
        (bno, btitle, bcontent, bdate, bwriter,
         battachoname, battachsname, battachtype, battachdata)
        values
        (#{bno}, #{btitle}, #{bcontent}, sysdate, #{bwriter},
         #{battachoname}, #{battachsname}, #{battachtype}, #{battachdata})
    </insert>
</mapper>

코드 상세 설명

<mapper namespace="...">

이 XML이 어떤 DAO 인터페이스와 연결되는지 지정한다.

BoardDao 인터페이스의 메서드와 여기 정의된 SQL이 매핑된다.


<insert id="insert" parameterType="Board">

  • insert라는 이름의 SQL 구문이다.
  • Board 객체를 파라미터로 받는다.
  • MyBatis 설정에 Board 타입 alias가 등록되어 있어야 한다.

<selectKey> — 핵심 포인트

<selectKey keyProperty="bno" resultType="int" order="BEFORE">
    select board_bno_seq.nextval from dual
</selectKey>
속성의미
keyProperty="bno"조회 결과를 Board 객체의 bno 필드에 넣는다
resultType="int"결과 타입은 int
order="BEFORE"INSERT 실행 전에 먼저 실행한다

Oracle의 시퀀스.nextval로 다음 번호를 가져온다.

MySQL은 AUTO_INCREMENT를 쓰지만, Oracle은 시퀀스를 직접 조회해야 하기 때문에 이 방식을 사용한다.

board_bno_seq.nextvalbno가 되는 원리

  1. board_bno_seq.nextval 실행 → Oracle 시퀀스가 숫자(예: 5) 반환
  2. 그 숫자가 keyProperty="bno" 덕분에 → Board 객체의 bno 필드에 저장
  3. 이후 INSERT에서 #{bno} 사용 → 그 5가 들어간다

keyProperty가 없으면 조회하고 끝이라 INSERT에서 사용할 수 없다.

keyProperty="bno"가 "이 조회 결과를 bno에 넣어라"고 연결해주는 핵심 속성이다.


INSERT INTO board (...)

insert into board
(bno, btitle, bcontent, bdate, bwriter,
 battachoname, battachsname, battachtype, battachdata)
values
(#{bno}, #{btitle}, #{bcontent}, sysdate, #{bwriter},
 #{battachoname}, #{battachsname}, #{battachtype}, #{battachdata})
  • #{필드명} → Board 객체의 getter를 통해 값을 가져온다.
  • bdatesysdate로 DB에서 현재 시각을 자동 입력한다.
  • battach* 컬럼들은 파일 첨부 정보를 저장한다.
컬럼역할
battachoname원본 파일명 (Original Name)
battachsname서버 저장 파일명 (Saved Name)
battachtype파일 MIME 타입
battachdata파일 데이터 (BLOB)

동작 순서 요약

  1. Java에서 insert(board) 호출
  2. <selectKey>먼저 실행 → board_bno_seq.nextval 조회
  3. 조회된 값이 Board 객체의 bno 필드에 자동 주입
  4. INSERT INTO board 실행 (bno 포함)
  5. Oracle DB에 행(row) 저장

한 줄 요약

Board 객체를 받아 → 시퀀스로 bno 다음 번호 뽑아오기 → 그 bno 포함해서 board 테이블에 INSERT하는 MyBatis SQL mapper

profile
안녕하세요

0개의 댓글