[Java] 동시요청에 대한 무결한 처리를 보장하는 방법 6(채번테이블 설계 보완)

Hyo Kyun Lee·2025년 1월 11일
0

Java

목록 보기
73/87
  1. 이 글에서 이어진다.
  2. 이 글에서 이어진다.

1. 개요

주문이력을 발생시킬때 pk중복오류가 발생하였는데, 이 오류를 기존 해결하였던 방안으로 접근하는 것이 바람직하지 않다고 판단되어 다른 방향으로 해결방안을 모색하였고, 적용하였다.

첫번째 해결방안은 채번테이블 설계의 보완이다.

2. 채번 테이블 설계 보완 - 사용자 별 유일인자 값 활용

현재 채번테이블은 구분코드, 체결일자, 시리얼 번호로 구성되어 있고 신규 채번을 진행할 때 마다 구분코드, 체결일자에 대한 시리얼 번호를 조회해온다.

주문을 발생시킨 후에 해당 시리얼 번호를 +1을 하며 채번값을 증가하는데, 사실 동시성 관점에서 이 과정도 무결성을 보장할 수 없다.

이럴 경우 문제가 동일 구분코드(상품, 처리항목 등), 동일 체결일자 환경에서 현재 발생한 문제처럼 중복오류가 발생할 수 있다. 즉 구분코드를 기반으로 일련번호를 채번한다 하더라도 수많은 사용자에 대해 유일성을 보장할 수 없으므로 중복오류가 발생하였던 것이다.

나는 이를 위해 채번테이블 설계 보완을 생각하였고, 그 방안이 구체적이지 않은 구분코드 대신에 사원번호를 사용하는 안을 제시하였다.

이럴 경우 아무리 많은 사용자가 들어와도, 사용자의 유일성을 무조건 보장할 수 있으며 채번테이블에서도 컬럼을 통한 목적성을 확인할 수 있기에 설계적으로나 안정성으로나 더 유리할 것으로 생각하였다.

이 결과로 채번하는 항목이 변경되었다.

현재 채번 시

SELECT SN
FROM TB_SN
AND CRTR_YMD = ${crtrYmd}
AND NO_SE_CD = ${noSeCd}

변경 후

SELECT SN
FROM TB_SN
AND CRTR_YMD = ${crtrYmd}
AND EMPL_NO = ${emplNo}

이 일이 사실 좀 오래되긴 했는데 당시 공수가 별로 들지도 않고, 협의할 때 안정성을 최우선으로 고려하였기 때문에 이 방안이 채택될 수 있었다.

또한 동시성 제어는 db이력을 활용하는 방안도 있는데, 대용량처리에서 사용하였던 방식과 꽤 유사한 점이 많이 보여서 활용도가 높아보였다.

3. 참고자료

db이력을 활용한 동시제어 - https://velog.io/@dusdn2424/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%82%AC%EC%9A%A9%EC%9E%90-%EB%8F%99%EC%8B%9C-%EC%A0%91%EA%B7%BC-%EC%9A%94%EC%B2%AD%EC%9D%84-%EC%A0%9C%EC%96%B4%ED%95%98%EB%8A%94-3%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95

효율적인 채번방식 - https://m.blog.naver.com/PostView.naver?blogId=hsj2850&logNo=220421875044&proxyReferer=https:%2F%2Fwww.google.co.kr%2F&trackingCode=external

0개의 댓글

관련 채용 정보