Java(169)
-
[Paper 플러그인 실전 제작기 #09] 비동기 처리와 성능 최적화: 메인 스레드 멈춤 없이 통계 조회하기
안녕하세요.지난 8편에서 GUI 메뉴를 만들었다면, 이번 9편에서는 운영 서버에서 꼭 필요한 성능 안정화 패턴을 다룹니다.이번 편 핵심은 간단합니다.느린 작업(DB 조회, 파일 IO)은 비동기로 돌리고플레이어에게 메시지를 보내는 작업은 메인 스레드로 다시 돌아와 처리하기이 패턴을 익히면 "명령어 치면 서버가 순간 멈추는 느낌"을 크게 줄일 수 있습니다.이번 편에서 만들 기능/svstats 명령어로 플레이어 통계 조회조회 작업은 비동기 처리결과 메시지는 메인 스레드에서 안전하게 전송실패/예외 상황 메시지 분리먼저 개념 정리 (초보자 기준)main thread(메인 스레드): Paper 서버의 핵심 게임 로직이 도는 스레드async(비동기): 메인 스레드와 분리된 작업 스레드에서 처리CompletableF..
2026.03.06 -
[Paper 플러그인 실전 제작기 #07] 쿨다운/제한 시스템: 스킬 재사용 대기시간 만들기
안녕하세요. 지난 6편에서는 SQLite로 랭킹/통계를 저장하고 조회하는 구조를 만들었습니다.이번 7편에서는 실전 서버 운영에서 꼭 필요한 남용 방지 로직, 즉 쿨다운(cooldown) 시스템을 구현해보겠습니다.이번 글에서 만드는 기능은 아래와 같습니다./svskill cast: 스킬 사용스킬 사용 후 15초 재사용 대기시간 적용대기 중 사용 시 남은 시간 안내관리자용 쿨다운 초기화: /svskill reset PvE/PvP 서버에서 쿨다운이 없으면 강력한 기능이 과하게 반복되어 밸런스가 무너집니다.그래서 "지금 사용 가능한가?"를 빠르게 판단하는 구조가 필수입니다.이번 편에서 완성할 결과플레이어별 마지막 사용 시각 저장남은 시간(ms) 계산 후 사용자 메시지 출력권한 기반 관리자 초기화 기능탭 자동완성..
2026.03.03 -
[Paper 플러그인 실전 제작기 #06] 데이터 저장 2: SQLite로 랭킹/통계 관리
안녕하세요. 지난 5편에서는 YAML 파일로 플레이어별 설정을 저장해봤습니다.이번 6편에서는 한 단계 확장해서, 여러 플레이어 데이터를 모아 조회하기 쉬운 구조인 SQLite를 사용해 랭킹/통계를 만들어보겠습니다.이번 글에서 만드는 기능은 아래와 같습니다.몬스터 처치 수(kills) 누적 저장플레이어별 통계 조회 (/svstat show)상위 킬 랭킹 조회 (/svrank)YAML은 1명 단위 설정 저장에 강하고, SQLite는 "여러 명 데이터 정렬/집계"에 강합니다.실전 서버에서 랭킹, 통계, 시즌 데이터를 다룰 때 SQLite를 많이 쓰는 이유가 바로 이 부분입니다.이번 편에서 완성할 결과/svstat addkill : 관리자용 킬 수 누적/svstat show [player]: 본인 또는 대상 ..
2026.03.02 -
[Paper 플러그인 실전 제작기 #05] 데이터 저장 1: YAML로 유저별 설정 저장
안녕하세요.1편에서 개발환경 세팅과 첫 플러그인 로딩,2편에서 명령어 시스템(/heal, 권한, 인자 파싱, 탭완성),3편에서 이벤트 처리,4편에서 config.yml로 기능 on/off + 메시지 커스터마이징을 다뤘다면,이번 5편에서는 실전 서버에서 바로 자주 쓰는 패턴인 유저별 데이터 저장을 만들어보겠습니다.이번 편의 핵심은 config.yml(서버 전체 설정)과 다르게,플레이어마다 다른 값을 YAML 파일로 저장/복원하는 구조를 만드는 것입니다.이번 예제에서 만들 기능은 아래 2가지입니다.플레이어별 알림 수신 여부 (notify)플레이어별 자동수리 사용 여부 (auto-repair)서버를 껐다 켜도 값이 유지되도록, 플레이어마다 UUID.yml 파일로 저장하겠습니다.이번 편 목표예제로 /pref 명..
2026.02.26 -
[Paper 플러그인 실전 제작기 #04] config.yml로 기능 on/off + 메시지 커스터마이징
안녕하세요.1편에서 개발환경 세팅과 첫 플러그인 로딩,2편에서 명령어 시스템(/heal, 권한, 인자 파싱, 탭완성),3편에서 이벤트 처리 실전을 다뤘다면,이번 4편에서는 실전 서버 운영에서 정말 자주 쓰는 기능을 만듭니다.바로 config.yml을 이용한:기능 on/off메시지 커스터마이징운영 중 설정 변경 반영(리로드)입니다.코드를 하드코딩으로만 만들면, 나중에 서버 운영할 때 작은 문구 하나 바꾸려고도 재빌드/재배포를 해야 합니다.이번 편에서 그 불편함을 줄여보겠습니다.이번 편 목표예제로 지난 편의 /heal 명령어를 확장합니다.config.yml에서 /heal 기능 자체를 켜고/끄기회복량(하트/체력) 설정값으로 관리안내 메시지(성공/권한 없음/비활성화) 커스터마이징/healreload 명령어로 설..
2026.02.25 -
[Paper 플러그인 실전 제작기 #03] 이벤트 리스너 실전 (스폰 보호구역에서 블록 설치/파괴 막기)
안녕하세요.지난 2편에서 /heal 명령어를 만들면서 명령 처리, 권한, 인자 파싱, 탭 완성을 실전으로 다뤘습니다.이번 3편에서는 Paper 플러그인에서 정말 자주 쓰는 핵심 기능인 이벤트 리스너(Event Listener) 를 실전으로 다뤄보겠습니다.이번 목표는 간단하지만 서버 운영에 바로 도움이 되는 기능입니다.스폰 주변 일정 반경을 보호구역으로 지정일반 플레이어는 보호구역에서 블록 설치/파괴 불가관리자 권한이 있으면 예외 허용차단 이유를 플레이어에게 메시지로 안내이 정도만 구현해도 "명령어 다음 단계"로 넘어가는 감각이 확실히 잡힙니다.오늘 만들 기능 요약기능명(예시): 스폰 보호구역 블록 보호기준 위치: 월드 스폰(world.getSpawnLocation())보호 반경: 10칸 (코드 상수로 시..
2026.02.23