본문으로 건너뛰기

보조 라이브러리 (Auxiliary Libraries)

우리는 주요 구성 요소의 종속성(dependencies)으로 여러 보조 라이브러리를 사용합니다.

우리는 JitPack을 통해 라이브러리를 배포합니다!

JitPack.io는 Git 저장소의 소스 코드를 요청 시 빌드하여 Java 라이브러리를 쉽게 공유하고 배포할 수 있게 해주는 패키지 저장소 서비스입니다.

새 버전을 게시하는 프로세스는 구성 요소 버전과 동일한 이름으로 새 태그를 생성하고 푸시하는 것으로 구성됩니다.

이 프로젝트를 사용하려면 프로젝트에 다음 저장소 선언을 추가해야 합니다.

<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>

MMO Core

MMOCore는 프로젝트의 기초적인 구성 요소로, 네트워크 엔진의 추상적인 구현을 제공하는 라이브러리입니다. 로그인 서버와 게임 서버에서 클라이언트와 데이터를 주고받는 데 사용되며, 게임 서버에서 구현해야 하는 두 가지(주요) 암호화/복호화 메서드가 있습니다. 버퍼 처리는 SelectorThread 클래스에서 수행됩니다.

우리는 입출력을 위해 비차단 멀티플렉스 단일 스레드(non-blocking multiplexed single-threaded) 아키텍처를 사용하며, 수신된 패킷을 처리하기 위해 스레드 풀을 사용합니다.

  • DrHouse
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-mmocore</artifactId>
<version>2.6.5.0</version>
</dependency>

비동기 I/O, 멀티 스레드 MMOCore이곳에서 관련 논의를 확인할 수 있습니다.

L2J Geo Driver

지오데이터 엔진(Geodata Engine)의 기본 구현체입니다.

<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-geo-driver</artifactId>
<version>2.6.5.0</version>
</dependency>

L2J Commons

로그인 서버와 게임 서버 내의 다양한 문제를 해결하는 여러 클래스가 포함된 유틸리티 라이브러리입니다.

<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-commons</artifactId>
<version>2.6.7.0</version>
</dependency>

UPnP 서비스

Universal Plug and Play (UPnP)는 로컬 네트워크의 장치가 서로를 자동으로 감지하고 통신할 수 있게 해주는 네트워크 프로토콜 집합입니다. 장치 연결 및 구성을 단순화합니다. UPnP는 라우터 뒤에 있는 장치에 원격으로 액세스할 수 있도록 하는 포트 포워딩에도 사용할 수 있습니다. UPnP를 사용하면 장치가 라우터에 포트 포워딩 규칙을 자동으로 생성하고 관리하도록 요청할 수 있으므로, 수동으로 라우터를 구성할 필요가 없습니다. 이를 통해 사용자는 광범위한 네트워크 지식이나 복잡한 설정 절차 없이도 자신의 장치에 대한 원격 액세스를 쉽게 활성화할 수 있습니다.

정보

기본적으로 활성화되어 있습니다.

커넥션 팩토리 및 커넥션 풀 (Connection Factory and Connection Pool)

L2J 서버는 순수 JDBC(Java Database Connectivity)를 사용합니다. 이는 JPA(Java Persistence API)와 같은 상위 레벨 프레임워크보다 성능을 향상시킬 수 있는데, 데이터베이스에 직접적이고 로우 레벨로 액세스하여 SQL 쿼리, 데이터 페칭 전략 및 데이터베이스 관련 기능을 세밀하게 제어하고 최적화할 수 있기 때문입니다.

L2J 서버는 커넥션 풀을 사용하여 데이터베이스 연결 풀을 관리하므로 서버가 데이터베이스 연결을 재사용하고 공유할 수 있습니다. 이는 각 요청마다 새로운 데이터베이스 연결을 설정하는 오버헤드를 줄임으로써 성능과 확장성을 높이는 데 도움이 됩니다.

기본적으로 L2J 서버는 Java 애플리케이션을 위한 고성능 JDBC 커넥션 풀 라이브러리인 HikariCP를 사용합니다. HikariCP는 가벼운 공간 점유, 낮은 지연 시간, 높은 처리량 및 자동 연결 관리 등 커넥션 풀링을 위한 대중적인 기능을 제공합니다.

Blowfish 엔진

Blowfish 알고리즘은 가변 길이 키를 사용하며 데이터 블록 단위로 작동하는 대칭 블록 암호입니다. 1993년 Bruce Schneier가 설계했으며 유연성과 보안성으로 잘 알려져 있습니다.

tryEncryptBlocktryDecryptBlock 메서드는 입력 및 출력 버퍼가 충분한 크기인지 확인하기 위해 오류 검사를 수행합니다. encryptBlockdecryptBlock 메서드는 Blowfish 알고리즘을 사용하여 데이터 블록에 대해 실제 암호화 및 복호화 작업을 수행합니다.

유틸리티 (Utils)

HexUtils

HexUtils 클래스는 데이터를 16진수 문자 표현으로 변환하고 헥스 덤프(hex dump) 생성과 같은 관련 작업을 수행하는 메서드를 제공하는 유틸리티 클래스입니다. 바이트 및 정수를 16진수 표현으로 변환하는 기능, 바이트 배열의 헥스 덤프 생성, 바이트 배열을 ASCII 문자로 변환하는 기능 등이 포함됩니다.

IPv4Filter

이 클래스는 특정 IP 주소에 대한 플러드(flood) 방지를 기반으로 연결을 허용하거나 거부하는 IPv4 필터의 구현체입니다.

Rnd

난수 생성 기능을 제공하는 클래스입니다. 지정된 RandomType에 따라 다양한 유형의 난수 생성기를 제공합니다.

사용 가능한 유형은 다음과 같습니다.

  • SECURE: 최고의 난수 품질을 위해 SecureRandom을 사용합니다.
  • UNSECURE_ATOMIC: 평균적인 난수 품질을 위해 java.util.Random을 사용합니다.
  • UNSECURE_THREAD_LOCAL: 병렬 액세스 속도를 위해 ThreadLocalRandom을 사용합니다. 각 스레드는 고유한 난수 인스턴스를 갖습니다.
  • UNSECURE_VOLATILE: 더 빠른 병렬 액세스 속도를 위해 NonAtomicRandom을 사용합니다. 두 스레드에 대해 동일한 시드(seed)를 생성할 수도 있습니다.

Util

이 클래스에는 다양한 기능을 제공하는 여러 정적(static) 메서드가 포함되어 있습니다.

Util 클래스에서 제공하는 메서드 요약:

  • isInternalHostname(String host): 호스트 이름이 사이트 로컬 주소 또는 루프백 주소인지 확인하여 내부 호스트 이름인지 검사합니다.
  • printData(byte[] data, int len): 바이트 배열의 16진수 표현을 생성합니다. 바이트 배열과 표시할 데이터 길이를 입력받아 16진수 표현을 문자열로 반환합니다.
  • printData(byte[] data): printData(byte[] data, int len)의 축약형으로, 전체 바이트 배열을 16진수 형식으로 출력합니다.
  • printData(ByteBuffer buf): ByteBuffer의 나머지 바이트를 16진수 문자열로 표현합니다.
  • generateHex(int size): 지정된 크기의 무작위 바이트 시퀀스를 생성하여 바이트 배열로 반환합니다.
  • getStackTrace(Throwable t): Throwable 객체로부터 스택 트레이스를 문자열로 가져옵니다.
  • replaceIllegalCharacters(String str): 문자열의 유효하지 않은 문자들 대부분을 언더스코어(_) 문자로 대체합니다.
  • isValidFileName(String name): 주어진 이름으로 File 객체를 생성하고 예외 없이 정규 경로를 가져올 수 있는지 확인하여 파일 이름이 유효한지 검증합니다.
  • splitWords(String input): 소문자 뒤에 대문자가 오는 경우 그 사이에 공백을 삽입하여 문자열의 단어를 분리합니다.
  • getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min): 지정된 요일, 시간, 분에서 가장 가까운 다음 또는 동일한 날짜를 계산합니다.
  • getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min): 배열 대신 DayOfWeek 객체 리스트를 허용하는 이전 메서드의 오버로드 버전입니다.
  • mapToFunction(Map<K, V> map): 맵을 함수로 변환합니다. 여기서 함수는 맵의 지정된 키와 연관된 값을 반환합니다.
  • parseArg(String[] args, String arg, boolean hasArgValue): Java 프로그램 인자에서 주어진 인자를 파싱합니다. 인자 자체 또는 지정된 경우 해당 값을 가져올 수 있습니다.
  • randomPassword(int length): 지정된 길이의 무작위 비밀번호를 생성합니다. 비밀번호는 소문자, 대문자 및 숫자의 조합을 포함합니다.