Typescript에서 인터페이스의 구현과 객체 리터럴(Object Literal) 할당

타입스크립트에서 인터페이스에는 미묘한 점이 존재합니다. 먼저 다음과 같은 인터페이스가 존재합니다.

interface Dip2K {
    action(): void
}

클래스로 구현해 보면 다음과 같습니다.

class Dip2KImpl implements Dip2K {
    alias: string = 'GISDEVELOPER'
    action() { console.log('인간은 행위로 정의된다.') }
}

새로운 구성요소로써 alias가 추가되었습니다. 네, 충분히 이해할 수 있습니다.

이제 객체 리터럴로 할당해 보겠습니다. 먼저 여기서 타입스크립트의 인터페이스에 대한 가장 핵심적인 목표는 ‘타입검사’라는 점을 떠올리셔야 합니다.

const Dip2KObj: Dip2K = {
    alias: 'GISDEVELOPER',
    action() { console.log('인간은 행위로 정의된다.') }
}

에러가 납니다. 에러 내용은 Object literal may only specify known properties, and ‘alias’ does not exist in type ‘Dip2K’ 입니다. 즉 인터페이스에는 없는 alias라는 속성은 지정할 수 없음을 나타냅니다. 타입스크립트의 인터페이스에 대한 가장 핵심적인 목표는 ‘타입검사’를 통과하지 못했기 때문입니다.

다음은 어떨까요?

class Dip2KDuck {
    alias: string = 'GISDEVELOPER'
    action() { console.log('인간은 행위로 정의된다.') }    
}

const Dip2KObj2: Dip2K = new Dip2KDuck()

가능할까요?

문제가 없습니다. 분명 서로 타입 이름이 다르므로 ‘타입검사’를 통과하지 못한 것으로 보이지만 ‘타입검사’를 통과합니다. 이유는 타입스크립트의 타입검사는 덕타이핑(Duck Typing) 방식이라는데 있습니다. 즉, 타입의 이름이 달라도 그 구성(필드, 매서드)가 같다면 동일 타입으로 본다는데 있습니다. 그럼 앞서 봤던 객체 리터럴은요? 객체 리터럴은 타입이 아닌 객체입니다. 그래서 ‘타입검사’를 통과하지 못하는 것입니다. 애매하죠? 사실 타입스크립트는 이해하기 매우 어려운 언어 중에 하나 입니다.

그럼 객체 리터럴에 대한 할당까지도 에러없이 처리하기 위해서는 어떻게 해야할까요? 다음처럼 인덱스 시그니쳐를 인터페이스의 선언에 추가하면 됩니다.

interface Dip2K {
    action(): void
    [prop:string]: any // 인덱스 시그니쳐
}

쌩뚱 맞은 인덱스 시그니쳐를 추가하는 것에 대해 불편함을 느낄 수 밖에 없는데요. 원래의 인터페이스에 인덱스 시그니쳐를 추가하지 않고도 좀더 나은 방식은 다음과 같습니다.

const Dip2KObj: Dip2K = <Dip2K>{
    alias: 'GISDEVELOPER',
    action() { console.log('인간은 행위로 정의된다.') }
}

프론트엔드 웹 페이지 JavaScript 개발 환경 만들기

기본 설정

# Node.js 설치

npm 명령 실행을 위함

# npm init -y

npm init는 package.json을 만들기 위한 명령이고 -y를 붙임으로써 별도의 입력 없이 기본 값으로 진행 시킴. package.json은 작성하고자 하는 프로젝트에 대한 설정 파일로 볼 수 있으며, 프로젝트 이름과 버전 등과 같은 설명과 프로젝트가 사용하는 라이브러리에 대한 정보 그리고 프로젝트 실행 등을 위한 명령에 대한 정보가 담겨있음. package.json 파일은 npm을 위한 파일임(VS.Code를 위한 것이 아님)

# npm install webpack webpack-cli --save-dev

# webpack.config.js 파일 생성 및 내용 작성

const path = require("path");
module.exports = {
    mode: "development",
    entry: "./src/index.js",
    devtool: "inline-source-map",
    module: {
        rules: [],
    },
    resolve: {
        extensions: [".js"],
    },
    output: {
        filename: "bundle.js",
        path: path.resolve(__dirname, "dist"),
    },
}

# src, dist 폴더 및 index.html(dist 폴더), index.js(src 폴더) 파일 생성

# index.html 코드 입력

...

<script src="bundle.js"></script> 

...

# index.js 코드 입력

console.log("Hello");

# package.json 파일의 “scripts” 파트에 “bundle”: “webpack” 입력

{
  ..
  "scripts": {
    ..
    "bundle": "webpack"
  },
  ..
}

# npm run bundle 실행

Typescript로 작성된 파일을 Javascript 파일로 트랜스파일링 시킴

자동 실행을 위한 설정

# package.json 파일의 “scripts” 파트에 “watch”: “webpack –watch” 및 “start”: “npm run bundle && npm run watch” 추가

{
  ..
  "scripts": {
    ..
    "bundle": "webpack",
    "watch": "webpack --watch",
    "start": "npm run bundle && npm run watch"
  },
  ..
}

# VS.Code에서 Live Server 확장 기능 설치

# npm run start 실행

이제부터 모든 Javascript 소스 코드들을 자동으로 bundle.js 파일 하나로 묶어줌

# index.html 열고 GO LIVE 활성화

IT 기술의 활용 정도를 평가할 수 있는 지표 사이트

지금 자신이 사용하는, 학습하는 IT 기술이 시장에서 얼마나 많이 사용되고 있는지를 평가할 수 있는 사이트입니다.

먼저 Python입니다. AI 관련 프로젝트에서 가장 많이 사용되는 언어인데.. 그 추세가 심상치 않습니다.

다음은 개인적으로.. 미래의 서버 개발을 위해 가장 많이 사용될거라 생각하는 Express입니다.

그리고 요즘 제가 가장 많이 접하고 있는 웹 기반의 3D 기술인 three.js 라이브러리입니다. three.js에 대한 재미있는 점은 three.js가 미국 다음으로 한국에서 가장 많이 사용된다는 것입니다.

여러분들도 자신이 관심이 있는 기술의 트랜드를 한번 확인해 보시면 미래에 대한 자신의 준비를 좀더 합리적으로 대응할 수 있을거라 생각됩니다.

보다 사실적인 3차원 시각화를 위한 후처리(Postprocessing)

웹에서 3차원 시각화에 대한 개발 문의가 있어 이와 연관된 모델을 시각화하는 예제를 간단히 만들어 보았고.. 아래의 영상은 그에 대한 결과입니다. 모델 데이터를 3차원으로 시각화하는 것은 상대적으로 복잡하지 않은데.. 이렇게 시각화된 장면을 보다 멋지게 표현되도록 다양한 효과를 적용할 필요가 있습니다. 아래의 화면은 먼저 모델을 시각화하고 몇가지 후처리를 통해 더욱 멋지게 보이도록 하였습니다.

아래는 다이아몬드에 대한 반짝거리는 효과를 중점적으로 적용한 영상입니다.

추가적으로 보석과 함께 금괴도 표현해본 영상입니다.