웹 기능을 구현하다 보면
서로 연관된 로직을 작성할 때 FK로 이어주기 위한 값이
자동으로 값이 할당되는 Auto Increasement(이하 AI) 값인 경우가 있다.
예를 들면 쇼핑몰에서
하나의 주문서 안의 여러개의 주문상품들.
(주문서 번호가 13이라면
13의 주문서 번호를 가지고 있는 여러개의 주문상품들)
통장 개설할때 처음에 얼마를 넣으면서 통장을 만드는 등의?
하나의 백엔드 서비스 메서드 안에서 진행되는 것들이다.
그런데 이 AI값은 insert 되기 전에는 데이터 테이블 상에 없는 값이므로 가져오는 쿼리도 짜기가 막막하여
처음 로직을 수립할 때에 곤란을 겪을 수 있다.
이 AI 값을 가져오기 위해서는 여러가지 방법이 있겠지만 세가지 방법을 소개해보겠다.
세가지 중 두가지는 원시적인 방법이고
나머지 한가지가 정석적인 방법이지만
개발자라면 여러가지 발상과 착오를 거치면서 머릿속 뇌의 뉴런을 연결해나가는 거라고 생각해 알아둘 필요가 있다고 생각한다...
1. 해당 테이블의 최대값AI를 불러와서 + 1 하기
주문번호 | ||
2 | ||
1 |
sql 에 최댓값을 불러오는 MAX 함수를 사용하여 백엔드 단에서 +1하여 어거지로 넣어주는 것이다.
<select id="MAX주문번호" resultType="int">
SELECT
MAX(주문번호)
FROM 주문서
</select>
위의 SQL을 실행하면 최대값인 2가 불러와질 것이다. 애초에 처음 실행하는 것이라면? 아무것도 안뜰것이다.
이 방법은 혼자사용하는 프로그램이라면 상관없지만 여러사람이 사용하는 환경이라면 굉장히 위험하다.
시시때때로 MAX 값이 바뀔 것이니 말이다.
2. 가장 최근 Auto Increasement 된 값을 찾는 함수 호출하기 LAST_INSERT_ID()
mySQL에는 가장 최근 AI 값을 찾아주는 LAST_INSERT_ID() 라는 함수가 있다.
요즘 컴퓨터의 빠른 속도를 이용해 방금 넣은 값을 재빨리 불러와 다른 곳에 입력하는 방식인데
이것도 당연히 여러사람이 사용하는 환경이라면 굉장히 위험한 방식이고
이 함수는 심지어 검색기준이 한 테이블이 아니고 전체 데이터베이스에서 검색을 하므로 어떤 값이 나올지 모른다.
이제 안전한 정석적인 방법을 알아보자
3.MyBatis의 useGenerateKeys, keyProperty 사용하기
MyBatis에는 AI값을 파라미터로 들어온 DTO에 매핑해주는 고마운 기능이 있다
아래와 같은 주문서DTO가 있다고 해보자.
public class OrderProduct{
private int OrderId;
private int productList;
}
<insert id="주문상품등록" parameterType="OrderProduct" useGenerateKeys="true" keyProperty="orderId">
INSERT INTO 주문상품
(주문상품)
VALUES
(orderProduct)
</insert>
useGenerateKeys는 자동생성된 키(AI값)를 받는 것을 할지(true) 안할지(default:false) 설정해주는 것이다.
keyProperty는 DTO 안의 받고 싶은 값 이름을 설정한다
이후 DTO를 다룰때 AI 값이 매핑되어 getter로 받을 수 있게 된다.
참 신기한게 어떻게 이런 하나하나의 필요를 파악해서 사용할 수 있게 만들어놨는지 참 신기하다.
초창기 코딩하던 사람들은 도대체 어떻게 코딩을 한걸까..
'JAVA > Spring' 카테고리의 다른 글
WebClient를 이용한 API 호출과 그 리턴 값 다루기(JSON) (2) | 2022.08.03 |
---|---|
Map에서 정수를 꺼낼 때 java.math.BigInteger cannot be cast to java.lang.Integer 오류 (0) | 2022.07.18 |
스프링 비밀번호 암호화/복호화? (0) | 2022.06.06 |
DTO는 무수히 만들어질 수 있다. (0) | 2022.04.22 |
삼항 연산자로 else if 만들기 (0) | 2022.04.03 |
Comment