스트리머 시청자 참여형 마크 서버 개발 및 기획, 운영
스트리머와 시청자가 함께 참여할 수 있는 다양한 콘텐츠를 제공하는 마인크래프트 서버를 개발한 과정
스트리머 시청자 참여 마인크래프트 서버
- 개발 기간 : 2026. 02. 06 ~ 2026. 2. 17
- 개발자 : lcmykr
- 기술 스택 : Minecraft Spigot, Java, PlaceHolderAPI etc
- 주요 기능 : 치지직 API 연동, 서버 콘텐츠(미션, 롤 증강 시스템, 엔더 드래곤 레이드 시스템 등)
- 진행 기간 : 2026. 2. 18 13:00 ~ 22:30
서론
2026년 2월, 치지직에서 리그 오브 레전드 방송을 하는 스트리머가 새해(설날) 기념, 봐주시는 시청자 분들과 함께 서버에서 진행하는 시청자 참여형 콘텐츠를 제공하기 위해 마인크래프트 서버 구축을 기획하게 되었으며, 본 스트리머와 여러 번의 얘기(상의)를 하여 콘텐츠 내용 구성을 기획하고 서버를 구축하게 되었다.
진행 일자를 2026년 2월 18일로 정하여 약 10일간의 일정을 통해 본 서버를 구축하게 되었다.
계획 과정
2026년 2월 초, 본 스트리머와 어떤 서버 콘텐츠를 기획하게 될지, 어떤 방식으로 진행하고 싶은지에 대해 상의했다.
여러 번의 상의 끝에 서버 콘텐츠는 치지직 API 연동, 주요 서버 콘텐츠는 미션 시스템, 롤 증강 시스템, 엔더 드래곤 레이드 시스템 등 으로 구성하기로 결정했다.
미션 시스템은, 참여하는 스트리머와 시청자 모두에게 미션이 마인크래프트 사이드바(Scoreboard) 에 상시적으로 표시하여 해당 전체 미션을 클리어하게 되었을 경우 보상이 지급될 수 있도록 구축하기로 했다.
롤 증강 시스템은, 리그 오브 레전드의 증강 시스템을 마인크래프트로 구현하여 서버 콘텐츠의 재미를 덧붙일 수 있도록 구축하기로 하였다.
엔더 드래곤 레이드 시스템은, 약 20명의 시청자를 포함하여 진행하기에 기본 엔더 드래곤의 체력은 200 이기에 20명이 체력 200인 드래곤을 때리기엔 너무 빨리 끝나고 재미 없을 꺼 같다고 판단하여, 대중적으로 나온 플러그인(Plugins)을 사용하여 엔더 드래곤 레이드 시스템을 구축하기로 하였다.
어떤 구조로 구현할 지에 대해 생각한 후 Todo 리스트와 구현 구조를 생각한 후 구현을 시작했다.
개발 과정
◆ 치지직 API 연동 및 시스템 구축
본격적인 개발을 진행하기 위한 첫 걸음으로 치지직 API 를 연동하는 플러그인을 제작하기로 마음 먹었다.
그 이유는 스트리머와 치지직 방송을 통해 보고 있는 시청자간의 연동 과정이기도 하고, 서버 콘텐츠를 진행하기 위한 기반이 되기도 한다.
치지직 공식 API 를 사용하여 세션 정보를 받아올 수 있도록 구축해두었다.
치지직 비공식 API 를 사용하게 될 경우에는 Websocket 등 소켓이 필요없게 되지만, 이번 콘텐츠를 진행하게 될 때에는 치지직 공식 API 를 사용하여 구축해보고 싶었다.
비공식 API 가 속도가 빠르다는 부분과 Socket 이 필요 없다는 장점이 있지만, 공식 API 를 사용하여도 데이터를 실시간으로 불러오는 중계 역할을 하는 WebSocket (Socket.IO) 도 구축되어 있었고, 혹시 모를 데이터 손실 등을 방지하기 위해 공식 API 를 사용하여 만들었다.
기본적인 connent() 가 전체적인 흐름을 해두도록 하였으며, 채널의 StreamrUID 와 token 를 사용하여 치지직 API 를 실시간으로 불러올 수 있도록 Socket.IO (중계역할) 로 연결하여 실시간으로 치지직 API 를 가져올 수 있도록, 통신할 수 있도록 구축했다.
Socket.IO 에서 message 이벤트로 JSON 형태의 데이터로 수신을 받게 되는데, handlemessage() 메서드를 type 필드로 분기하도록 했다.
1
2
3
4
5
{
"type": "DONATION",
"payAmount": 1000,
"userName": "후원자닉네임"
}
본 후원을 받게 되면 인게임 채팅 출력과 DonationEventHandler.handleDonation() 메서드를 호출하여 후원 금액에 따라 config.json 에 설정된 금액 및 기능에 따라 작동되도록 명령어를 구축해두었다.
이번 API 플러그인을 제작하게 되면서 채팅 러쉬 라는 API 효과를 만들었다.
채팅 러쉬는 정해진 시간 내에 치지직 채팅창에 특정 단어를 입력하게 되면 마인크래프트에서 해당 효과가 발동되도록 하는 것을 말한다.
1
2
3
4
5
{
"type": "CHAT",
"userName": "시청자닉네임",
"content": "채팅 내용"
}
채팅 러쉬가 활성화 되었을 때에만 작동해야만 했기에, ChatRushManager 메서드가 활성화된 경우에 특정 단어(위로, 아래로, 점프 등)를 입력하게 되었을 때 해당 효과가 작동되도록 해두었다.
1
2
3
private static final Set<String> KEYWORDS = Set.of(
"펀치", "독", "앞으로", "오른쪽", "왼쪽", "구속", "점프", "넉백", "이동"
);
사용하게 되면 HandleChatMessage() 에서 내부 처리하여 채팅을 수신받는다.
정확히 “펀치”, “독” 특정 단어를 입력하였을 때에만 적용되도록 구현했다.
“펀치 !!”, “독 줘!” 등 채팅을 입력하게 되었을 때에는 작동하지 않는다.
◆ 미션 시스템
플러그인의 구조는 이렇게 구현해두었다. 개발 언어는 Java 를 사용했으며, Server Bukkit Paper 1.21.10 버전에 맞도록 구현했다.
이 플러그인은 죽은 횟수(사망 횟수) 카운트와 미션 진행 여부를 실시간으로 사이드바(Scoreboard)에 표기하며 미션 진행에 따른 감지, GUI 시스템, 죽은 횟수 카운트 등 로직이 구현되어 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
THIS SYSTEM
├── src/main/
│ ├── java/com/
│ │ ├── deathPlugin.java ← 플러그인 진입점
│ │ ├── command/
│ │ │ └── deathCommand.java ← 전체 명령어 처리
│ │ ├── listener/
│ │ │ ├── DeathListener.java ← 사망시 사이드바 처리
│ │ │ ├── MissionListener.java ← 미션 진행
│ │ │ └── GuiListener.java ← GUI 인벤토리
│ │ └── manager/
│ │ ├── DeathManager.java ← 사망 데이터 관리
│ │ ├── MissionManager.java ← 미션 로직 핵심
│ │ ├── PlayerNameManager.java ← 닉네임 연동
│ │ ├── ScoreboardManager.java ← 사이드바 스코어보드
│ │ └── GuiManager.java ← GUI 인벤토리 생성
│ └── resources/
│ ├── plugin.yml ← 플러그인 메타정보/명령어 등록
│ └── config.yml ← 설정 파일
└── pom.xml
onEnable()에서 하는 일이 플러그인 전체의 초기화 흐름이다.
- 각 Manager 인스턴스 생성한다. (
DeathManager,MissionManager,PlayerNameManager,ScoreboardManager,GuiManager) - 각 Manager 의
loadData()메서드를 호출하여 YAML에서 데이터를 로드한다. DeathListener,MissionListener,GuiListener3개의 Listener 를 등록한다.- 명령어 4개를 하나의
DeathBoardCommand에 연결한다. ( 시청자가 사용할 수 있는 명령어는/deathboard,/deathlist,/mission,/미션현황이다.) - 반복 스케줄러 3개를 등록한다.
스케줄러 구조는 다음과 같이 구현했다.
- 2초마다 전체 온라인 플레이어의 인벤토리 보유 미션 체크 (광물, 몬스터 처치 여부, 인챈트 아이템 등 자동 감지)
- 1초마다 방문 미션 체크 (바이옴/구조물 위치 감지), 내부에서 10초 스로틀링으로 성능 최적화
- 5분마다
saveIfDirty()로 변경사항이 있을 때만 자동 저장
일반 미션과 하드 미션 으로 구성되어 있으며 일반 미션은 4개의 미션이, 하드 미션은 2개의 미션이 랜덤 배정된다.
일반 미션은 서버에 접속한 즉시 배정되도록 구현되어 있으며, 하드 미션은 서버 시간 또는 진행 시간에 따라 관리자가 활성화할 수 있도록 구축해두었다.
만약 하드 미션 진행 전까지 서버에 접속한 이력이 없을 경우에는 일반 미션과 하드 미션 모두 같이 부여된다.
일반 미션 중에서 바이옴 또는 구조물에 방문하여야만 하는 미션이 존재하는데, 방문 미션 1개와 모험 미션(몬스터 사냥, 아이템 수집 등) 3개로 하여 배정될 수 있도록 구현했다.
미션 완료를 위한 감지 로직 방식이 두 가지로 되어있다.
- 카운트 방식은 이벤트 발생 시 즉시 카운트를 올린다. ( 블록 채굴
BlockBreakEvent, 낚시PlayerFishEvent, 몹 처치EntityDeathEvent) - 인벤토리(inventory) 체크 방식은 2초마다 인벤토리를 스캔하여 아이템 보유 미션인 경우 (인챈트 아이템 미션, 아이템 보유 미션 등) 이 방식으로 주기적으로 체크한다.
- 방문 체크 방식은 1초마다 실행되는 스케쥴러가 플레이어 위치를 확인한다. 다만 10초 스로틀이 되어 있어 실제로는 최대 10초/1번 주기로 체크한다.
- 바이옴은
Biome.Key().Key(), 구조물은World.locateNearestStructure()로 80블록 이내에 이 여부를 판단한다.
- 바이옴은
하드 미션에서는 위 내용과 같이 활성화 상태여야만 작동하며, 플레이어당 2개의 하드 미션이 배정된다.
- 하드 인벤토리 미션(네더라이트 장비 등)이 완료되면 해당 아이템에
VANISHING_CURSE(소실 저주) 효과를, 방어구류는 추가로BINDING_CURSE(귀속 저주)를 부여한다.PlayerDropItemEvent에서 소실 저주 아이템은 Q키 드랍이 막히게 되어 하드 미션을 통한 플레이어간의 쌀먹은 방지하도록 막아두었다. (최대한 본인만 사용할 수 있도록)
일반 미션과 하드 미션을 리롤(reroll)할 수 있도록, 즉 미션을 재배정받을 수 있도록 구축해두었다.
Shift+F 키를 누르게 되면 GUI 가 뜨도록 구축해두었고, 미션 리롤 방식 또한 GUI 에 넣어 굳이 명령어를 사용하지 않아도 오직 GUI 를 통해서 작동할 수 있도록 구축했다.
◆ 엔더 드래곤 레이드 시스템
엔더 드래곤 레이드 시스템을 구축하기 위하여 플러그인을 직접 만들까 고민했으나, 대중으로 플러그인 나온게 있어 해당 플러그인을 사용하였다.
엔더 드래곤 레이드 시스템에 사용한 플러그인은 여기에 있는 플러그인을 사용하여 만들었으며, config.yml 등을 수정하여 제작했다.
또한 직접 만든 스크립트(Script)로 재소환되는 엔더 드래곤의 엔더 수정을 파괴하지 못하도록 하여 2페이즈 드래곤이 소환되도록 하였다.
◆ 리그 오브 레전드 증강 시스템
이 플러그인은 리그 오브 레전드의 증강 시스템을 마인크래프토로 구현한 플러그인이다.
ARAM(칼바람 나락), 아레나 등에서 사용하는 모드인데, 요즘 유행하는 리그 오브 레전드 증강을 마인크래프트 형식으로 하여 기존 롤 유저들과 본 스트리머가 재밌게 볼 수 있도록 마인크래프트로 구현해 보았다.
본 플러그인의 구조는 다음과 같이 구현되어 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
THIS SYSTEM
├── src/main/
│ ├── java/com/league/skills/
│ │ ├── LeagueSkillsPlugin.java ← 플러그인 진입점
│ │ ├── augment/
│ │ │ ├── Augment.java ← 증강 종류 관련
│ │ │ ├── AugmentTier.java ← 증강 등급 관련
│ │ │ └── AugmentManager.java ← 증강 로직
│ │ ├── command/
│ │ │ └── AugmentCommand.java ← 명령어
│ │ ├── gui/
│ │ │ └── AugmentGUI.java ← GUI 증강 선택 처리
│ │ └── listener/
│ │ └── PlayerListener.java ← 이벤트 처리
│ └── resources/
│ └── plugin.yml
증강 등급 시스템은 리그 오브 레전드와 같이 구현되어 있다.
- PRISM (프리즘) - 인챈트 책으로 표시했다. [구현된 개수 : 4개]
- GOLD (골드) - 지식의 책으로 표시했다. [구현된 개수 : 4개]
- SLIVER (실버) - 일반 책으로 표시했다. [구현된 개수 : 5개]
치지직 API 효과로 고급 버프 효과로 증강이 부여된다.
증강은 /증강 뽑기 <playername> 으로 서버(API에서 실행)에서 실행하거나 관리자가 명령어를 통해 증정할 수 있도록 구현했으며, 플레이어는 GUI를 통해 증강을 선택할 수 있도록 되어 있다.
- 증강을 뽑을 수 있도록이 되면, 마인크래프트 채팅창에 아래 이미지와 함께 표시된다.

- 가중 랜덤으로 3개를 뽑아
PendingOffer에 저장한다. - 플레이어에게 채팅 메세지를 보낸다. 이때 Adventure API 의
ClickEvent와HoverEvent를 사용하여 클릭 가능한 텍스트로 표시한다.- 플레이어가
[여기]부분에 클릭하게 되면 GUI 창으로 증강을 뽑을 수 있는 창이 표시된다. - 이미 보유 중인 증강과 상호 배제 증강을 제외한 목록을 표시한다.
- 플레이어가
- 2분(2400틱) 타임아웃 스케줄러를 등록하여, 만약 시간 내 선택하지 않으면 오퍼가 자동으로 취소된다.
증강 효과를 부여하는 방식은 2개의 방식으로 구현되어 있다.
마인크래프트의 Attribute 명령어를 사용하여 Bukkit의 AttributeInstance 와 AttributeModifier 를 추가한다. 증강 거인의 체력을 20 추가하고, 크기를 늘리는 방식과 공격 및 블록 사거리 증가, 이동 속도 및 공격 속도 변경 등의 방식이 이 명령어를 통해 작동할 수 있도록 구축했다.
각 Modifler 는 NameSpaceKey 로 플러그인 고유 키를 붙여 관리하기 때문에, 플러그인을 종료하게 되면 ClearAll() 에서 해당 키로 다시 찾아서 정확히 제거할 수 있다. 또는 해당 플레이어가 사망하게 되면 효과가 부여된 증강은 모두 사라진다.
각 증강 효과에 대해서는 전체적으로 각 다른 Attribute 를 사용하기 때문에, 세세한 내용 기재는 하지 않았다. 방식은 비슷하다.
Comments
약 10일 동안의 시간이 있었지만, 사실은 3~4일 만에 다 만들었다.
짧은 기간만에 최대한 잠을 줄여가며, 본 콘텐츠의 진행과 퀄리티를 위하여 노력을 가했다.
특히 치지직 공식 API 와 Socket.IO 를 활용한 실시간 연동 부분이 이번 프로젝트의 핵심이었는데, 비공식 API 대신 공식 API 를 선택한 덕분에 데이터 안정성 면에서는 만족스러웠다. 다만 공식 API 특성상 WebSocket 세션 관리와 토큰 갱신 처리에 신경 써야 할 부분이 있었다.
미션 시스템에서는 2초/1초/5분 주기의 스케줄러를 돌리면서도 약 20명의 동시 접속자 환경에서 서버 TPS 에 영향을 주지 않도록 스로틀링과 dirty flag 기반 저장 방식을 적용한 점이 나름 잘 설계한 부분이라고 생각한다.
채팅 러쉬 기능은 시청자들의 참여도를 크게 끌어올릴만한 API 요소가 있었지만, 방송 중 "펀치", "독" 등의 키워드가 채팅창에 쏟아질 때 인게임에서 실시간으로 반응하는 모습을 기대했지만 고급 디버프 효과가 아쉽게도 치지직 채팅 러쉬 API 가 발동되지 않아 아쉬움이 많았다.
롤 증강 시스템은 리그 오브 레전드를 즐기는 시청자층을 고려한 콘텐츠였기에 반응이 은근 좋았지만, 이 또한 고급 버프 효과의 일부 확률이기에 큰 효과는 없었다. 최대한 밸런스를 고려한 부분이였지만 가중 랜덤과 상호 배제 로직을 통해 밸런스를 맞추려 노력했다.
◆ 최종 결산
- 좋았던 점
- 사실 마인크래프트 콘텐츠 제작을 위해 본격적인 개발을 해보진 못했다. 이번 경험을 통해 더 나아지고, 플러그인 최적화 등에 노력을 가할 수 있겠다는 생각이 들었다.
- 최소 시청자 20명, 스트리머 1명 등으로 총 28명의 인원으로 참여한 콘텐츠인데, 생각보다 진행 마무리는 잘 되어 기쁘다.
- 미션 플러그인과 엔더 드래곤 레이드, 롤 증강 시스템 등 플러그인을 직접 개발하다 보니 외부 플러그인에 의존하지 않고 나만의 플러그인을 제작하는데에 큰 기여를 하여 기뻤다.
- 치지직 치즈 API 같은 경우에도 외부 플러그인에 의존하지 않고 직접
WebSocket(Socket.IO)구축된 서버와 연계하여 실시간으로, 안정적으로 불러올 수 있도록 하여 기뻤다.
- 아쉬웠던 점
- 개발 기간은 사실 3~4일 정도 남아있었다. 놀면서 개발을 미루고 미루었으나 촉박해진 시간으로 인해 테스트가 완벽하지 못했다. 실제 방송 진행 중 예상치 못한 케이스가 발생했을 때 빠르게 대응하기 어려운 부분이 있었다.
- 엔더 드래곤 레이드 시스템을 직접 구현하지 못하고 외부 플러그인에 의존한 점이 아쉬웠다.
- 커스터마이징에 한계가 있어 원하는 만큼의 연출을 구현하기 어려웠다.
- 치지직 치즈 API, 채팅 등을 통한 여러 재미 요소를 준비했으나 확률과 그에 대한 수요 예측 실패?로 제대로 이루어지지 못해서 아쉬웠다. (밸런스 문제 포함)
- 미션 조건이나 시스템을 수정하려면 리붓(reboot)을 해야 했는데, 실시간으로 수정할 수 없도록 되어 있어 아쉬웠다. 또한, config.yml 등의 리로드 체계를 구축해두었는데 플러그인 시스템이 제대로 구동되지 않아 아쉬웠다.
P.S
이번 프로젝트, 마인크래프트 서버를 운영하게 되면서 여러가지 시도를 할 수 있어 좋았고 재밌었다.
비록 짧은 진행 시간동안 여러 일이 있었지만, 부족한 점도, 좋았던 점도, 잘한 점도 있었던거 같다.
한 번의 진행으로 많은 걸 배울 수 있었고, 재밌는 경험을 할 수 있어 매우 좋았다.
나를 믿고 이 콘텐츠 제작에 맡겨준 스트리머와 재밌게 즐겨준 봐주시는 시청자분들과 플레이해주시는 시청자분들 모두 감사합니다! 🙏






