Docker CLI 도구는 Docker 이미지(image)의 효과적인 관리를 위해서 다양한 커맨드(command)를 제공합니다. 이번 포스팅에서는 자주 쓰이는 커맨드 위주로 어떻게 Docker 이미지를 제어할 수 있는지 알아보도록 하겠습니다. 이미지 조회 docker images 커맨드는 이미지를 조회할 때 사용됩니다. 인자를 넘기지 않고 이 커맨드를 호출하면 전체 이미지 목록을 출력해줍니다. 특정 리파지토리(repository)에 해당하는 이미지만 필터링해서 보고 싶을 때는, 리파지토리를 인자로 넘겨주면 됩니다. 태그까지 인자로
Docker가 대중화되면서 많은 프로젝트들이 개발 환경을 컨테이너화(containerization)시키고 있습니다. 이러한 프로젝트의 최상위 디렉터리에서는 항상 Dockerfile이 위치하게 되며, 따라서 Dockerfile 이해하는 것은 그 프로젝트의 개발 환경이 어떻게 구성되는지 이해하는 첫걸음입니다. Dockerfile은 Docker 이미지(image)가 어떤 단계를 거쳐 빌드(build)되야 하는지를 담고있는 텍스트 파일입니다. Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하여 이미지를 생성해줍니다. 이번
최근에 많은 NodeJS 프로젝트들이 Docker를 이용해서 개발되고 있습니다. 이번 포스팅에서는 NodeJS로 간단한 Express 서버 애플리케이션을 작성해보고, Docker를 이용해서 이 애플리케이션을 어떻게 컨테이너화(containerized) 할 수 있는지에 대해서 알아보도록 하겠습니다. 실습 프로젝트 환경 구성 원하는 위치에 디렉터리를 생성하고, 그 안에 package.json 파일을 생성합니다. (컴퓨터에 NodeJS가 설치가 안 되어 있다면 먼저 NodeJS를 다운로드 받아 설치해야 합니다.) 그 다음, npm을 통해
개발자에게 Docker란? Docker는 쉽게 말해서 컨테이너(container)를 돌려주는 엔진(engine)이라고 생각할 수 있는데요. 2013년 출시 후 꾸준히 인기를 얻어온 Docker는 이제는 개발자들도 모르면 불편할 정도로 대중화가 되어 버린 것 같습니다. 하지만 아직도 많은 개발자들이 업무에서 Docker를 매일 사용하고 있음에도 불구하고, Docker를 시스템 또는 DevOps 엔지니어만을 위한 도구로 여기거나, Docker 직접 다루는 것을 회피하다가, 문제가 생겼을 때 스스로 해결을 하지 못해서 곤혼스러워하는 개발
reduce 함수 파이썬의 functools 내장 모듈의 reduce() 함수는 여러 개의 데이터를 대상으로 주로 누적 집계를 내기 위해서 사용합니다. 기본 문법은 다음과 같은데요. 기본적으로 초기값을 기준으로 데이터를 루프 돌면서 집계 함수를 계속해서 적용하면서 데이터를 누적하는 방식으로 작동합니다. 여기서, 집계 함수는 두개의 인자를 받아야 하는데요. 첫번째 인자는 누적자(accumulator), 두번째 인자는 현재값(current value)가 넘어오게 됩니다. 누적자는 함수 실행의 시작부터 끝까지 계속해서 재사용되는 값이고,
함수형 프로그래밍에서 데이터 필터링(filtering) 작업을 할 때 반복문 대신에 함수 호출로 처리하는 경우가 많은데요. 이번 포스팅에서는 파이썬의 filter() 함수를 사용하여 특정 조건을 충족하는 요소만 추출하는 방법에 대해서 알아보겠습니다. filter 내장 함수 파이썬의 내장 함수인 filter()는 여러 개의 데이터로 부터 일부의 데이터만 추려낼 때 사용하는데요. 따라서, 여러 개의 데이터를 담고 있는 리스트(list)나 튜플(tuple)을 대상으로 주로 사용하는 함수입니다. 사용 방법은 매우 간단한데요. 기본 문법은
함수형 프로그래밍에서 데이터 맵핑(mapping) 작업을 할 때 반복문 대신에 함수 호출로 처리하는 경우가 많은데요. 이번 포스팅에서는 파이썬의 map() 함수를 사용하여 여러 데이터를 한 번에 변환하는 방법에 대해서 알아보겠습니다. map 내장 함수 파이썬의 내장 함수인 map()는 여러 개의 데이터를 한 번에 다른 형태로 변환하기 위해서 사용하는데요. 따라서, 여러 개의 데이터를 담고 있는 리스트(list)나 튜플(tuple)을 대상으로 주로 사용하는 함수입니다. 사용 방법은 매우 간단한데요. 기본 문법은 다음과 같습니다. ma
Immutability (불변성) 최근 소프트웨어 개발 트랜드를 보면 프로그래밍 언어에 관계없이 불변(imuutable) 데이터 타입의 사용을 권장하는 추세입니다. 여러 가지 이유가 있겠지만 메모리의 가격이 계속해서 싸지면서 데이터를 복제하는 대신에 변경하는 것이 더 이상 큰 이점으로 여겨지지 않고 있습니다. 반면에, 데이터를 변경하는 것에 대한 리스크는 멀티 쓰레드 기반의 동시/병렬 프로세싱 기법이 발달하면서 점점 더 커지고 있습니다. 즉, 여러 쓰레드가 동시에 데이터를 변경할 경우, 소프트웨어가 어떻게 동작할지 예측이 어렵고 버
가짜 데이터 소프트웨어를 개발하다 보면, 특히 시제품(prototype)을 개발하거나, 단위 테스트를 작성할 때 가짜 데이터가 필요할 때가 있습니다. 이럴 때, 직접 가짜 데이터를 하드코딩(hard-coding)할 수도 있겠지만, 좀 더 쉽고 빠르게 가짜 데이터를 얻을 수 있는 방법이 있어서 소개드리려고 합니다. 바로, Faker라는 라이브러리인데요. Faker를 사용하면 가짜 데이터를 정말 너무 간단하게 생성할 수 있습니다. 👍 패키지 설치 패키지 임포트 가짜 이름 생성 name() 메서드를 사용하면 간단하게 가짜 이름을 생성할
지난 포스팅에서 파이썬의 logging 내장 모듈을 이용해서 정말 기본적인 로깅 방법에 대해서 살펴보았습니다. 이번 포스팅에서는 애플리케이션 규모가 커짐에 따라 어떻게 효과적으로 로깅을 설정해야 하는지에 대해서 다뤄보도록 하겠습니다. 핵심 컴포넌트 로깅 설정을 제대로 하기 위해서는 먼저 로깅 시스템을 구성하는 핵심 컴포넌트를 이해하는 것이 중요합니다. 먼저 가장 로깅 시스템의 가장 근간이 되는 로거(logger)는 로그 메시지를 남기기 위해서 우리가 직접 사용하는 프로그래밍 인터페이스를 제공합니다. 우리는 로거를 통해서 debug(
여러 환경에 파이썬 애플리케이션을 배포하려면 환경 변수라는 것을 이용해야하는데요. 이번 포스팅에서는 파이썬에서 환경 변수에 어떻게 접근하고 설정할 수 있는지에 대해서 알아보겠습니다. 환경 변수란? 먼저 환경 변수(environment variable)가 무엇인지 간단하게 짚고 넘어가면 좋을 것 같은데요. 환경 변수는 운영 체제(operating system) 수준에서 설정되는 변수로, 주로 애플레케이션 수준에서 설정하기가 불가능하거나 어려운 값들을 환경 변수로 관리하는 경우가 많죠. 환경 변수를 이용하면 애플리케이션 코드를 수정하지
Subscription GraphQL에는 query와 mutation 그리고 subscription 이렇게 총 3가지 operation type이 있습니다. 이 중에 query는 데이터 조회를 위해서 필수적으로 사용되고, mutation은 데이터 변경을 위해서 많이 사용되고 있습니다. query와 mutation 대비 다소 생소한 subscription은 주로 실시간(real-time) 애플리케이션을 구현하기 위해서 사용되는데요. subscription도 기본적으로 query처럼 데이터를 조회를 위해서 사용되지만 작동 방식에서 큰
Subscription GraphQL에는 query와 mutation 그리고 subscription 이렇게 총 3가지 operation type이 있습니다. 이 중에 query는 데이터 조회를 위해서 필수적으로 사용되고, mutation은 데이터 변경을 위해서 많이 사용되고 있습니다. query와 mutation 대비 다소 생소한 subscription은 주로 실시간(real-time) 애플리케이션을 구현하기 위해서 사용되는데요. subscription도 기본적으로 query처럼 데이터를 조회를 위해서 사용되지만 작동 방식에서 큰
지난 포스팅에서 unittest.mock 모듈의 Mock 또는 MagicMock 클래스를 사용하여 기본적인 mocking을 하는 방법에 대해서 알아보았습니다. 이번 포스팅에서는 실전에서 더 많이 쓰이는 unittest.mock 모듈의 patch() 데코레이터를 이용하여 단위 테스트를 좀 더 세련되게 작성하는 방법에 대해서 알아보겠습니다. patching? mocking? unittest.mock 모듈의 patch() 데코레이터를 이용하면 특정 모듈의 함수나 클래스를 가짜(mock) 객체, 좀 더 엄밀히 말하면, MagicMock 인
float 타입 파이썬의 float 기본 타입은 대부분의 다른 프로그래밍 언어들처럼 소수를 내부적으로 이진수의 형태로 저장합니다. (컴퓨터라는 기계는 결국에 0 또는 1로 모든 데이터를 저장히기 때문이죠...) 예를 들어, 십진 소수 0.875을 float 타입으로 저장하면 이진 소수인 0.111의 형태가 됩니다 (1/2 + 1/4 + 1/8). 하지만 불행이도 모든 십진 소수가 이와 같이 딱 떨어지게 이진 소수의 형태로 표현될 수 있는 것은 아닙니다. 예를 들어, 십진 소수 0.895를 이진 소수로 변환해보면 0.111001010
본 포스팅의 내용을 문제없이 이해하려면 파이썬의 기본 테스팅에 대한 선수 지식이 필요합니다. 해당 지식이 부족하신 분들은 관련 포스팅를 먼저 읽고 돌아오시는 것을 추천드립니다. Mocking이란? 단위 테스트를 작성하다보면 데이터베이스 또는 외부 API에 의존하는 코드를 테스트해야 할 일이 필연적으로 생기기 마련입니다. 운영 환경 대비 제약이 많은 테스트 환경에서는 실제 데이터베이스와 연동하거나 실제 외부 API를 호출하기가 불가능한 경우가 많습니다. 가령 가능하더라도, 이렇게 외부 서비스에 의존하는 테스트는 해당 서비스에 문제가
logging 내장 모듈 외부 라이브러리가 없더라도 대부분의 애플리케이션에서는 파이썬에 내장되어 있는 logging 모듈만으로도 충분히 로깅이 가능합니다. logging 내장 모듈은 파이썬만 설치되어 있다면 다음과 같이 인터프리터에서도 간단히 임포트해서 사용해볼 수 있습니다. 심각도 별 로깅 logging 모듈은 5단계의 심각도 따라 다른 메서드를 제공하고 있습니다. 기본적으로 이 중 하나의 메서드에 로깅할 메시지를 인자로 넘겨서 호출하면 로그가 남습니다. 위 프로그램을 실행해보면 다음과 같이 debug와 info를 제외하고 로그가
파이썬의 패키지 매니저 대부분의 프로그래밍 언어들은 자체적으로 패키지 관리 도구(package manager)를 제공하고 있습니다. 자바의 Maven, 자바스크립트의 npm처럼 파이썬에서는 pip라는 매우 간단한 패키지 관리 도구가 있는데요. 다른 언어의 패키지 매니저와 비교했을 때 부족한 부분들이 많다고 느끼실 겁니다. 일단 기본적으로 패키지 설치가 전역으로(global) 설치되기 때문에 한 컴퓨터 상에서 여러 파이썬 프로젝트에 걸쳐 작업을 하기가 힘들고, 프로젝트 별로 설치가 필요한 패키지를 정의하는 방식도 어디는 require
코드 스타일 파이썬과 같이 사용차층이 넓은 범용 프로그래밍 언어의 경우, 개발자들이 선호하는 코드 스타일이 다양해지게 됩니다. 개인 프로젝트에서는 자신이 선호에 따라 어떤 방식으로 코드를 포맷팅하든지 코드가 돌아가기면 하면 큰 상관이 없지만, 협업 프로젝트에서는 이러한 개발자 간의 사소한 코드 스타일 차이로 불필요한 감정 싸움이 발생하기도 합니다. 예를 들어, 똑같은 문자열을 표현하기 위해서 개발자 A는 홑따옴표를 사용하고 싶은데, 개발자 B는 쌍따옴표를 사용하고 싶습니다. 만약에 개발자 A가 작성한 코드를 나중에 개발자 B가 수정
이번 포스팅에서는 의존성 충돌없이 파이썬 개발을 할 수 있도록 도와주는 매우 유용한 도구인 venv 내장 모듈에서 대해서 알아보겠습니다. 의존성 충돌 문제 하나의 컴퓨터 상에서 Python으로 개발된 여러 개의 프로젝트 돌리는 경우 프로젝트 간에 의존성(dependency) 충돌이 발생하기 쉬운데요. 예를 들어서 프로젝트 A에서 Django 패키지 3.x 버전을 사용하는데, 프로젝트 B에서 Django 패키지를 4.x 버전을 사용하고 있다면, 둘 중 하나의 프로젝트에서는 Django 앱을 실행할 때 오류가 발생할 가능성이 높습니다.