전체 글 514

Practical Go - Concurrency

Go는 채널과 동시성, select 및 go 문에 대한 최고 수준의 지원을 제공한다. 동시성 기능을 사용하며 빠질 수 있는 함정들을 정리해보자. Keep yourself busy or do the work yourself Leave concurrency to the caller 함수가 고루틴을 시작하는 경우 호출자에게 해당 고루틴을 명시적으로 중지하는 방법을 제공해야 한다. 해당 함수의 호출자에게 함수를 비동기적으로 실행하도록 결정하는 것이 종종 더 쉽다. Never start a goroutine without knowning when it will stop 고루틴의 생성자에게 발생하는 오류를 다시 전달하여 중지된 이유를 알 수 있도록 하고 프로세스를 깨끗하게 종료하도록 해야한다. 출처 : Practi..

Practical Go - Error handling

Error handling 함께 보면 좋은 자료 Inspecting errors Constant errors Eliminate error handling by eliminating errors 오류 처리 개선을 위해서는 처리 할 오류가 없도록 코드를 변경하는 것도 방법이다. Only handle an error once 오류는 한번만 처리한다. 오류 처리는 오류 값을 검사하고 단일 결정을 내리는 것을 의미한다. 오류가 있는 경우 다른 반환 값의 내용에 대해 어떤 가정도 할 수 없다. Adding context to errors Wrapping errors with github.com/pkg/errors errors 패키지를 사용하면 사람과 기계가 모두 검사할 수 있는 방식으로 오류 값에 컨텍스트 추가가 ..

Practical Go - API Design

초기 패키지의 공용 API에 관해서는 초기 설계에 상당한 고려를 하는 것이 좋다. 나중에 해당 설계를 변경하면 이미 API를 사용하는 사람들에게 방해가 되기 때문이다. Design APIs that are hard to misuse. 오용하기 어려운 API를 설계하라 API의 실제 호출이 복잡하면 덜 명확하고 간과될 가능성이 높다. Be wary of functions which take several parameters of the same type 동일한 유형의 여러 매개 변수를 사용하는 함수를 주의해야한다. func CopyFile(to, from string) error 매개변수의 순서가 중요한 함수의 경우 함수 원형을 참조하지 않고는 알 수 없다. 이를 위해 올바르게 호출 할 책임이 있는 hel..

Practical Go - Project Structure

패키지와 마찬가지로 명학한 목적으로 구성되어있어야 한다. 여러 목적을 단일 프로젝트로 결합하는 것을 피해야 한다. Consider fewer, larger packages 더 적고 더 큰 패키지를 고려하라. 즉, 지나치게 복잡한 패키지 계층 생성을 하지 않기 위한 관행이 있다. cmd/ internal/ 을 제외한 모든 패키지에는 일부 소스코드가 포함되어야 한다. Java 패키지는 단일 .go 소스 파일과 동일하다. Go 패키지는 전체 Maven, Gradle 모듈과 동일하다. Arrange code into files by import statements 하나의 .go 파일로 각 패키지를 시작하라. 해당 파일을 패키지와 동일한 이름으로 지정하라. 패키지가 커짐에 따라 다양한 책임을 다른 파일로 분리하라..

Practical Go - Package Design

각 Go 패키지는 사실상 자체 소규모 Go 프로그램이다. 좋은 Go 패키지는 프로젝트가 성장함에 따라 하나의 패키지에 대한 변경 사항이 코드 기반 전체에 걸쳐 적용되지 않도록 낮은 수준의 커플링을 갖도록 노력해야 한다. A good package starts with its name 좋은 패키지는 이름으로 시작된다. 패키지 이름은 한 단어로 설명하는 엘리베이터 피치라고 생각하면 된다. 패키지에 포함된 내용이 아니라 제공하는 내용에 대한 이름을 지정해야 한다. Good package names should be unique. 좋은 패키지 이름은 고유해야 한다. 유틸리티 패키지 네이밍은 피해라. 약간의 duplication은 잘못된 추상화보다 괜찮다. 유틸리티 패키지의 이름을 지정하려면 복수형을 사용해라. ..

Practical Go - Comment

좋은 코드에는 많은 주석이 있고, 나쁜 코드에는 많은 주석이 필요하다. 주석은 Go 프로그램의 가독성을 위해 매우 중요하다. 주석은 그 일이 무엇을 하는지 설명해야 한다. 주석은 그 일이 하는 일을 설명해야 한다. 주석은 그 이유를 설명해야 한다. Comments on variables and constants should describe their contents not their purpose 변수와 상수에 대한 주석은 목적이 아닌 내용을 설명해야 한다. 함수를 작성하기 전에 함수를 설명하는 주석을 작성해라. 주석을 작성하기 어렵다면 작성하려는 코드가 이해하기 어려울 것이라는 신호다. 출처 : Practical Go: Real world advice for writing maintainable Go ..

Practical Go - Identifiers

잘못된 이름을 네이밍 하는 것은 잘못된 디자인의 증상이다. Go의 제한된 구문을 감안할 때, 프로그램에서 선택한 이름은 프로그램의 가독성에 큰 영향을 미친다. 가독성은 좋은 코드의 품질을 정의하므로 좋은 이름을 선택하는 것은 Go 코드의 가독성에 매우 중요하다. Choose identifiers for clarity, not brevity 간결성이 아닌 명확성을 위해 식별자를 선택한다. 명백한 코드가 중요하다. 한 줄로 할 수 있는 일은 세 줄로 해야 한다. Go는 프로그램을 최소 라인 수로 최적화해야 하는 언어가 아니다. 좋은 이름 지정은 좋은 농담과 같다. 설명해야 한다면 재미가 없다. 좋은 이름은 간결하다. 좋은 이름은 가능한 한 가장 짧은 필요는 없지만 좋은 이름은 관련 없는 것에 공간을 낭비해서..

Practical Go - Principles underlying Go itself

Go 언어는 단순성, 가독성, 생산성을 원칙으로 삼고 있다. Principles underlying Go itself Simplicity Readability Productivity 성능과 동시성은 중요한 속성이지만 단순성, 가독성 및 생산성만큼 중요하지는 않다. Simplicity 단순성은 신뢰성의 전제 조건이다. SW 디자인을 구성하는 방법에는 두 가지가 있다. 명백하게 결함이 없도록 간단하게 만드는 것 명백하게 결함이 없도록 너무 복잡하게 만드는 것 복잡성은 신뢰할 수 없는 소프트웨어에서 신뢰할 수 있는 소프트웨어를 만든다. 복잡성은 소프트웨어 프로젝트를 죽인다. 따라서 단순함이 Go의 가장 큰 목표이다. 어떤 프로그램을 작성하던지 간단하다는데 동의할 수 있어야 한다. Readability 가독성은..

2019년 회고

기억의 한계가 있는지라, 최근 고생한 일들만 떠오르니 생각 정리가 필요한가 싶었다. 하지만 생각보다 이룬 성과가 있었고, 분명 아쉬운 점도 많았다. 올 한해를 되돌아보고 더 나은 내년을 기대하는 시간을 가져보려한다. 2019년 목표 달성 체크 (참고 : 2018년 회고) 외부 활동 참여를 활발히 해보자 (+ 발표를 해보자) 책프협의 책노리 2019 - 개발자의 글쓰기 여정 업무와 관련된 개발을 해보자 selenium-ide, php-webdriver, react-vnc-display 업무와 관련되지 않은 개발을 해보자 GCP Study Jam 나에게 맞는 공부 방법을 정형화시켜보자 Brunch / Medium에 글을 연재해보자 https://brunch.co.kr/@sapzape 스터디 / 모임 운영을 ..

TypeScript로 개발 할 때 유용한 라이브러리

tsc 타입 스크립트 컴파일러. 타입스크립트(.ts)을 자바스크립트로 변환하므로 트랜스파일링이 적절한 표현. 현재 지원하는 자바스크립트 버전은 ES3, ES5, ES6(ES2015), ES2016, ES2017(ESNext) tsc 명령어에 다른 옵션을 붙이지 않고 실행할 경우, 프로젝트 루트 디렉토리에 tsconfig.json 파일이 있다면, 해당 파일을 읽어들여 프로젝트 전체를 대상으로 컴파일한다. ts-node 타입 스크립트를 트랜스파일링 없이 바로 실행할 수 있도록 해준다. nodemon node.js 기반 어플리케이션 개발시 파일 변경이 감지될 때 자동으로 재시작하도록 도와주는 툴 class-transformer plain 객체는 object 클래스의 인스턴스 객체이다. {} 표기법을 통해 생성..