개인 자료란 (JE)

  서버 커뮤니티

Profile 유미랑함께할거야 대표칭호 없음
Profile

커뮤니티 소통 개발하기 플러그인

[질문] 플러그인에서 데이터 정합성 유지 방법

2025.08.10 조회 수 319 추천 수 0

안녕하세요. 플러그인 개발에 관심이 많은데 도저히 제 지식으로는 힘들어서 처음으로 글을 남겨봅니다!


대형 서버는 제가 알기로는 모드보다는 플러그인을 사용하는 것으로 알고있습니다.

마인팜 같은 서버를 종종 즐겨했었는데 게임 안에서 돈이라는 개념이 있더군요

채팅으로 명령어를 입력해서 다른 유저에게 돈을 보낼 수 있는데 여기서 의문점이 하나 들었습니다.


명령어 처리는 플러그인 코드에서 수행이 될 것인데 유저가 명령어를 입력하면 자기 자신의 돈을 차감하고 상대방에게 보내거나 혹은 반대의 순서로 진행될텐데 만약 도중에 서버가 꺼진다면 돈을 보냈는데 실제로 지불한 금액은 없다든가 이런 문제가 발생할텐데 마인크래프트 플러그인에서는 어떤 식으로 주로 해결을 하나요?


웹서버라면 db를 사용하니 트랜잭션으로 묶으면 해결이 될텐데 플러그인 서버에서는 어떻게 처리하는지 도저히 감이 안잡힙니다..

5개의 댓글

qf
2025.08.10

안녕하세요. 말씀하시는 내용을 보아 개발에 대한 식견이 있으신 것 같아 대부분의 설명은 생략하고 말씀을 드리겠습니다.

 

두가지의 상황이 존재합니다.

 

1. 소규모로 사용되는 로직 ( 동기, 플레이어 데이터 또는 로컬 스토리지에 저장)

2. 대규모 서버에서 사용되는 로직 ( 비동기, DB 사용)

 

 

World, 즉 마인크래프트에서 아이템을 주거나, 엔티티를 소환, 죽이거나 데미지를 주는 행위는 무조건 싱글스레드에서 진행되어야 합니다. 이로 인해 대부분의 모든 로직이 0.05초 주기로 call 되는 tick 에서 실행되야합니다.

 

소규모로 사용되는 로직에서는 기본적으로 이러한 아키텍처를 상술한 이유로 인해 동기적으로 처리합니다. 즉 지갑에서 금액 확인 및 제거 - 아이템 지급 의 순서가 무조건 절차적으로 진행됩니다. 이 때, Exception 이 존재할 경우에도 로직 자체가 진행중에 있었기 떄문에 어느 부분에서 Exception 이 발생하였는지에 따라 발생하는 문제가 다르겠죠.

 

 

2의 경우는 조금 더 복잡합니다. 일단 DB를 사용하기 때문에 작성자 분께서도 예측하시다시피 같은 로직으로 흘러갑니다. 이후 결과를 통해 callback 으로 다음 틱때 아이템을 주는 방법이 존재하겠죠.

 

물론 이러한 상황에서 언제나 문제가 생기기 마련이기 때문에 로그를 세세하게 작성하여 문제를 해결하기도 합니다.

 

궁금한거 있으면 댓글로 남겨주세요.

@qf

상세한 답변 감사합니다. 플레이어 자체에 데이터를 추가할 수 있다는 것은 처음 알았습니다.

 

작성자님 댓글을 읽다가 궁금한 점이 생겨서 몇가지 여쭤보겠습니다!

 

(1) 1의 경우에는 Exception이 발생하면 적절하게 예외 처리를 해주면 되지만 만약 로직을 실행다가 마크 서버가 갑자기 종료되어 버리면 Exception처리도 못할텐데 이럴 때는 어떻게 처리하는지 궁금합니다! 제 생각에는 유저의 돈을 차감시키기 전에 따로 로그 메시지를 남기거나 따로 json파일 등에 관련 정보를 저장해서 복구 시켜야 할 것 같은데 괜찮은 방법일까요?

 

(2) 이 질문은 서버 운영자 입장이긴 한데 유저 아이템을 특정 시간마다 db에 저장해놓고 나중에 다시 복원이 가능한 플러그인 즉 백업 플러그인 같은 것을 제작할 때 아무래도 대규모 서버이다 보니까 JSON이나 YAML로는 무리일 수도 있을 것 같아서 로컬 db를 활용하는 건 어떻게 생각하시는지 궁금합니다!

 

긴 글 읽어주셔서 감사하고 편안한 새벽되세요:)

qsef1256
2025.08.10
@유미랑함께할거야

(1)의 경우 보통 안전하지 않으며 그대로 데이터 손상으로 이어집니다. 그래서 대규모 서버에서는 이 방식을 사용하지 않습니다. DB는 별개의 프로그램이기 때문에 본서버가 터져도 손상된 요청을 감별 해낼 수 있습니다. 제시한 먼저 로그를 작성한다 방식의 경우에도 로그, json 출력 중에 서버가 터지면 로그 데이터가 손상된 채로 남게 됩니다. 사실 이 경우 데이터를 못 살리는 건 DB를 쓴다 해도 동일하나 손상된 데이터가 저장되는 건 막을 수 있습니다. 데이터가 아예 없으면 그냥 수동 복구 해주면 되지만 손상된 데이터가 남으면 버그를 일으킬 확률이 큽니다.

 

(2)의 경우 DB 사용이 필수에 가까운 사용 사례라고 보여집니다. (1)번 처럼 로컬 스토리지에 저장하는 방식은 데이터가 손상되어도 상관 없는 경우에 쓰는 방식이니까요.

qsef1256
2025.08.10

명령어 및 각각의 거래에 대해 로그를 남기며 상황 발생 시 로그 기록을 토대로 복구 합니다. Pay 또는 거래 기능이 1초에 수백 건 발생하지 않기 때문에 가능합니다. 플러그인은 게임이고 웹 서버와 달리 묶어서 들어가야 하는 데이터 변경의 종류가 훨씬 많기 때문에 수동 복구 가능한 몇 번의 사례를 위해 모든 시스템의 모든 데이터 변경에 트랜잭션을 적용하기에는 개발 가성비가 떨어집니다. 물론 웹 서버의 방식대로 트랜잭션을 설정할 수도 있으며 트래픽이 월등한 외국 대형 서버들은 실제로 쓸 것으로 추정됩니다.

@qsef1256

답변 감사합니다. 덕분에 어느정도 감을 잡았습니다!

뉴스 및 창작물
/files/thumbnails/528/169/004/262x150.crop.jpg?20260301145407

건축

정신병원 탈출맵을 제작중이예요 :> 2

SHALDOPlus

2026-03-01

2

/files/thumbnails/472/161/004/262x150.crop.jpg?20260208155607

나의 GPU ☠️💀 3

SHALDOPlus

2026-02-08

0

/files/thumbnails/602/157/004/262x150.crop.jpg?20260130141854

상품

《마인크래프트 대탈출 게임 만들기》 출간!

다코미

2026-01-30

0

/files/thumbnails/873/156/004/262x150.crop.jpg?20260128131439

상품

《마인크래프트 블록 완벽 가이드》 출간!

다코미

2026-01-28

0

/files/thumbnails/317/150/004/262x150.crop.jpg?20260110144415

건축

광화문 구 경기도청사(1988)

창공

2026-01-10

2