분류 전체보기 102

ESCMAScript, Proxy와 Proxy Handler

프록시 패턴은 실제 데이터에 접근할 수 있는 일종의 인터페이스(상속구조의 인터페이스가 아니다)를 만드는 디자인 패턴이다. 자바의 ORM인 JPA에서의 예를 들자면, FetchType.LAZY로 설정되어 있을 때, 어떤 엔티티 객체와 이어진 엔티티 프로퍼티는 '진짜' 객체가 아닌 임시 객체로 실제로 사용될 때 데이터베이스에서 값을 조회해 '진짜' 객체가 만들어진다. ES6의 프록시는 JPA의 프록시와는 약간 다른 특성을 가진다. ES6의 프록시는 실제 객체와 핸들러 객체를 이용해 프로퍼티가 추가, 삭제, 변경 혹은 실행 될 때 특정 함수를 실행하는 객체를 만드는 클래스다. class Person { constructor(name) { this.name = name; } } const jack = new P..

ECMAScript, 딕셔너리와 Map

많은 언어에서 쓰이는 콜렉션 중에는 Map이라는 콜렉션이 있다. Map은 Key-Value 콜렉션으로 특정 키에 대한 값을 가지는 형태다. NoSql이나 In-memory DB에서도 사용되는 아주 유용한 형태다. 아래 코드들은 모두 TypeScript에서 작성했다. 1. Dictionary ObjectES6 전까지의 자바스크립트에는 Map의 구현체가 없었다. 대신 객체 프로퍼티를 자유롭게 추가/삭제할 수 있다는 장점을 이용해 특정 프로퍼티에 값을 할당한 형태인 '딕셔너리(Dictionary)' 객체를 만들어 사용해 왔다.const dictObj = {}; dictObj['first'] = 1; dictObj['second'] = 'second'; dictObj[10] = '100'; // key인 10은..

ECMAScript, Function.prototype의 bind 함수(this 지정, 커링)

Function에 구현되어 있는 bind 함수는 두 가지 용도로 사용할 수 있다. 1) 함수의 수신자 객체 지정 (이펙티브 자바스크립트 아이템 25)this는 자바스크립트에서의 기묘한 개념 중 하나다. 흔히 접하는 언어들과 달리 자바스크립트의 Scope는 코드 블록( {}로 구분되는 )이 아닌 '객체' 단위다. 때문에 아래와 같은 이상한 현상이 발생한다.let buffer = { entries: [], add: function(s) { this.entries.push(s); } }; buffer.add(100); // 100 추가 console.log(buffer.entries); // [100] (function () { this.entries = []; let x = buffer.add; x(300)..

Typescript의 Decorator - 2. Property Decorator, 간단한 Dependency Injection

클래스의 프로퍼티에도 데코레이터를 사용할 수 있다. 먼저 예제에 사용할 간단한 클래스를 정의한다.class Car { private name: string; private price: number; private type: string; constructor(name: string, price: number) { this.name = name; this.price = price; } public toString() { return `${this.name}, ${this.type}, ${this.price}`; } } 또, 객체를 주입할 때 사용할 간단한 컨테이너를 정의하고 객체를 넣어둔다.class Container { private static map: {[key: string]: any} = {}; ..

Typescript의 Decorator - 1. Class Decorator

타입스크립트의 데코레이터는 자바에서의 어노테이션과 유사하게 메타데이터를 지정할 수 있다. 하지만 인터페이스로써 메타데이터만을 저장하는 자바와 달리 ES6의 데코레이터는 메소드나 프로퍼티를 직접 변경할 수 있다. 더 정확히 말하자면, TypeScript의 데코레이터는 파이썬의 데코레이터와 마찬가지로, 함수를 파라미터로 받는 함수를 쉽게 선언하는 일종의 Sugar Syntax다.또, 어노테이션이 붙은 모든 클래스나 메소드, 프로퍼티를 찾을 수 있는 자바 리플렉션과 달리 TypeScript의 'reflect-metadata'에는 그런 기능이 없는 것으로 보인다. Angular의 app.module.ts 파일에 컴포넌트 클래스명을 직접 입력해야 하는 이유가 이것 때문이 아닐까 하는 추측을 해본다(추측만). 몇 ..

Let's Encrypt로 인증서 발급받고 적용하기

https는 추가적인 암호화 과정이 필요해 메모리를 더 사용하고 페이지 로딩이 느려지는 경향이 있다. 그럼에도 이제 대부분의 사이트는 https를 사용한다. https에 사용되는 인증서는 SSL 인증서를 구매해야 하는데, 이전 검색해 보았을 때 COMODO의 가장 싼 인증서가 1년에 3만원이었던 것 같다. 비싼 가격은 아니지만 결제해야 된다는 것 자체가 부담스럽다. 그런 인증서를 Let's Encrypt를 통해 무료로 발급받아 사용할 수 있다. 물론 이런저런 제한과 90일마다 갱신해야한다는 귀찮은 점은 감수해야 한다. Play framework에서 Let's Encrpy로 발급받은 인증서를 적용하려면 몇 가지 과정이 필요하다. 이전 Netty 서버에 적용할때도 한참 고생했던 기억이 있다. 발급받는 곳마다..

ScalaTags, Html Element를 편하게 작성하자

Scala.JS나 Akka Http처럼 스칼라 자체에서 html을 작성해야 하는 경우에 모든 것을 텍스트로 처리하기는 곤란하다. 아무리 s"$variable" 같은 스트링 인터폴레이션이 지원된다 하더라도, 엘리먼트 안에 엘리먼트가 존재하는- hierarchy 형태라면 제대로 태그를 닫았는지도 의심스럽다. ScalaTags를 사용하면 그런 고민에서 벗어날 수 있다. 사실 너무 간단해서 한번 보면 누구나 사용할 수 있을테지만. 0. Dependency 추가, Import문 작성libraryDependencies += "com.lihaoyi" % "scalatags_2.11" % "0.6.5"import scalatags.Text.all._ScalaTags 역시 명시적으로 import문을 작성해야 한다. µP..

Scala 2017.07.11

µPickle(micro-pickle) 라이브러리를 이용한 Scala 에서의 JSON 변환

µPickle은 자바의 유명한 라이브러리 Jackson처럼 Scala의 객체를 JSON 문자열로 변환해주는 라이브러리다. 공식 홈페이지에 따르면 0.4.3 현재 Boolean, Byte, Char, Short, Int, Long, Float, Double등의 기본 자료형(당연히 String도 포함)Tuple1부터 Tuple22까지,불변 콜렉션인 Seq, List, Vector, Set, SortedSet, Option, Array, Maps,CanBuildForm으로 구현 가능한 모든 콜렉션,Duration(Scala.concurrent)과 Either(Left, Right 각 자료를 가지는),case class와 case object,sealed trait과 seald class,UUID,null 등의..

Scala 2017.07.11

Scala.js 0.6.18을 사용해 보고.

Scala.JS는 프론트엔드에서도 스칼라를 사용할 수 있게 하는 라이브러리 프로젝트다. 커피스크립트나 다트같은 것들과 마찬가지로 .scala 파일이 js 파일로 변환되는 형식이다. 공식 홈페이지에서 자랑하는 몇 가지 특징을 살펴보자면 1. Correctness 스칼라의 강력한 타입 시스템을 이용하기 때문에 JS에서의 타입 문제(Number에 +를 했을 때 String으로 변환되는 등의)를 피해갈 수 있다. 또, 친숙한 Undefined, 호이스팅 문제도 해결해준다(사실 이미 let 등으로 피해갈 수 있다). 2. Performance Scala.js는 컴파일할 때 'fast optimizing' 과정을 거치는데, 이 때 더 효율적인 JS로 최적화해준다. 생성되는 JS파일은 전체 어플리케이션 용으로 만들어..

Scala/ScalaJS 2017.06.30

sealed 키워드와 final 키워드의 차이

두 가지 키워드 모두 자바에서 클래스에 쓰는 final 키워드와 마찬가지로 더 이상 상속하지 못하게 할 때 사용한다. 하지만 sealed 키워드는 final 키워드와 달리 같은 파일에서는 상속할 수 있다. 하나의 파일에 하나의 구현(Nested Class를 제외하고)만 가능한 자바와 달리 스칼라는 그런 제한이 없기 때문에 존재하는 키워드라고 볼 수 있다. sealed class Fruit(color: String) { def printColor = println(color) } class Apple extends Fruit("Red") { def print = "Apple" }같은 파일에서의 sealed class 상속 class Banana extends Fruit("Yellow") { }다른 파일에서..

Scala 2017.06.13