[MySQL] LAST_INSERT_ID() – 가장 최근의Auto Increment값을 가져오기

데이터를 추가하는 경우에 다음과 같은 경우가 많이 있다.

“하나의 글을 작성하는데 다수의 첨부파일을 작성할 수 있는 경우”
사용자 삽입 이미지
위의 ERD로 스크립트를 생성해 보면 다음과 같을 것이다.

[code]CREATE TABLE POST (
  POST_IDX int(11) AUTO_INCREMENT,
  SUBJECT varchar(2000),
  NAME varchar(200),
  CONTENT text,
  WRITTEN datetime,
  PRIMARY KEY(POST_IDX)
)

CREATE TABLE ATTACHMENT (
  ATTACH_IDX int(11) AUTO_INCREMENT,
  POST_IDX int(11),
  FILE_NAME varchar(200),
  FILE_PATH varchar(2000),
  UPLOADED datetime,
  PRIMARY KEY(ATTACH_IDX ),
  FOREIGN KEY POST_IDX REFERENCES POST(POST_IDX)
)[/code]

글이 작성된 후 저장될때 POST테이블에 하나의 값을 추가한후, 다수의 ATTACHMENT를 추가하여야 할것이다.

하지만 어떻게 정확한 POST_IDX를 알아올 수 있는가?

POST를 저장할때 POST_IDX는 자동증가 인덱스를 가지고 있기 때문에 어떤 값을 부여받게 될지 알 수 없다.

다음과 같은 방법으로 처리할 수 있다.

[code]INSERT INTO POST (
  SUBJECT, NAME, CONTENT, WRITTEN
) VALUES (
  “제목”, “이름”, “글내용”, NOW()
);

INSERT INTO ATTACHMENT (
  POST_IDX, FILE_NAME, FILE_PATH, UPLOADED
) VALUES (
  LAST_INSERT_ID(), “file.jpg”, “/tmp/file.jpg”, NOW()
);[/code]

위와 같이 LAST_INSERT_ID()를 사용하면 가장 최근에 INSERT시에 입력된 INCREMENT ID값을 가져올 수 있다.

중간에 다른 사용자에 의해 글이 추가되더라도 내가 작성할때 부여된 INCREMENT값이 나온다.

단, 당연하겠지만 같은 커넥션 안에서만 정상적인 결과가 나온다.

[Velocity] 스프링 프레임워크에서 사용하기

스프링에서는 벨로시티 뷰 템플릿 엔진(혹은 프레임워크)을 사용하기 쉽도록 하기 위해 따로 인터페이스 클래스를 제공하고 있다. 다음과 같은 설정만으로도 바로 벨로시티를 사용할 수 있다.

1. View Resolver
[code]<bean id=”viewResolver”
 class=”org.springframework.web.servlet.view.velocity.VelocityViewResolver”>
  <property name=”cache” value=”true”/>
  <property name=”prefix” value=”/WEB-INF/vm/”/>
  <property name=”suffix” value=”.vm”/>
  <property name=”contentType” value=”text/html; charset=UTF-8″/>
</bean>[/code]

위와 같이 ViewResolver를 설정하여 준다. 기존의 Resolver를 교체하여도 되고 여러개의 Resolver를 설정하여도 된다. 스프링이 알아서 알맞는 Resolver를 선택한다고 한다. Content Type을 강제적으로 설정하여 Response의 헤더에 실려가도록 설정할 수 있다.

2. Velocity Config
[code]<bean id=”velocityConfig”
 class=”org.springframework.web.servlet.view.velocity.VelocityConfigurer”>
  <property name=”resourceLoaderPath” value=”/WEB-INF/vm/”/>
  <property name=”velocityProperties”>
    <props>
      <prop key=”directive.foreach.counter.name”>loopCounter</prop>
      <prop key=”directive.foreach.counter.initial.value”>0</prop>
      <prop key=”input.encoding”>UTF-8</prop>
      <prop key=”output.encoding”>UTF-8</prop>
    </props>
  </property>
</bean>[/code]

resourceLoaderPath에는 VTL 페이지들이 모여있는 곳의 경로를 지정하여 주면 된다. 이런 보안적인 제제가 필요없다면 /로 설정을 하면 된다. 밑의 directive.foreach.counter.name설정은 foreach사용시에 현재 카운터를 참조할 수 있는 변수명을 가르킨다. foreach중 $loopCounter 를 찍어보면 현재의 카운터가 출력된다.

directive.foreach.counter.initial.value는 벨로시티의 foreach카운터 디폴트 시작값이 0이 아닌 1로 되어있다. 대부분의 프로그래밍은 제로베이스 이므로 0으로 바꾸어 준다. 밑의 인코딩 옵션은 사용하기 원하는 인코딩 설정으로 하여주면 된다.