Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

폴더별 환경 관리를 위한 direnv

@nacyo_t님의 소개로 direnv를 쓴지도 꽤 되었다. 이런 류의 도구의 존재는 알고 있었지만, 그동안 여러 환경을 오가야 할 필요가 많이 없었기 때문에 굳이 써야 할 필요성을 못 느끼고 있었다가 지금 업무 환경에서는 개발환경의 버전이 다른 경우도 많고 Docker를 쓰다 보니 관련 환경변수를 전역이 아닌 프로젝트별로 설정해서 써야 하는 경우가 많았다. 프로젝트 수가 많다 보니 전역으로 관리할 수 있는 양이 아니어서 사용하기 시작한 뒤로 너무 편해서 계속 쓰고 있다.

direnv

direnv는 이름 그대로 폴더별로 환경을 관리해주는 도구이다. direnv로 설정을 해 놓으면 폴더 이동을 할 때마다 자동으로 설정해놓은 환경변수나 원하는 런타임 버전 지정 등을 알아서 할 수 있다. 그래서 한번 설정해 놓으면 해당 프로젝트에서 다른 설정에 대해서는 잊어버리고 쉽게 작업을 할 수 있고 어떤 환경 설정을 해놨는지가 궁금해지면 설정 파일을 열어보면 그만이다.

direnv 설치

direnvGo로 작성되었는데 홈페이지에 나온대로 각 OS의 패키지 매니저를 이용해서 설치하거나(macOS라면 brew install direnv) 릴리스 페이지에서 OS에 맞는 바이너리를 받아서 설치해서 사용하면 된다.

설치 후에는 쉘에서 direnv가 실행되도록 해야 하므로 bash를 쓰고 있다면 ~/.bashrc 파일에 eval "$(direnv hook bash)"를 추가하면 폴더 이동을 할 때마다 자동으로 실행되게 된다. bash 외에 다른 쉘을 쓰고 있다면 zsh, fish, tcsh를 다 지원하므로 홈페이지를 참고해서 설정하면 된다.

.envrc

사용방법은 아주 간단한데 환경설정이 필요한 디렉터리 아래 .envrc 파일을 만들면 된다. 예를 들어 project-a라는 디렉터리 아래 다음과 같이 .envrc를 만들었다고 해보자.

$ cat .envrc
export HOST=127.0.0.1
export PASSWORD=asdf

이제 project-a 폴더에 진입하면 위 파일을 실행해서 자동으로 환경 변수를 설정해 주게 된다.

$ cd project-a
direnv: loading .envrc
direnv: export +HOST +PASSWORD

$ env | grep PASSWORD
PASSWORD=asdf

$ cd ..
direnv: unloading

폴더에 진입하자 direnv가 실행되고 HOST, PASSWORD 환경변수를 설정하고 폴더를 빠져나오자 자동으로 다시 제거하는 것을 볼 수 있다. 이렇게 필요한 환경만 잘 설정해 놓으면 이제 작업할 때 폴더만 이동하면서 환경 걱정 없이 작업할 수 있다.

$ echo 'export USERNAME=outsider' > .envrc
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.

$ direnv allow
direnv: loading .envrc
direnv: export +USERNAME

위에서 보는 것처럼 새로운 .envrc 파일이나 기존의 .envrc를 수정하는 경우에는 바로 적용되지 않고 direnv allow를 해주어야 사용할 수 있다. 이는 압축파일을 다운받거나 다른 프로젝트 파일을 받았는데 거기에 .envrc가 있어서 자동으로 실행되어 보안 문제가 발생하는 것을 막기 위함이다. 처음에는 어색했지만 한번 설정하면 자주 바꿀 일은 없으므로 크게 불편하지는 않다.

그리고 위에서 .envrc 파일의 내용에서 눈치챘겠지만 direnv는 환경 변수설정 전용이 아니다. .envrc의 내용에 export USERNAME=outsider처럼 써주었는데 이는 환경변수를 설정하는 bash 명령어 그대로이다. 이 말은 쉘 명령어는 .envrc에서 사용할 수 있다는 의미라서 단순 환경변수 외에도 원하는 작업을 쉘로 작성해서 여기에 넣을 수 있다. 그래서 실제로 위키에도 언어별 환경을 설정하는 방법이 나와 있다. 프로젝트별로 Python이나 Ruby의 버전이 다른 경우에도 이 Project Layouts를 쓰면 자동으로 버전도 프로젝트에 맞게 설정해서 사용할 수 있다.

2017/08/10 03:52 2017/08/10 03:52

기술 뉴스 #83 : 17-08-01

웹개발 관련

  • ES8 was Released and here are its Main New Features : 지난달에 최종 표준이 발표된 ES2017에서 추가된 기능을 정리한 글이다. ES2017에 큰 변화는 없지만 새로 추가된 메서드나 기능들을 파악하기 좋은 글이다.(영어)
  • High Performance React: 3 New Tools to Speed Up Your Apps : React 앱에서 성능 최적화를 할 수 있는 도구를 소개하는 글이다. react_perf 쿼리스트링으로 개발자 도구의 성능 툴에서 React 컴포넌트의 라이프사이클을 볼 수 있고 why-did-you-update 라이브러리로 불필요하게 렌더링 되는 컴포넌트를 확인할 수 있고 React Developer Tools로 최적화는 방법을 설명하고 있다. 마지막에는 자신이 만든 상용도구에 대한 소개로 이어지지만 각 도구의 데이터를 읽는 법과 최적화 방법까지 나와 있어서 유용하다.(영어)
  • Reducing CSS bundle size 70% by cutting the class names and using scope isolation : Webpack과 babel-plugin-react-css-modules로 CSS 클래스를 a_a같은 식으로 줄여서 CSS 파일을 140KB에서 47KB까지 줄인 접근을 설명한 글이다. 보통 파일을 압축해서 제공하므로 결과적인 용량에서 아주 큰 이득은 없지만 파싱할 문서의 크기는 줄어드는 효과가 있다고 설명하고 있다.(영어)
  • SVG를 이용해 간단한 웹 게임 만들어보기 : SVG를 이용해 간단한 아케이드 게임을 만들면서 SVG를 선택한 이유와 성능 최적화를 한 과정까지 나와 있어서 웹에서 게임 등 동적인 요소를 만들 때 도움이 될 글이다.(한국어)

그 밖의 프로그래밍 관련

  • Unconventional way of learning a new programming language : 새로운 프로그래밍 언어를 배울 때 오픈소스에 기여하는 방식으로 하기를 추천하는 글이다. 실제로 글쓴이가 이 방식으로 프로그래밍 언어를 배우고 있으며 이 방식이 좋은 이유는 가이드라인을 지키면서 좋은 코드를 작성할 수 있고 해당 언어의 전문가한테 피드백을 받을 수 있는 점을 들었다. 해당 언어 저장소에서 beginnereasy-fix 라벨이 붙은 이슈를 처리하는 방식을 취하고 있다.(영어)
  • GET READY: A NEW V8 IS COMING, NODE.JS PERFORMANCE IS CHANGING. : V8에 Crankshaft에서 Turborfan으로 JIT 컴파일러를 바꾸면서 Node.js 코어 팀에서 성능 개선을 위해서 알려진 JavaScript 코드 패턴으로 벤치마크를 실행한 결과이다. Crankshaft를 쓰는 V8 5.1, Crankshaft와 Turborfan을 같이 쓰는 5.8, Turbfan을 쓰는 5.9, 6.0, 6.1에서 성능이 어떻게 달라지는지를 쉽게 알 수 있다. 기존 관행이 그대로 유지되는 때도 있고 기존에 성능 향상 팁으로 사용하던 코드들이 더는 무의미한 때도 있는데 Turbofan은 아직 적용 중이지만 전체적인 성능 향상의 방향을 이해할 수 있다.(영어)
  • Say hello to HTTP/2 for Node.js Core : Node.js에 http2 모듈을 추가하는 PR에 대해서 http2 모듈을 어떻게 사용하는지 설명한 글이다. 아직 PR이 머지되지 않았고 PR이 머지되더라도 실험적 단계이지만 이 기능이 추가되면 Node.js에서 쉽게 http2를 지원할 수 있다.(영어)
  • The OAI Announces the OpenAPI Specification 3.0.0 : OAI에서 OpenAPI 명세 3.0.0을 발표했다.(영어)

볼만한 링크

  • QA != 통합테스트 : 우아한 형제의 QA 팀에서 QA 팀의 업무를 단순히 테스트로 바라보는 오해를 풀기 위해서 쓴 글로 단순 테스트가 아니라 소프트웨어 및 그 개발 과정 전체에서 품질을 높이는 노력을 하고 있다고 설명하고 있다. 그동안 개발을 하면서 잘 갖춰진 QA 팀과 일해본 적이 많지 않기 때문에 QA 팀의 지원을 잘 받으면 소프트웨어 품질에 큰 도움이 되는 걸 알고 있지만, 막상 자주 겪지 못해서 나도 은연중에 테스트 업무로만 바라보고 있었던 것을 부정하기는 어렵다.(한국어)
  • 스타트업 CTO의 일 : 8퍼센트의 CTO이신 이호성님이 그동안 CTO 역할을 하면서 CTO가 해야 하는 일을 정리한 글이다. Technical Leader, Technical Businessman, Team Manager, Product Manager의 역할별로 해야 하는 일이 잘 정리되어 있다.(한국어)
  • 이직초보 어느 개발자의 이력서 만들기 : 우아한 형제에서 일하시는 구인본님이 이력서를 개선하는 과정을 설명한 글이다. 첫 페이지의 기술 요약 및 개인 정보부터 프로젝트 요약까지 더 보기 좋은 이력서를 만들기 위한 고민 과정과 의도가 잘 나와 있어서 똑같이 만들지 않더라도 개발자 이력서가 어떤 형태로 자신을 알려야 하는지 너무 잘 설명된 글이라고 생각한다.(한국어)
  • Move Fast and Don’t Break Things: Run Development From Slack : Rod Johnson이 만든 Atomist에서 Slack을 이용해서 서버를 관리하는 방법을 설명하고 있다. GitHub에서 커밋이 올라오면 Slack으로 알림을 받을 때 단순한 알림이 아니라 CI 결과, 핑거프린트를 만들어서 변경된 모듈, 관련 이슈 등을 함께 볼 수 있도록 알려주고 여기에 버튼을 추가해서 바로 서버에 배포하거나 정보를 볼 수 있도록 강화해서 쓰고 있다.(영어)
  • Technical Leadership: Getting Started : 기술 리더쉽에 대해 설명한 글로 본인이 이 부분을 중요하게 생각하지 않고 코딩에만 열중하다가 실패한 경험을 바탕으로 쓴 글이다. 관리와 리딩을 구분해서 리딩은 사람들에게 영감을 주는 것이라고 설명하고 먼저 자기 자신을 리딩하고 다른 사람과 조직을 리딩해야 하는데 이글에서는 자신을 리딩하는 방법을 설명하고 있다.(영어)

IT 업계 뉴스

프로젝트

  • GitPoint : React Native로 만든 GitHub iOS 앱. 안드로이드 버전은 준비 중이다.
  • gpu.js : WebGL을 이용해서 GPU로 JavaScript을 실행하는 라이브러리로 사이트에서 벤치마크를 실행해보면 CPU로 돌린것 보다 상당히 빠른 속도를 보여준다.
  • TTTFI : IFTTT의 미들웨어로 IFTTT의 웹훅을 받아서 스크립트를 실행하고 다시 IFTTT로 보내준다.
  • ūsus : prerender.io처럼 SPA 앱을 크롬 디버깅 프로토콜로 미리 정적 HTML로 만들어서 제공할 수 있는 프로젝트.
  • SoftU2F : GitHub에서 만든 오픈소스로 macOS에서 U2F(Universal 2nd Factor) 하드웨어 장비 대신 소프트웨어로 인증할 수 있는 소프트웨어다.
  • chromeless : Chrome의 headless 모드를 이용해서 웹브라우저 자동화를 할 수 있게 구현한 프로젝트로 로컬 외에도 AWS Lambda에 올려서 사용할 수 있다.

버전 업데이트

2017/08/01 09:56 2017/08/01 09:56