- SqlFile : 서버 단에서 사용되는 SQL 문에 대한 함수화가 저장된 파일(json)
- EncryptionFile : 웹앱 단위로 사용되는 암호화 키값이 저장된 파일(json)
- WebHomeDir : 웹서버를 통해 제공되는 정적 파일이 저장된 디렉토리
- SessionCheckingFlags : 세션 여부에 따라 서비스 호출을 허용할 것인지를 결정하는 파일(json)
- GeoDataFile : DB 연결정보 및 공간 데이터 설정 파일(xml)
- Port : 서버가 사용하는 포트
- MainMemoryBuffersCount : 주 메모리 풀에 저장된 단위 메모리 개수
- MainMemoryBufferSize : 주 메모리에 저장된 단위 메모리 크기(단위: 바이트)
- SubMemoryBuffersCount : 보조 메모리 풀에 저장된 단위 메모리 개수
- SubMemoryBufferSize : 보조 메모리 풀에 저장된 단위 메모리 크기(단위 : 바이트)
- MyBatisConfig : MyBatis(SQL 매핑 프레임워크) 설정 파일(xml)
- ValidationCheck : DB 커넥션 객체의 유효성 검증 여부
- ValidationCheckTime : DB 커넥션 객체의 유효성 검증 여부가 true일 경우 검증을 수행할 시간 (크론 표현식)
- LogLevel : 서비스 이용 로그 레벨 수준(0: 로그 안남김 / 1: 성공/실패 여부만 남김 / 2 : 매우 자세히 남김)
- PlugIn : 서버가 제공하는 기본 서비스 이외의 특화된 서비스 모듈 설정 파일(json)
- DBRepositoryForGeocoding : 지오코딩 서비스를 제공할 때 서비스 최적화를 위한 DB 구성 여부
- AllowCORS : 서버가 CORS를 허용할지 여부
- SSL_p12 : SSL을 위한 .p12 파일 경로
- SSL_pw : SSL을 위한 .pw 파일 경로
- PG_SecretKey : PG에 대한 비밀키 문자열
- AdminEmail : 메일 전송 서비스에서 사용하는 발신자 메일 주소(현재 구글 메일만 가능)
- AdminEmailPW : 메일 전송 서비스에서 사용하는 발신자 메일의 암호
TypeScript, 익명 클래스
타입스크립트, 정확히는 JavaScript도 익명 클래스를 정의할 수 있습니다. 다음처럼요.
const x = new class<Type> {
content: Type;
constructor(value: Type) {
this.content = value;
}
say() {
console.log(this.content);
}
}("Hello World!");
x.say();
TypeScript, this 라는 타입에 관하여
타입스크립트에서는 클래스에서 사용되는 this라는 타입이 있습니다. 이 this 타입은 동적으로 현재 클래스에 대한 타입으로 결정됩니다. 애매하고 어렵죠? 예시를 통해 좀더 살펴보면..
class Box {
content: string = "";
sameAs(other: this) {
return other.content === this.content;
}
}
class DerivedBox1 extends Box {
otherContent: string = "?";
}
class DerivedBox2 extends Box {
otherContent: string = "?";
}
const base = new Box();
const derived1 = new DerivedBox1();
derived1.sameAs(base);
const derived2 = new DerivedBox2();
derived2.sameAs(base);
위의 코드에서 Box 클래스의 sameAs 인자의 other 타입이 this입니다. 이 Box 클래스를 상속받는 파생클래스들을 통해 sameAs를 사용할 경우 sameAs의 첫번째 인자인 other는 각 파생클래스의 타입이 됩니다. 즉 derived1의 sameAs 매서드의 정의는 다음과 같고…
sameAs(other: DerivedBox1): boolean
derived2의 sameAs 매서드의 정의는 다음과 같습니다.
sameAs(other: DerivedBox2): boolean
TypeScript, 같은 타입이지만 다른 타입으로 만드는 방법(Branding)
Branding은 타입스크립트 고유 문법이 아닌 응용입니다. 브랜딩을 위해서는 먼저 다음과 같은 코드가 필요합니다.
type Brand<T, B extends string> =
T & { readonly __brand: B };
위의 타입 정의를 통해 string 타입이지만 다른 용도로 정의할 수 있습니다. (브랜딩 화)
type UserId = Brand<string, "UserId">; type PostId = Brand<string, "PostId">;
즉 UserId와 PostId는 string 타입이지만 이 둘은 서로 다른 타입입니다. 만약 다음과 같은 함수가 있다면..
function getPost(userId: UserId, postId: PostId) {
// ...
}
위의 함수는 반드시 다음처럼 사용해야 합니다.
const userId = "hjkim" as UserId; const postId = "3434" as PostId; getPost(userId, postId); // ✅ // getPost(postId, userId); // ❌
참고로 Brand의 두번째 제네릭 타입 인자로 전달되는 문자열 타입이 저장되는 __brand는 타입 정보일뿐이므로 Javascript 단에서는 존재하지 않습니다.
TypeScript, Mapped Types
다음과 같은 타입이 있습니다.
type T = {
id: string;
postId: string;
}
위의 타입을 구성하는 키들은 "id" | "postId"인데, 이 키들로 구성된 타입은 다음 코드로 얻을 수 있습니다.
type KEYS = keyof T;
다음의 코드를 통해 T 타입을 구성하는 키들의 타입을 number로 변경할 수 있습니다.
type X = { [K in KEYS]: number };
// type X = { [K in "postId" | "useId"]: number };
즉, 위의 타입 결과는 다음과 같습니다.
type X = {
id: number;
postId: number;
}
Mapped Types를 이용해 각 키와 값에 대한 readonly 또는 optional로 변경할 수 있습니다.
type readonly_X = { +readonly [K in KEYS]: number };
type optional_X = { [K in KEYS]+?: number };
readonly와 ? 앞에 + 또는 -를 지정함으로써 readonly와 optioanl을 지정할지(+) 제거할지(-)를 결정할 수 있습니다. 이 +-를 지정하지 않으면 +가 지정된 것으로 판단합니다.
