가이드

Folia 플러그인 만드는 법

2026년 10월 18일 업데이트

Folia는 월드를 리전으로 나누고 각 리전을 서로 다른 스레드에서 틱 처리하는 Paper 포크라서, 큰 서버가 많은 CPU 코어를 쓸 수 있어요. 더 이상 하나의 메인 스레드가 없기 때문에 일반적인 Bukkit 스케줄러가 작동하지 않아요. Folia 플러그인은 이 모델에 맞게 작성된 Paper 플러그인이고, 그 사실을 plugin.yml에 밝혀야 해요.

Folia에 필요한 타이밍 세부 사항이 들어간 예시예요.

Codexe로 이걸 생성하기

단계별 안내

  1. 1.Folia가 정말 필요한지 확인하기

    Folia는 월드 곳곳에 흩어진 플레이어가 많은 서버에 도움이 돼요. 대부분의 서버는 Paper를 쓰고, 인기 플러그인 중 상당수가 Folia를 지원하지 않으니 내가 쓰는 플러그인부터 확인하세요.

  2. 2.Folia API로 빌드하기

    Maven이나 Gradle 프로젝트에서 PaperMC 저장소의 내 버전용 folia-api 의존성을 provided 스코프로 쓰세요.

  3. 3.Bukkit 스케줄러 교체하기

    Bukkit.getScheduler()는 Folia에서 작동하지 않아요. 특정 위치의 작업은 리전 스케줄러, 플레이어나 몹에 대한 작업은 엔티티 스케줄러, 월드 전체 작업은 글로벌 리전 스케줄러, I/O는 비동기 스케줄러를 쓰세요.

  4. 4.자기 리전에서만 건드리기

    블록이나 엔티티는 그것을 소유한 스레드에서만 바꾸세요. teleport 대신 teleportAsync를 쓰고, 대상을 바꾸기 전에 그 대상의 리전으로 작업을 예약하세요.

  5. 5.Folia 지원 선언하기

    plugin.yml에 folia-supported: true를 추가하세요. 이게 없으면 Folia가 플러그인 로드를 거부해요.

  6. 6.Folia 서버에서 테스트하기

    컴파일이 된다는 건 코드가 Folia API로 빌드된다는 뜻이지, 스레드 안전하다는 뜻은 아니에요. 여러 플레이어가 서로 다른 곳에 있는 Folia 테스트 서버에서 실행해 보세요.

네 가지 스케줄러

스케줄러가져오는 방법쓰는 곳
리전Bukkit.getRegionScheduler()월드의 특정 위치에서 하는 작업: 블록 놓기, 스폰
엔티티entity.getScheduler()플레이어나 몹 하나에 대한 작업, 리전을 넘나들어도 따라감
글로벌 리전Bukkit.getGlobalRegionScheduler()월드 시간, 날씨, 위치와 상관없는 것
비동기Bukkit.getAsyncScheduler()데이터베이스, 파일, 웹 요청. 월드는 절대 안 됨

흔히 망가지는 부분

  • 모든 플레이어 대상 반복 작업: 접속 중인 모든 플레이어를 도는 단일 루프는 더 이상 작동하지 않아요. 대신 플레이어마다 엔티티 스케줄러에 작업을 예약하세요.
  • 텔레포트와 준비 시간: "3초 뒤 텔레포트"에는 엔티티 스케줄러와 teleportAsync가 필요해요.
  • 공유 데이터: 여러 리전에서 쓰는 맵과 카운터는 동시성 컬렉션처럼 스레드 안전해야 해요.
  • 의존성: Bukkit 스케줄러를 호출하는 라이브러리는 Folia에서 UnsupportedOperationException을 던져요.

Paper와 Folia 모두를 위한 하나의 플러그인

리전, 엔티티, 글로벌, 비동기 스케줄러는 최신 버전의 Paper API에도 들어 있어요. 그래서 이 스케줄러만 쓰고 folia-supported: true를 선언한 플러그인은 Paper와 Folia 양쪽에서 실행돼요. 모든 서버에 .jar 하나로 대응할 수 있으니 이게 가장 좋은 목표인 경우가 많아요.

Codexe로 하기

Folia 유형을 고르세요. 생성된 플러그인은 리전, 엔티티, 글로벌 리전, 비동기 스케줄러로 작업을 예약하고, folia-supported: true를 선언하고, Maven으로 Folia API에 맞춰 빌드돼요. 준비 완료 전에 컴파일하고 검사해요.

요청에 타이밍 세부 사항("접속한 플레이어마다 1분마다", "3초 뒤 텔레포트")을 적으세요. Folia 코드가 가장 많이 달라지는 부분이 바로 여기예요. 지금 체험하기는 아직 Folia 서버를 실행하지 않으니, .jar는 내 Folia 서버에서 테스트하세요.

질문

Paper 플러그인이 Folia에서 실행되나요?

Folia에 맞게 작성되고 folia-supported: true를 선언한 경우에만요. Bukkit 스케줄러를 쓰는 일반 Paper 플러그인은 거부되거나 실패해요.

Folia 플러그인이 Paper에서 실행되나요?

네, Paper에도 있는 API만 쓴다면요. 최신 Paper 버전에는 Folia 스케줄러도 포함되어 있어요.

Folia 플러그인이 스케줄러 관련 예외를 던져요

일부 코드(주로 라이브러리)가 아직 Bukkit 스케줄러를 쓰고 있어요. 프로젝트 채팅에서 리전 스케줄러나 엔티티 스케줄러로 옮겨 달라고 요청하세요.

Folia 플러그인 만들기

이 프롬프트는 바로 보낼 수 있는 상태로 열려요:

“RTP라는 Folia 1.21.4 플러그인: /rtp를 입력하면 움직이면 취소되는 3초 준비 시간 뒤에 5000블록 이내의 안전한 무작위 위치로 플레이어를 텔레포트, 엔티티 스케줄러와 teleportAsync 사용, SQLite에 저장되는 플레이어별 10분 쿨다운, folia-supported: true, 반경, 쿨다운, 메시지는 config.yml에.”

Codexe로 이걸 생성하기
Folia 플러그인 만드는 법 (리전 스케줄러) | Codexe