기록
article thumbnail
728x90

출처 : YES24

독서진행 : 102-119p (종이책)

 

오늘의 메모


- 자바스크립트 언어는 간단하고 평이하다. 다른 언어에서는 네임스페이스나 모듈 패키지, 비공개 프로퍼티, 스태틱 멤버 등의 기능이 익숙하고 당연할지 몰라도, 자바스크립트에는 이런 것들을 위한 별도의 문법이 거의 없다.
- 네임스페이스 패턴, 의존 관계 선언, 모듈 패턴, 샌드박스 패턴 등은 애플리케이션 코드를 정리하고 구조화할 수 있게 도와주고 암묵적 전역의 영향력을 약화시킨다. 
- 네임스페이스는 프로그램에서 필요로 하는 전역 변수의 개수를 줄이는 동시에 과도한 접두어를 사용하지 않고도 이름이 겹치지 않게 해 준다. 자바스크립트의 언어 문법에 내장되어 있지는 않지만, 네임스페이스는 꽤 쉽게 구현할 수 있는 기능이다. 수많은 함수, 객체, 변수들로 전역 유효범위를 어지럽히는 대신, 애플리케이션이나 라이브러리를 위한 전역 객체를 하나 만들고(단 하나만 만드는 것이 이상적이다.) 모든 기능을 이 객체에 추가하면 된다.
- 전역 네임페이스 객체의 이름은 애플리케이션 이름이나 라이브러리의 이름, 도메인명, 회사 이름 중에서 선택할 수도 있다. 흔히 코드를 읽는 사람 눈에 띄도록 전역 객체 이름은 모두 대문자로 쓰는 명명 규칙을 사용하기도 한다.
- 프로그램의 복잡도가 증가하고 코드의 각 부분들이 별개의 파일로 분리되어 선택적으로 문서에 포함하게 되면, 어떤 코드가 특정 네임스페이스나 그 내부의 프로퍼티를 처음으로 정의한다고 가정하기 위험하다. 네임스페이스에 추가하려는 프로퍼티가 이미 존재할 수도 있고 따라서 내용을 덮어쓰게 될지도 모른다. 그러므로 네임스페이스를 생산하거나 프로퍼티를 추가하기 전에 먼저 이미 존재하는지 여부를 확인하는 것이 최선이다.
- 자바스크립트 라이브러리들은 대개 네임스페이스를 지정하여 모듈화되어 있기 때문에, 필요한 모듈만 골라서 쓸 수 있다. 함수나 모듈 내 최상단에, 의존 관계에 있는 모듈을 선언하는 것이 좋다. 즉 지역 변수를 만들어 원하는 모듈을 가리키도록 선언하는 것이다.
- 의존 관계가 명시적으로 선언되어 있기 때문에 코드를 사용하는 사람이 페이지 내에 반드시 포함시켜야 하는 스크립트 파일이 무엇인지 알 수 있다. 함수의 첫머리에 의존 관계가 선언되기 때문에 의존 관계를 찾아내고 이해하기 쉽다. 의존 관계 선언 패턴을 잘 지키면 함수 안에서 전역 객체 판별을 단 한 번만 수행하고, 이다음부터는 지역 변수를 사용하기 때문에 훨씬 빠르다.
 - 자바 등 다른 언어와는 달리 자바스크립트에는 private, protected, pulbic 프로퍼티와 메서드를 나타내는 별도의 문법이 없다. 객체의 모든 멤버는 public, 즉 공개되어 있다.
- 비공개 멤버에 대한 별도의 문법은 없지만 클로저를 사용해서 구현할 수 있다. 생성자 함수 안에서 클로저를 만들면, 클로저 유효범위 안의 변수는 생성자 함수 외부에 노출되지 않지만 객체의 공개 메서드 안에서는 쓸 수 있다. 즉 생성자에서 객체를 반환할 때 객체의 메서드를 정의하면, 이 메서드 안에서는 비공개 변수에 접근할 수 있는 것이다.
- 특권 메서드라는 개념은 특정한 문법과는 관련이 없다. 단지 비공개 멤버에 접근권한을 가진 (즉 일종의 특권을 부여받은) 공개 메서드를 가리키는 이름일 뿐이다.
- 비공개로 유지해야 하는 객체나 배열에 대한 참조를 전달할 때 주의를 기울이는 수밖에 없다. 아예 새로운 객체를 만들어 사용자에게 쓸모있을 만한 데이터 일부만 담아 반환하는 것이다. 이것을 '최소 권한의 원칙(Principle of Least Authority, POLA)이라고도 한다. 필요 이상으로 권한을 주지 말아야 한다는 뜻이다. 모든 데이터를 넘겨야 한다면, 객체를 복사하는 범용 함수를 사용하여 specs 객체의 복사본을 만드는 것도 방법이 될 수 있다.
- 생성자를 사용하여 비공개 멤버를 만들 경우, 생성자를 호출하여 새로운 객체를 만들 때마다 비공개 멤버가 매번 재성성된다는 단점이 있다. 사실 생성자 내부에서 this에 멤버를 추가하면 항상 이런 문제가 발생한다. 이러한 중복을 없애고 메모리를 절약하려면 공통 프로퍼티와 메서드를 생성자의 prototype 프로퍼티에 추가해야 한다. 이렇게 하면 동일한 생성자로 생성한 모든 인스턴스가 공통된 부분을 공유하게 된다.
감춰진 비공개 멤버들도 모든 인스턴스가 함께 쓸 수 있다.
- 노출 패턴은 비공개 메서드를 구현하면서 동시에 공개 메서드로도 노출하는 것을 말한다. 객체의 모든 기능이 객체가 수행하는 작업에 필수불가결한 것들이라서 최대한의 보호가 필요한데, 동시에 이 기능들의 유용성 때문에 공개적인 접근도 허용하고 싶은 경우가 있을 수 있다. 노출 패턴은 이러한 경우에 유용하게 쓸 수 있다.
- 모듈 패턴은 늘어나는 코드를 구조화하고 정리하는 데 도움이 되기 때문에 널리 쓰인다. 다른 언어와는 달리 자바스크립트에는 패키지를 위한 별도의 문법이 없다. 지만 모듈 패턴을 사용하면 개별적인 코드를 느슨하게 결합시킬 수 있다. 따라서 각 기능들을 블랙박스처럼 다루면서도 소프트웨어 개발 중에(끊임없이 변하는) 요구사항에 따라 기능을 추가하거나 교체하거나 삭제하는 것도 자유롭게 할 수 있다. 모듈 패턴은 네임스페이스 패턴, 즉시 실행 함수, 비공개 멤버와 특권 멤버, 의존 관계 선언 패턴들을 여러 개를 조합한 것이다.

앞 서 간간히 나왔던 개념들을 실제로 구현할 수 있었다

실습하면서 모호하게 다가왔던 개념들이 조금은 형태 있게 받아들일 수 있었다

자바스크립트 말고도, 다른 객체지향 언어들을 사용하면서 설명을 본 패턴들도

그냥 써야하니까 썼고 넘어갔었는데, 그래서 개념을 읽었지만 머릿속에 없었다

왜 나왔는 지도, 딱히 궁금하지 않았다. 안쓰면 넘어가지 않았으니 공식처럼 썼을 뿐...

패턴들을 직접 구현해보면서, 왜 그렇게 만들어졌고 사용했고 나왔는 지를 알 수 있어서 흥미로웠다.

특히 의존 관계가 잘 와닿았다

편하게 사용하고 있으니 이미 주어진 게 많다 보니 이래서 응용력이 없구나 싶다

어떤 영역이든, 고전을 읽어야 모호하다고 생각하는 흐름이 조금은 채워지는 거 같다

 

728x90