본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.




패스트캠퍼스의 '9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online' 강의 수강 36일차!
오늘은 멱등성과 멱등키 개념 학습을 진행하였다.
멱등성과 멱등키는 소프트웨어 개발에서 아주 중요한 개념 중 하나이다.
api 설계 및 데이터 처리에서 오류를 방지하고 안정성을 높이는 데에 필수적이다.
멱등성
: 어떤 연산을 여러 번 수행해도 결과가 동일하게 유지되는 성질
즉, 동일한 입력에 대해 여러 번 연산을 수행해도 결과는 변하지 않는다는 것이다.
예를 들어, http 메소드 중 GET은 멱등성을 가지며, 동일한 요청을 여러 번 보내도 서버 상태나 응답값은 변하지 않는다.
반면 POST 요청은 일반적으로 멱등성을 가지지 않으며, 여러 번 데이터 요청을 보낼 경우 서버 상태에 변화가 생긴다.
멱등성은 네트워크 통신이나 데이터베이스 트랜잭션에서 중요하게 사용된다.
네트워크 장애로 인해 동일한 요청이 여러 번 서버로 전송될 수 있는데, 이때 멱등성을 보장하지 않으면 중복 처리로 인해 데이터가 잘못 수정될 수 있다.
멱등성을 보장함으로써, 시스템의 신뢰성을 높이고 예기치 않은 오류를 줄일 수 있다.
이러한 멱등성은 멱등키를 이용하여 구현하게 된다.
멱등키
: 멱등성을 유지하기 위해 사용되는 고유한 키
주로 post나 patch 같은 비멱등성 연산에서 사용된다.
클라이언트가 서버로 요청을 보낼 때 멱등키를 함께 보내면, 서버는 이 키를 통해 요청의 중복 여부를 확인하게 된다.
예를 들어 온라인 쇼핑몰 서비스에서의 결제 처리의 경우, 사용자가 결제 버튼을 여러 번 눌러도 동일한 멱등키를 사용하여 서버에 요청을 보내면 서버는 중복 결제를 방지할 수 있게 된다.
서버는 첫번째로 온 요청을 처리한 후 해당 멱등키를 기억하여, 이후에 동일한 멱등키로 들어온 요청을 무시하거나 기존에 반환했던 응답값을 반환하는 식으로 처리할 수 있다.
멱등키를 구현하는 방법
IETF(국제 인터넷 표준화 기구)에서는 헤더에 멱등키를 추가할 것을 표준으로 제안하고 있다.
Idempotency-Key: {IDEMPOTENCY_KEY}
멱등키는 주로 UUID 같은 랜덤한 값을 생성한다.
이번 강의에서는 실제로 MySQL에서 멱등키를 구현해볼 예정이라고 하셨다.
Key-Value 형태로 저장할 수 있고 속도가 훨씬 빠른 Redis 등의 메모리 캐시를 사용하는 것이 효과적이지만, 이번에는 나중에 Redis를 도입한다고 가정하고 진행하기로 했다.
멱등키 기능의 시퀀스 다이어그램이다.

클라이언트가 멱등키를 헤더에 넣어 요청하면, 서버에서는 데이터베이스를 조회해서 멱등키에 대한 응답이 이미 진행되었는지 확인한다.
만약 멱등키가 존재한다면 이미 저장되어 있는 로직의 응답값을 반환, 존재하지 않는다면 기존의 로직을 제대로 수행하고 멱등키와 응답 값 저장 후 응답 값을 반환하게 된다.
http 메소드를 공부할 때 멱등성에 대한 개념을 공부한 적은 있지만, 실제로 멱등키를 구현해보는 것은 처음이어서 매우 기대된다!