본문으로 건너뛰기

보조 라이브러리 (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가 설계했으며 유연성과 보안성으로 잘 알려져 있습니다.

tryEncryptBlock 및 tryDecryptBlock 메서드는 입력 및 출력 버퍼가 충분한 크기인지 확인하기 위해 오류 검사를 수행합니다. encryptBlock 및 decryptBlock 메서드는 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): 지정된 길이의 무작위 비밀번호를 생성합니다. 비밀번호는 소문자, 대문자 및 숫자의 조합을 포함합니다.