[Mybatis] SelectKey 사용하기

서현서현·2022년 8월 25일
0

Spring

목록 보기
22/31

SelectKey는 언제 사용하는가?

CRUD중 Create 구현시 DB에 ID를 넣어줘야한다.
이 아이디는 정책에 따라 특정 의미를 갖는 형식이 될텐데, 컨트롤러에서 매번 만들어서 넘겨주기는 어려울것이다. 이전의 ID들도 싹다 조회해야하거나 그럼에도 만들기 힘든 경우도 있을테니까

결국 그걸 db에서 자동으로 생성해서 넣어주도록 할 필요가 있다.
즉, 특정 컬럼값을 가져와 그에 기반해서 다음 ID의 값을 생성해주는것이다.

메뉴ID를 예시로 들어보겠다. 아이디는 다음과같이 생성된다

예제

이전 메뉴컬럼의 시퀀스를 조회해서 MENU라는 글자에 붙여주는것이다. 숫자는 세글자까지 가능하도록 만든다.

<insert id="create">
	<selectKey resultType="String" keyProperty="menuId" order="BEFORE">
		SELECT 'MENU'||LPAD(MENU_ID_SEQ.NEXTVAL, 3, '0') FROM DUAL
	</selectKey>
	INSERT INTO MENU(MENU_ID,MENU_NAME,MENU_PRICE,MENU_TEXT,MENU_DATE,MENU_TYPE)
	VALUES(
	#{menuId},
	#{menuName},
	#{menuPrice},
	#{menuText},
	TO_DATE(#{menuDate},'YYYYMMDD'),
	#{menuType}
	)
</insert>

위와같이 사용할 수 있겠다. 뜯어보자면

	<selectKey resultType="String" keyProperty="menuId" order="BEFORE">
		SELECT 'MENU'||LPAD(MENU_ID_SEQ.NEXTVAL, 3, '0') FROM DUAL
	</selectKey>

selectKey라는 태그를 이용한다. 속성으로는 resultType, 즉 반환되는 결과의 타입을 설정하고, keyProperty, 자바기준의 변수명을 정해준다. order는 반환 순서이다. before로 설정했으므로 위 키를 호출하는 insert문이 실행되기전에 먼저 실행된다. 따라서 after를 사용하는 경우도 공부해보자면 다음과같다

<insert id="insertSurveyInfo" parameterType="Board">
    INSERT INTO board(boardID, title, content)
    VALUES(#{boarID}, #{title}, #{content})
    <selectKey resultType="int" keyProperty="iq" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>        
</insert>

insert문 실행하고 입력된값의 컬럼값을 가져올 수 있다!

혀튼 원래 예시로 돌아가보자면, select를 통해 MENU_ID가 완성되도록 한다. 그러면 이제 insert문이 실행되기전에 id가 완성될것이고

	INSERT INTO MENU(MENU_ID,MENU_NAME,MENU_PRICE,MENU_TEXT,MENU_DATE,MENU_TYPE)
	VALUES(
	#{menuId},
	#{menuName},
	#{menuPrice},
	#{menuText},
	TO_DATE(#{menuDate},'YYYYMMDD'),
	#{menuType}
	)

이 구문을 통해 insert될 것이다. 아까 menuId로 선언했으니 타 자바변수와 똑같이 저렇게 써주면된다!

0개의 댓글