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로 선언했으니 타 자바변수와 똑같이 저렇게 써주면된다!