# 🔌 eLink 소켓 어댑터 가이드

## 📚 개요

본 가이드는 eLink 소켓 어댑터의 설정 및 사용법에 대한 상세한 정보를 제공합니다. 네트워크 통신을 위한 다양한 프로토콜 지원과 관련 설정 옵션을 포함하고 있습니다.

## 📋주요 내용

### ⚙️ Configuration (Context)
  - 🔧 Common 설정
  - 🔌 Connector, Acceptor 설정
  - 🛠 프로토콜 별 설정
  - 🔍 다양한 Filter 설정
  - 🔄 Single Session & Fail Over 설정

### 🌐 지원 프로토콜
  - FIXED_LENGTH_HEADER
  - UDP_FIXED_LENGTH_HEADER
  - FIXED_LENGTH_PAYLOAD
  - UDP_FIXED_LENGTH_PAYLOAD
  - CISCO
  - XECURE
  - INISAFE
  - EGSEED
  - CERT
  - HTTP

이 가이드를 통해 eLink 소켓 어댑터의 구성 요소와 다양한 프로토콜 지원에 대해 자세히 알아볼 수 있습니다. 각 섹션은 관련 설정과 사용 방법에 대한 구체적인 정보를 제공합니다.

⚠️ 사용 중인 eLink 버전에 따라 일부 기능이 달라질 수 있으므로, 적용 전 버전 확인을 권장합니다.


#  Configuration (Context)

소켓 어댑터의 구성 및 런타임 동작은 어댑터에 설정된 Configuration에 의해 동작한다.

**Configuration**은 크게 아래 4가지의 카테고리로 구분된다.

1.  Adapter 공통 설정 정보

2.  Connector, Acceptor (Client, Server) 설정 정보

3.  Protocol 관련 설정 정보

4.  Filter 관련 설정 정보

![image-20240812130205444](assets/eLink-SOCKET/image-20240812130205444.png)

# Common

#### adapter.group.name
- 소켓 어댑터 그룹명을 지정한다.

#### adapter.name
- 소켓 어댑터명을 지정한다.

#### Description
- 소켓 어댑터 설명

#### socket.reuse
- 값: `Y` 또는 `N`
- 기본값: `Y`
- 설명: 이전 Connection에서 사용되어진 port가 끊어진 후 TIME_WAIT 상태에 있는 경우, 이 Connection은 TIME_WAIT 상태가 해제되기 전에 사용할 수 없다. 이 port를 바로 bind 하여 사용하고 싶은 경우 이 옵션을 'Y'로 설정한다.

#### response.type
- 값: `SYNC` 또는 `ASYN`
- 기본값: `SYNC`
- 설명: 요청에 대한 응답을 줄 것인지 (SYNC), 안 줄 것인지 (ASYN)에 대한 옵션

#### permanent
- 값: `Y` 또는 `N`
- 기본값: `Y`
- 설명: 매 요청마다 Connection을 맺고 끊는 작업을 할 것인지(Non-Permanent), 아니면 맺어 놓은 Connection을 끊지 않고 계속 사용할 것인지 설정 (Permanent)

#### blocking
- 값: `Y` 또는 `N`
- 기본값: `N`
- 설명: 소켓 어댑터는 기본적으로 NIO (Non-Block I/O) 방식으로 구현되어 Event-Driven 방식으로 동작한다. 이 방식 대신 Classic Socket을 이용한 BIO (Block I/O) 방식의 Socket을 사용하고 싶다면 이 옵션을 'Y'로 설정한다. 이 방식은 FIXED_HEADER_LENGTH 프로토콜의 NON-PERMANENT 방식에서만 사용된다.

#### bound.usage
- 값: `IOBOUND`, `INBOUND`, 또는 `OUTBOUND`
- 기본값: `IOBOUND`
- 설명:
  1. `IOBOUND`: 요청을 보내기도 하고 받기도 하는 방식
  2. `INBOUND`: 요청을 받고 응답을 주는 방식, ASYN의 경우는 응답을 주지 않는다.
  3. `OUTBOUND`: 요청을 보내고, 응답을 받는 방식, ASYN의 경우는 응답을 기다리지 않는다.

#### ack.support
- 값: `Y` 또는 `N`
- 기본값: `N`
- 설명: 현재 사용되지 않는다. 메시지 교환시마다 'ACK' 메시지를 주고받는다.

#### business.work.class.code
- 업무 구분 코드

#### timeout
- 값: `[0-9]+`
- 기본값: `60` (초)
- 설명: transaction timeout, connect timeout, message read time으로 사용된다.
  1. transaction timeout: 요청을 받은 후 응답을 보낼 때까지 (transaction) 시간, 또는 요청을 보낸 후 응답을 받을 때까지의 시간 한계 값
  2. connect timeout: connection 요청 후, 맺어질 때까지의 시간 한계 값
  3. message read timeout: 한 메시지가 나누어져 올 경우, 각 부분의 interval 한계 값

#### idle.timeout
- 값: `[0-9]+`
- 기본값: `0` (초, 무한대)
- 설명: connection의 read timeout (socket timeout)

#### trace.level
- 값: `0`, `1`, `2`, 또는 `3`
- 기본값: `0` (DEFAULT)
- 설명:
  - `0`: DEFAULT – Error 상황만을 보여준다.
  - `1`: INFO - message 관련 내용은 배제하고, 주요 정보만을 보여준다.
  - `2`: DEBUG - protocol handler level의 message 단위까지 보여준다.
  - `3`: TRACE - codec 레벨 (network data chunk 레벨)의 데이터까지 보여준다.

#### sms.running.time
- 값: `[BUSINESS_DAY | ALL_WEEK],%d{HHmmss},%d{HHmmss}`
- 설명: sms 발송시간
  - `BUSINESS_DAY`: 토, 일요일을 제외한 영업일에만 적용
  - `ALL_WEEK`: 요일 관계 없이 적용
  - 구분 기호는 ','를 사용하고 시작시간 및 종료시간은 %d{HHmmss} 형태를 따른다.

# Connector, Acceptor

#### socket.type
- 값: `CLIENT` 또는 `SERVER`
- 기본값: `CLIENT`
- 설명: 소켓 어댑터 타입을 지정합니다.

#### host.name
- 설명:
    - Server Socket의 경우: Listening할 IP Address[호스트명]
    - Client Socket 유형인 경우: 연결할 Remote 서버의 IP Address(호스트명)

#### port.number
- 설명:
    - Server Socket의 경우: Listening Port
    - Client Socket 유형인 경우: 연결할 Remote 서버의 Listening Port 번호

#### local.host.name (CLIENT only)
- 설명: Client Socket Type에서만 사용되며, Client Socket의 local binding 호스트명

#### local.port.number (CLIENT only)
- 설명: Client Socket Type에서만 사용되며, Client Socket의 local binding 포트 번호

# Message Header Protocol
4개의 프로토콜은 메시지에 header 정보를 포함합니다. header 정보의 위치 및 내용은 아래 옵션에 따라 결정됩니다.

#### Protocol Type
- `FIXED_LENGTH_HEADER`
- `UDP_FIXED_LENGTH_HEADER`
- `XECURE`
- `EGSEED`  

![image-20240812130411091](assets/eLink-SOCKET/image-20240812130411091.png)

## 헤더 공통 속성
#### ll.field.type
- 값: `BIN`, `CHAR`, `NONE`
- 기본값: `BIN`
- 설명: header 정보의 타입을 나타냅니다.
1. `BIN`: payload 정보를 byte 값으로 변환하여 header를 구성합니다.
2. `CHAR`: payload 정보를 ASCII 정보로 변환하여 header를 구성합니다.
3. `NONE`: header 정보가 없습니다. Chunk 단위로 데이터를 처리합니다.

#### ll.field.offset
- 값: `[0-9]+`
- 기본값: `0`
- 설명: header 정보가 메시지의 어느 부분에서 시작하는지에 대한 정보

#### ll.field.length
- 값: `[0-9]+`
- 기본값: `2`
- 설명: header 정보의 길이 (byte)

#### ll.offset.exclude
- 값: `Y` 또는 `N`
- 기본값: `N`
- 설명: header 정보에 offset 길이를 포함할 것인지 말 것인지에 대한 정보

#### ll.field.include
- 값: `Y` 또는 `N`
- 기본값: `N`
- 설명: header 정보에 header 길이를 포함할 것인지 말 것인지에 대한 정보

#### ll.include
- 값: `Y` 또는 `N`
- 기본값: `N`
- 설명: 소켓 어댑터에서 F/W에 전달할 때, header 정보를 포함하여 전달할지 여부에 대한 정보. eLink 프레임워크에서 소켓 어댑터에 전달할 때에도, 소켓 어댑터는 이 옵션을 보고 header 정보가 포함되었는지, 아닌지를 판단합니다.


## Protocol – FIXED_PAYLOAD_LENGTH

FIXED_PAYLOAD_LENGTH 프로토콜은 메시지 내에 header 정보가 없고, payload 정보만 교환됩니다. Header 정보가 없으므로 payload 크기는 고정되어야 하며, 아래 2가지의 프로퍼티로 설정합니다.

#### send.payload.length
- 값: `[0-9]+`
- 설명: 보내는 전문의 크기 (only payload)

#### recv.payload.length
- 값: `[0-9]+`
- 설명: 받는 전문의 크기 (only payload)

## Protocol – XECURE

XECURE 프로토콜에서 사용하는 프로퍼티들은 아래와 같습니다:

#### xecure.type
- 값: `FIXED`, `BASIC`, `WELCOME`, 또는 `ENVELOPE`
- 기본값: `FIXED`
- 설명: xecure 프로토콜의 4가지 서브 프로토콜(변형)을 지정하는 프로퍼티. 4가지를 별도의 프로토콜로 이해해도 무방합니다.

#### xecure.config.path
- 설명: xecure 설정 값. Secret key file, Certificate file, Password 등의 설정 정보를 담고 있는 파일

![XECURE Config](assets/eLink-SOCKET/image-20240812130338492.png)

#### xecure.remote.cert
- 설명: xecure 통신을 하는 peer 쪽의 인증서 파일의 path

## Protocol – INISAFE

#### inisafe.config.path
- 설명: inisafe 프로토콜에서 사용하는 config 파일의 path를 설정

예시 config 파일:

```
#############################################################################
# Configuration File :
#
# File Name : .properties 파일
# 마지막 수정일자 : 2008-07-10 PKI팀
#
#############################################################################

#############################################################################
## License KEY CHECK 반드시 존재해야함 
#############################################################################
LicenseKeyPath=modules/inisafe/windows/iniplugin/license/INISAFENET.License


#############################################################################
## 실제 세션키 생성에 사용하는 알고리즘
#############################################################################
KeyGenAlg=SEED

#############################################################################
## 실제 데이터에 사용하는 암호 알고리즘
#############################################################################
#DataEncryptAlg=SEED/CBC/PKCS5Padding
DataEncryptAlg=SEED/OFB128


#############################################################################
## 세션키 암호화 알고리즘 (keyfix 에서 사용안함)
#############################################################################
SessionKeyEncryptAlg=RSA

#############################################################################
## HashAlg 을 적용함:1 , 적용하지 않음:0 (keyfix 방식일때 사용)
#############################################################################
HashOption=1

#############################################################################
## 세션키 데이터 생성에 사용하는 알고리즘 (keyfix 방식일때 사용)
#############################################################################
#HashAlg=MD5
HashAlg=SHA1

#############################################################################
# 서버 인증서 경로 지정 (keyfix 방식일때 사용 안함)
#############################################################################
ServerCertFile=modules/inisafe/windows/iniplugin/keys/initech_cert.der 


########################################Cer#####################################
# 개인키의 경로명 지정 (keyfix 방식일때 사용 안함)
#############################################################################
PrivateKeyFile=modules/inisafe/windows/iniplugin/keys/initech_priv.pk8.der.enc

PrivateKeyType=DER

#############################################################################
# 서버키의 패스워드 지정 (keyfix 방식일때 사용 안함)
#############################################################################
#패스워드 암호화 여부 (true : 패스워드 암호화. false : 패스워드 암호화하지 않음.default 값은 false)
privateKeyPasswordEnc = true
PrivateKeyPassword=LLZ9U7+lanLMxvh9pUQTztgi6vEAswsHIp03wtcVpmA=
#PrivateKeyPassword=initechtest

#############################################################################
# 인증서 경로검증 사용 여부 적용함:1 , 적용하지 않음:0 (keyfix 방식일때 사용 안함)
# 서버 인증서 임으로 Rfc3280Mode를 0으로 해서 사용하도록 함
#############################################################################

# RFC 3280 모드의 사용여부(0 - 사용안함, 1 - 사용함)
Rfc3280Mode=0
#jCertValidator 가 로드할 프로퍼티 파일 위치
CertValidatorPropertiesPath=modules/inisafe/windows/iniplugin/properties/jCertPathValidator.properties
# 정책으로 사용할 카테고리 명
Category=realPolicy

#############################################################################
####### INILOG4J 설정 
#############################################################################
# 아래와 같이 패키지명을 지정해주면 해당 패키지 이하 클래스에서 출력하는
# 로그들은 별도의 지정된 로그파일에 쌓이게 된다.
 로그레벨 설정 : OFF > FATAL > ERROR > INFO > DEBUG > ALL
inilog4j.logger.com.initech.inisafenet=OFF,stdout,rolling
# User define LoggerFactory
#inilog4j.loggerFactory=com.initech.logger.common.IniLoggerFactory

#  Console Appneder 형식 지정하기
inilog4j.appender.stdout=com.initech.common.logger.ConsoleAppender
inilog4j.appender.stdout.layout=com.initech.common.logger.PatternLayout
inilog4j.appender.stdout.layout.ConversionPattern=[%d{ABSOLUTE} %p] %c(%t:%L) -%m%n

#  DailyRolling Appneder 형식 지정하기
inilog4j.appender.rolling=com.initech.common.logger.DailyRollingFileAppender
inilog4j.appender.rolling.layout=com.initech.common.logger.PatternLayout
inilog4j.appender.rolling.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss} %6p][%c{1}:%L] %m%n

# 밑의 내용은 하루 단위로 로그 메세지를 백업받을때 백업명을 지정한다.
inilog4j.appender.rolling.DatePattern='.'yyyy-MM-dd
inilog4j.appender.rolling.Append = true
inilog4j.appender.rolling.File=modules/inisafe/windows/iniplugin/logs/INISAFENet.log

#############################################################################
#encoding, decoding option 으로 HandShake 프로토콜인 경우에 사용됨
#인코딩예값은 아래를 참조
#0000 => No Encoding
#0001 => Base64
#0010 => URL
#0011 => Base64 + URL
#############################################################################
EncodingFlag = 0000


#############################################################################
## 암호화된 IV 와 skey 를 사용할지 말지 적용함 1 : 적용하지 않음 : 0 (keyfix 전용)
#############################################################################
EncSkeyIvUse = 1


#############################################################################
#암호화되 IV 와 skey 가 저장된 파일의 passwd(keyfix 전용)
#encpw.bat로 생성
#############################################################################

EncSkeyPassword=36qE34ptX81bmsLIhumx92LtBq73ZGCLp0drBJgyThE=


#############################################################################
#암호화된 IV 와 skey가 저장된 파일의 경로 및 파일명(keyfix 전용)
#gensk.bat로 생성
#############################################################################
EncryptedSkeyPath = modules/inisafe/windows/iniplugin/keys/EncryptKey.der

```

#### inisafe.start.adapter (특정 사이트에서 업무요건으로 기능을 추가된 경우에만)
- 설명: inisafe 통신을 시작하고 handshake 작업이 끝나면, 특정 어댑터를 구동시키는 경우 사용합니다. K은행의 경우 SNA 어댑터를 구동 시켜야 하는데, 이 SNA 어댑터의 이름을 여기에 설정하면 됩니다.

#### inisafe.start.message (특정 사이트에서 업무요건으로 기능을 추가된 경우에만)
- 설명: handshake 이후에 최초 메시지를 eLink프레임워크에 전달해야 하는데, 이 최초 메시지를 여기에 설정합니다.

#### inisafe.stop.message (특정 사이트에서 업무요건으로 기능을 추가된 경우에만)
- 설명: inisafe connection이 끊기면 연관된 반대쪽 어댑터도 중지시켜야 하는 경우 설정하는 메시지 정보를 등록합니다. 이 작업을 위해 stop message를 eLink프레임워크에 전달하면 해당 어댑터를 중지시킵니다.

# Filter

## Filter - POLLING

Health check를 위해 주기적으로 polling 메시지를 보내도록 어댑터를 설정할 수 있습니다.

#### polling.use
- 값: `Y` 또는 `N`
- 기본값: `N`
- 설명: polling 기능을 사용할지 말지를 설정

#### polling.role
- 값: `SENDER` 또는 `RECEIVER`
- 기본값:
    - socket type이 client일 경우 `SENDER`
    - socket type이 server일 경우 `RECEIVER`
- 설명:
    1. `SENDER`: polling request를 보내고, polling response를 받습니다.
    2. `RECEIVER`: polling request를 받은 후, polling response를 보냅니다.

#### polling.oneway
- 값: `Y` 또는 `N`
- 기본값: `N`
- 설명:
    1. `SENDER`의 경우: polling request를 보낸 후, polling response를 기다리지 않습니다.
    2. `RECEIVER`의 경우: polling request를 받은 후, polling response를 보내지 않습니다.

#### polling.timeout (SENDER only)
- 기본값: `600` (초)
- 설명: SENDER는 이 interval마다 polling request를 보냅니다. Idle time 개념으로 마지막 메시지 (실 거래 메시지 또는 polling message) 전달 후부터 시간을 계산합니다.

#### polling.request (SENDER only)
- 기본값: `HDRREQPOLL%d{MMddHHmmss}`
- 설명: SENDER가 보내는 polling request의 포맷입니다. 날짜 데이터는 `%d{MMddHHmmss}` 형태로 나타냅니다.
- 예제: `HDRREQPOLL0805141530` (2023년 8월 5일 14시 15분 30초에 보내는 polling request)

#### polling.request.pattern (RECEIVER only)
- 기본값: `(HDR)?(REQPOLL)([0-9]{10})`
- 설명: RECEIVER가 polling request를 판별하기 위해 사용하는 전문 포맷입니다. Regular expression을 사용하여 작성합니다.
- 예제:
    - 입력: `HDRREQPOLL0805141530`
    - 매치 그룹:
        1. `HDR`
        2. `REQPOLL`
        3. `0805141530`

#### polling.replacement (RECEIVER only)
- 기본값: `$1RESPOLL$3`
- 설명: RECEIVER가 polling request를 판별한 후, polling response를 만들기 위한 전문 포맷입니다. Polling request에 대한 replacement 텍스트로 Regular expression으로 작성합니다.
- 예제:
    - 입력: `HDRREQPOLL0805141530`
    - 출력: `HDRRESPOLL0805141530`

#### polling.response.pattern (SENDER only)
- 기본값: `(HDR)?(RESPOLL)([0-9]{10})`
- 설명: SENDER가 polling response를 판별하기 위한 전문 포맷입니다. Regular expression으로 작성합니다.
- 예제:
    - 입력: `HDRRESPOLL0805141530`
    - 매치 그룹:
        1. `HDR`
        2. `RESPOLL`
        3. `0805141530`

## Filter - LIMIT

#### max.connection
- 값: `(\)?[0-9]+`
- 기본값:
    - CLIENT: `1`
    - SERVER: `""` (무한대)
- 설명:
    1. CLIENT:
        - **permanent일 경우** 서버 쪽에 동시에 맺는 connection 개수. Max connection 의미보다는 default connection 개수의 의미로 사용됨.
        - Non-permanent일 경우 요청 어댑터의 동시처리 Threads 만큼 생성될 수 있음.
    2. SERVER:
        - 클라이언트와 맺는 connection 최대 개수.
        - 이 개수 초과 시:
            - 값이 0보다 클 경우, 새로운(NEW) connection을 끊음.
            - 0보다 작을 경우, 기존 맺어진 connection 중 가장 최근에 맺어진 (YOUNGEST) connection을 끊음. (가장 최근에 맺어진 connection이 L4로부터 오는 health check connection일 가능성이 크기 때문)

#### connection.limit.per.ip (SERVER only)
- 값: `[0-9]+`
- 기본값: `0` (무한대)
- 설명:
    - SERVER에서만 사용되는 값으로, 각 IP마다 맺을 수 있는 최대 connection 개수를 설정.
    - IP당 connection이 이 값을 초과하는 경우 새로운(NEW) connection을 끊음.

## Filter - VALIDATION

#### validation.rule
- 값: `[offset, length] = (validation rule, regular expression)`
- 기본값: (없음)
- 설명:
    - 전문의 유효성을 검증하는 설정.
    - 전문에서 offset으로부터 length 만큼의 길이에 해당하는 부분을 떼어내서, Regular expression과 비교.
    - 해당 데이터가 매칭이 되지 않으면, 에러를 낸 후 해당 connection을 끊음.

## Filter - ACL

#### acl.list (SERVER only)
- 값: `(ip list, regular expression, comma-separated)`
- 기본값: (없음)
- 설명:
    - SERVER 경우에서만 사용.
    - acl.list가 설정되어 있는 경우, 새로운 connection 요청이 왔을 때 이 리스트에 없는 connection은 로그를 남기고 끊음.
    - Comma로 나누어서 여러 IP를 등록할 수 있고, * 및 regular expression으로 표현 가능.
- 예시:
    - `172.17.0.100,172.17.0.101` - 설정된 2개의 IP만을 허용.
    - `172.17.0.*` - 172.17.0.으로 시작하는 IP만을 허용.
    - `172.17.1.3[1-7]+` - 172.17.1.31 ~ 172.17.1.37 구간의 IP만을 허용.
    - `192.168.1.0/24` - 192.168.1.0 ~ 192.168.1.255 (CIDR 표기법, v4.5 이후 지원)

## Filter – BLOCK

#### block.ip.list
- 값: `(ip list, regular expression, comma-separated)`
- 기본값: (없음)
- 설명:
    - ACL과 반대로 접속을 거부할 IP 리스트를 등록.
    - IP 검증 방식은 ACL과 동일.

## Filter – L4

L4에서 health check를 위해 연결할 경우에 대한 처리를 수행.

#### l4.skip.ip.list
- 값: `(ip list, regular expression, comma-separated)`
- 기본값: (없음)
- 설명: 등록된 IP에 대한 접근은 L4로 인식하여 eLink FW으로 전달하지 않음.

## Filter – EXECUTOR (Thread Executor)

#### max.thread
- 값: `[0-9]+`
- 기본값: `10`
- 설명:
    - 각 어댑터 별로 사용할 수 있는 Worker Thread 최대 개수를 설정.
    - 런타임에 실제로 동작할 수 있는 Thread 개수는 0 ~ max.thread+10.
    - 요청이 없을 경우 Worker Thread는 한 개도 생성되지 않고, 부하가 많을 시에는 max.thread+10 개의 Worker Thread가 동작.
    - Worker Thread와는 별도로 Socket에서 데이터를 읽어서 Mina의 Codec Filter로 넘기는 IoProcessor Thread가 존재.
    - IoProcessor Thread의 개수는 (max.thread+10)/10과 CPU 개수 중 작은 값으로 설정.
## single Session & Fail Over

대외기관이 1개의 연결(connection/session)만 지원하는 경우, eLink 이중화 구성을 위해 설정합니다. 아래의 기능은 v4.5 이후에 반영된 기능이 있으므로 확인 및 기능 패치가 필요할 수 있습니다.

#### is.single.session
- 값: `Y` 또는 `N`
- 기본값: `N`
- 설명:
    - Outbound permanent Client이고, 연결되는 기관(Server Socket)이 하나의 세션만 허용하는 경우
    - 이중화 구성된 어댑터를 통한 Fail Over 연결을 지원하는 기능
    - 이중화된 eLink 인스턴스의 어댑터 중 먼저 접속된 어댑터가 접속을 유지하고, 먼저 접속된 어댑터의 연결이 끊어지거나, 해당 인스턴스(서버)가 비정상 종료되었을 경우 다른 인스턴스의 어댑터가 접속을 시도하고 연결이 이루어짐
    - (2개의 인스턴스 간 이중화 구성만 지원됨)

#### single.primary.inst
- 값: eLink server inst.Name
- 기본값: (없음)
- 설명:
    - 이중화가 구성된 서버의 primary 인스턴스 명을 설정하면, 서버 동시 기동 시에 primary 인스턴스의 어댑터가 먼저 접속되도록 함
    - 서버 인스턴스의 기동시간이 다른 경우(크게 차이나는 경우: 30초 이상)에는 먼저 기동된 인스턴스의 어댑터가 연결됨

#### single.lazystart.secs
- 값: seconds
- 기본값: `[0-9]+`
- 설명:
    - 어댑터 기동 시 primary.inst가 아닌 경우 지연되는 시간으로 primary.inst가 먼저 연결을 할 수 있도록 대기하는 시간
    - 해당 시간 안에 primary.inst가 연결을 유지하지 않는 경우에 single session은 랜덤하게 접속됨 (다른 인스턴스의 어댑터가 접속할 수 있음)

#### single.adaptercheck.url
- 값: 어댑터 상태 체크를 위한 접속 HTTP URL
- 기본값: `adapterStatus` (adapterStatus.jsp – old version은 설정 필요함)
- 설명:
    - primary.inst가 기동되어 있는 경우 어댑터가 정상적으로 START되어 있는지 확인하는 URL 정보
    - primary.inst가 정상 기동된 상태에서 어댑터를 강제로 STOP한 경우에 다른 인스턴스의 어댑터가 접속 시도를 수행할 수 있도록 함

# Protocol 별 상세 가이드

## FIXED_LENGTH_HEADER 프로토콜

#### 개요

Header(LL byte)길이가 Fixed 되어있는 프로토콜

FIXED_LENGTH_HEADER는 일반적인 Socket 접속에 사용되어지기 위해 만들어진 프로토콜이다.

![FIXED_LENGTH_HEADER 프로토콜](assets/eLink-SOCKET/image-20240812130437990.png)

#### 관련 Configuration

| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `protocol` | 프로토콜 타입 | `FIXED_LENGTH_HEADER` |
| `blocking` | 블로킹 모드 설정 | `Y` / `N` |
| `polling.use` | 폴링 사용 여부 | `Y` / `N` |
| `polling.role` | 폴링 역할 | `SENDER` / `RECEIVER` |
| `polling.oneway` | 단방향 폴링 여부 | `Y` / `N` |
| `(S)polling.timeout` | 폴링 타임아웃 (Sender) | 정수 (초) |
| `(S)polling.request` | 폴링 요청 형식 (Sender) | 문자열 |
| `(R)polling.request.pattern` | 폴링 요청 패턴 (Receiver) | 정규표현식 |
| `(R)polling.replacement` | 폴링 응답 대체 패턴 (Receiver) | 문자열 |
| `(S)polling.response.pattern` | 폴링 응답 패턴 (Sender) | 정규표현식 |
| `ll.field.type` | LL 필드 타입 | `BIN` / `CHAR` / `NONE` |
| `ll.field.length` | LL 필드 길이 | 정수 |
| `ll.field.offset` | LL 필드 오프셋 | 정수 |
| `ll.field.include` | LL 필드 포함 여부 | `Y` / `N` |
| `ll.offset.exclude` | LL 오프셋 제외 여부 | `Y` / `N` |
| `ll.include` | LL 포함 여부 | `Y` / `N` |

#### 전문예시

##### BIN 타입의 경우

| 설정 키 | 값 |
|---------|-----|
| `protocol` | `FIXED_LENGTH_HEADER` |
| `ll.field.type` | `BIN` |
| `ll.field.offset` | `0` |
| `ll.field.length` | `2` |
| `ll.field.include` | `N` |
| `ll.offset.exclude` | `N` |
| `ll.include` | `N` |

![BIN 타입 예시](assets/eLink-SOCKET/clip_image002-1723434820397.gif)

##### CHAR 타입의 경우

| 설정 키 | 값 |
|---------|-----|
| `protocol` | `FIXED_LENGTH_HEADER` |
| `ll.field.type` | `CHAR` |
| `ll.field.offset` | `0` |
| `ll.field.length` | `4` |
| `ll.field.include` | `N` |
| `ll.offset.exclude` | `N` |
| `ll.include` | `N` |

![CHAR 타입 예시](assets/eLink-SOCKET/clip_image002-1723434827775.gif)

##### CHAR 타입의 경우(내부표준전문)

| 설정 키 | 값 |
|---------|-----|
| `protocol` | `FIXED_LENGTH_HEADER` |
| `ll.field.type` | `CHAR` |
| `ll.field.offset` | `4` |
| `ll.field.length` | `9` |
| `ll.field.include` | `Y` |
| `ll.offset.exclude` | `N` |
| `ll.include` | `Y` |

![CHAR 타입 내부표준전문 예시](assets/eLink-SOCKET/clip_image002-1723434833752.gif)

## UDP_FIXED_LENGTH_HEADER 프로토콜
#### 개요
UDP 통신을 한다는 점 말고는 FIXED_LENGTH_HEADER 프로토콜과 같다.
Polling 관련 작업을 UDP 특성상 할 필요가 없으므로, 이에 관련된 설정은 필요 없다.

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `protocol` | 프로토콜 타입 | `UDP_FIXED_LENGTH_HEADER` |
| `blocking` | 블로킹 모드 설정 | `Y` / `N` |
| `ll.field.type` | LL 필드 타입 | `BIN` / `CHAR` / `NONE` |
| `ll.field.length` | LL 필드 길이 | 정수 |
| `ll.field.offset` | LL 필드 오프셋 | 정수 |
| `ll.field.include` | LL 필드 포함 여부 | `Y` / `N` |
| `ll.offset.exclude` | LL 오프셋 제외 여부 | `Y` / `N` |
| `ll.include` | LL 포함 여부 | `Y` / `N` |

## FIXED_LENGTH_PAYLOAD 프로토콜
#### 개요
PayLoad길이를 알수 있는 Header가 존재 하지 않는 프로토콜이다.
PayLoad 길이가 고정되어있는 프로토콜이다.

![FIXED_LENGTH_PAYLOAD 프로토콜](assets/eLink-SOCKET/clip_image002-1723434844828.gif)

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `Protocol` | 프로토콜 타입 | `FIXED_LENGTH_PAYLOAD` |
| `send.payload.length` | 송신 페이로드 길이 | 정수 |
| `recv.payload.length` | 수신 페이로드 길이 | 정수 |

#### 전문예시
##### 송수신 길이가 다른 경우
| 설정 키 | 값 |
|---------|-----|
| `protocol` | `FIXED_LENGTH_HEADER` |
| `send.payload.length` | `16` |
| `recv.payload.length` | `32` |

![송수신 길이가 다른 경우 예시](assets/eLink-SOCKET/clip_image002-1723434853800.gif)

## UDP_FIXED_LENGTH_PAYLOAD 프로토콜

#### 개요
UDP 통신을 한다는 점을 제외하고는 FIXED_LENGTH_PAYLOAD 프로토콜과 같다.
Polling 관련 작업을 UDP 특성상 할 필요가 없으므로, 이에 관련된 설정은 필요 없다.

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `protocol` | 프로토콜 타입 | `UDP_FIXED_LENGTH_HEADER` |
| `blocking` | 블로킹 모드 설정 | `Y` / `N` |
| `ll.field.type` | LL 필드 타입 | `BIN` / `CHAR` / `NONE` |
| `ll.field.length` | LL 필드 길이 | 정수 |
| `ll.field.offset` | LL 필드 오프셋 | 정수 |
| `ll.field.include` | LL 필드 포함 여부 | `Y` / `N` |
| `ll.offset.exclude` | LL 오프셋 제외 여부 | `Y` / `N` |
| `ll.include` | LL 포함 여부 | `Y` / `N` |

## CISCO 프로토콜

#### 개요
시스코 라우터의 IOS는 X.25 Host에서 전송되는 X.25 패킷을 TCP로 전환하여 TCP패킷으로 변환해주거나 혹은 그 반대로 전환해주는 TCP to X.25 변환 기능을 제공한다.

![img](assets/eLink-SOCKET/clip_image001.gif)

두 호스트 간에 전송되는 X.25 패킷의 크기가 1024 Bytes (1KB)가 넘을 경우 More-Bit 로 표시되는 X.25 패킷의 boundary 정보를 적절히 교환하지 못하게 되어 TCP Connection이 단절되는 등 통신상의 문제가 발생한다.

CISCO Router를 통해 데이터를 전송할 때에는 뒤에 설명할 RBP Header 정보를 이용하여 1KB 이하의 패킷으로 나누어 보내는 방법이 필요하다.

#### 전문 헤더 - RBP (Record Boundary Preservation) Header
IP Translation의 문제를 보완하기 위해 라우터와 TCP 호스트간에 X.25 패킷의 boundary 정보를 교환하기 위한 프로토콜로서 IP Translation 기능과 유사한 기능을 제공하는 대체 기능이다.

X.25 호스트에서 전송되는 X.25 패킷의 More-Bit를 적절히 처리하기 위해서 TCP Host의 통신 어플리케이션은 이 RBP 프로토콜을 지원하도록 프로그램 되어야 한다.

![image-20240812125616338](assets/eLink-SOCKET/image-20240812125616338.png)

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `protocol` | 프로토콜 타입 | `CISCO` |

####  전문 예시
##### Payload가 1KB 보다 작은 경우 (Payload Size = 5 Bytes)
전문의 크기가 1024 Bytes (1KB) 보다 작기 때문에 하나의 패킷으로 데이터의 송수신이 이루어진다

![image-20240812130822525](assets/eLink-SOCKET/image-20240812130822525.png)

##### Payload가 1KB 보다 큰 경우 (Payload Size = 1029 Bytes)
전문의 크기가 1029 Bytes 인 경우 1024 Bytes (1KB) 가 넘기 때문에, 아래와 같이 1024B + 5B 로 나누어 전송한다.

![image-20240812130806675](assets/eLink-SOCKET/image-20240812130806675.png)

## XECURE 프로토콜

#### 개요
Softforum 제품인 XecureConnect 를 쓰는 암호화 프로토콜이다.
암호화 방식에는 크게 HandShake 방식과 Envelope 방식 2가지가 있다.
HandShake 에는 FIXED 방식 과 WELCOME방식으로 나뉜다.

![XecureConnect FIXED,BASIC,ENVELOPE 방식](assets/eLink-SOCKET/clip_image002-1723434992034.gif)

![XecureConnect WELCOME방식](assets/eLink-SOCKET/clip_image002-1723434996272.gif)

![XecureConnect 방식](assets/eLink-SOCKET/clip_image002-1723435043700.gif)

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `protocol` | 프로토콜 타입 | `XECURE` |
| `ll.field.type` | LL 필드 타입 | `BIN` / `CHAR` |
| `ll.field.length` | LL 필드 길이 | 정수 |
| `ll.field.offset` | LL 필드 오프셋 | 정수 |
| `ll.field.include` | LL 필드 포함 여부 | `Y` / `N` |
| `ll.offset.exclude` | LL 오프셋 제외 여부 | `Y` / `N` |
| `ll.include` | LL 포함 여부 | `Y` / `N` |
| `xecure.type` | Xecure 타입 | `BASIC` / `FIXED` / `WELCOME` / `ENVELOPE` |
| `xecure.config.path` | Xecure 설정 파일 경로 | 문자열 |
| `xecure.remote.cert` | 원격 인증서 | 문자열 |

#### 전문예시
##### BASIC 타입의 경우
| 설정 키 | 값 |
|---------|-----|
| `protocol` | `XECURE` |
| `xecure.type` | `BASIC` |
| `xecure.config.path` | `/fsapp/eai/softforum/xc30/conf/xc_conf.txt` |
| `xecure.remote.cert` | |

![BASIC 타입 예시1](assets/eLink-SOCKET/clip_image002-1723435053289.gif)

![BASIC 타입 예시2](assets/eLink-SOCKET/clip_image002-1723435061946.gif)

![BASIC 타입 예시3](assets/eLink-SOCKET/clip_image002-1723435066504.gif)

![BASIC 타입 예시4](assets/eLink-SOCKET/clip_image002-1723435072124.gif)

##### FIXED 타입의 경우
| 설정 키 | 값 |
|---------|-----|
| `protocol` | `XECURE` |
| `xecure.type` | `FIXED` |
| `ll.field.type` | `CHAR` |
| `ll.field.offset` | `0` |
| `ll.field.length` | `7` |
| `ll.field.include` | `N` |
| `ll.offset.exclude` | `N` |
| `ll.include` | `Y` |
| `xecure.config.path` | `/fsapp/eai/softforum/xc30/conf/xc_conf.txt` |
| `xecure.remote.cert` | |

![FIXED 타입 예시1](assets/eLink-SOCKET/clip_image002-1723435083181.gif)

![FIXED 타입 예시2](assets/eLink-SOCKET/clip_image002-1723435087405.gif)

![FIXED 타입 예시3](assets/eLink-SOCKET/clip_image002-1723435093170.gif)

![FIXED 타입 예시4](assets/eLink-SOCKET/clip_image002-1723435097217.gif)

##### WELCOME 타입의 경우
| 설정 키 | 값 |
|---------|-----|
| `protocol` | `XECURE` |
| `xecure.type` | `WELCOME` |
| `xecure.config.path` | `/fsapp/eai/softforum/xc30/conf/xc_conf.txt` |
| `xecure.remote.cert` | |

![WELCOME 타입 예시1](assets/eLink-SOCKET/clip_image002-1723435106326.gif)

![WELCOME 타입 예시2](assets/eLink-SOCKET/clip_image002-1723435133176.gif)

![WELCOME 타입 예시3](assets/eLink-SOCKET/clip_image004.gif)

![WELCOME 타입 예시4](assets/eLink-SOCKET/clip_image006.gif)

![WELCOME 타입 예시5](assets/eLink-SOCKET/clip_image008.gif)

##### ENVELOPE 타입의 경우
| 설정 키 | 값 |
|---------|-----|
| `protocol` | `XECURE` |
| `ll.field.type` | `ENVELOPE` |
| `ll.field.offset` | `0` |
| `ll.field.length` | `7` |
| `ll.field.include` | `N` |
| `ll.offset.exclude` | `N` |
| `ll.include` | `Y` |
| `xecure.config.path` | `/fsapp/eai/softforum/xc30/conf/xc_conf.txt` |
| `xecure.remote.cert` | `daum/local_signCert.der` |

![ENVELOPE 타입 예시1](assets/eLink-SOCKET/clip_image002-1723435181028.gif)

![ENVELOPE 타입 예시2](assets/eLink-SOCKET/clip_image004-1723435181028.gif)

![ENVELOPE 타입 예시3](assets/eLink-SOCKET/clip_image006-1723435181028.gif)

![ENVELOPE 타입 예시4](assets/eLink-SOCKET/clip_image008-1723435181028.gif)

## INISAFE 프로토콜

#### 개요
신한국은행망을 위해서 만든 프로토콜이다. HandShake 후에 거래 데이터를 암복호화 한다. Server와 Client를 같이 셋팅 해야 된다. 신한국은행에서 Server로 접속을 하면 신한국은행으로 접속을 시도한다. 접속성공시 Framework으로 특정한 데이터를 던진다. 접속단절시 Framework으로 특정한 데이터를 던진다.

![INISAFE 프로토콜 개요1](assets/eLink-SOCKET/clip_image002-1723435217517.gif)

![INISAFE 프로토콜 개요2](assets/eLink-SOCKET/clip_image002-1723435221148.gif)

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `protocol` | 프로토콜 타입 | `INISAFE` |
| `inisafe.config.path` | INISAFE 설정 파일 경로 | 문자열 |
| `inisafe.related.adapter.groups` | 관련 어댑터 그룹 | 문자열 |
| `inisafe.start.message` | 시작 메시지 | 문자열 |
| `inisafe.stop.message` | 종료 메시지 | 문자열 |

#### 전문예시
##### INISAFE의 경우
| 설정 키 | 값 |
|---------|-----|
| `protocol` | `INISAFE` |
| `inisafe.config.path` | `/fsapp/eai/initech/inisafe/properties/INISAFENet.properties` |
| `inisafe.related.adapter.groups` | `_KGB_IN_SNA_AsR,_KGB_OU_SNA_AsC` |
| `inisafe.start.message` | `00000EAI000005BOK0000%d{yyyyMMdd} 000000000000000000000000%d{yyyyMMddHHmmss}0000000000000000000010511016N001 id12345678901234pass123456789012` |
| `inisafe.stop.message` | `00000EAI999999BOK0000%d{yyyyMMdd} 000000000000000000000000%d{yyyyMMddHHmmss}0000000000000000000010511016N001 id12345678901234pass123456789012` |

![INISAFE 예시1](assets/eLink-SOCKET/clip_image002-1723435262032.gif)

![INISAFE 예시2](assets/eLink-SOCKET/clip_image004-1723435262032.gif)

![INISAFE 예시3](assets/eLink-SOCKET/clip_image006-1723435262032.gif)

![INISAFE 예시4](assets/eLink-SOCKET/clip_image008-1723435262032.gif)

![INISAFE 예시5](assets/eLink-SOCKET/clip_image010.gif)

![INISAFE 예시6](assets/eLink-SOCKET/clip_image012.gif)

![INISAFE 예시7](assets/eLink-SOCKET/clip_image014.gif)

네, 제공하신 내용을 정리하겠습니다.

## EGSEED 프로토콜

#### 개요
이지론 대출을 위한 프로토콜입니다. SEED 암호화를 사용하고 암호키는 배포된 jar에 설정되어 있습니다. Server 모드만 있으며, 암호화된 데이터를 복호화하여 eLink 프레임워크로 보내고 응답을 보낼 때는 평문을 제공합니다.

![EGSEED 프로토콜 개요1](assets/eLink-SOCKET/clip_image002-1723435269903.gif)

![EGSEED 프로토콜 개요2](assets/eLink-SOCKET/clip_image004-1723435269903.gif)

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `protocol` | 프로토콜 타입 | `EGSEED` |
| `ll.field.type` | LL 필드 타입 | `BIN` / `CHAR` |
| `ll.field.length` | LL 필드 길이 | 정수 |
| `ll.field.offset` | LL 필드 오프셋 | 정수 |
| `ll.field.include` | LL 필드 포함 여부 | `Y` / `N` |
| `ll.offset.exclude` | LL 오프셋 제외 여부 | `Y` / `N` |
| `ll.include` | LL 포함 여부 | `Y` / `N` |

#### 전문예시
##### EGSEED의 경우
| 설정 키 | 값 |
|---------|-----|
| `protocol` | `EGSEED` |
| `ll.field.type` | `CHAR` |
| `ll.field.offset` | `0` |
| `ll.field.length` | `4` |
| `ll.field.include` | `N` |
| `ll.offset.exclude` | `N` |
| `ll.include` | `N` |

![EGSEED 예시1](assets/eLink-SOCKET/clip_image002-1723435279857.gif)

![EGSEED 예시2](assets/eLink-SOCKET/clip_image004-1723435279857.gif)

## CERT 프로토콜

#### 개요
대내 비신뢰 구간에 사용되는 프로토콜입니다. 현재는 사용되지 않습니다.

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값 |
|---------|------|-----------|
| `protocol` | 프로토콜 타입 | `CERT` |

## HTTP 프로토콜

#### 개요
Socket Adapter 정보를 모니터링하기 위한 프로토콜입니다.

#### 관련 Configuration
| 설정 키 | 설명 | 가능한 값  |
|---------|------|--------|
| `protocol` | 프로토콜 타입 | `HTTP` |
