이전까지의 이야기
이전에 내가 속한 조직은 개발자위주의 조직이었고, 나는 거기서 Data Engineer 업무를 담당했다.
아무것도 모르는 상태에서 온프렘으로 K8s 클러스터를 운영하고, IaC를 지향하기까지 많은 삽질과 어려움이 있었다. 사수도 없는 상태에서, 일단 최선의 결과를 내려고 부단히 노력했다.
- 누군가 도와주는 사람이 없다면, 스스로 성장해서 남을 도와주는 선순환 구조를 만들어야한다.
새로운 조직, 새로운 고민
나는 이전에 속해있던 개발자위주의 조직에서, 5명 이내의 데이터 조직으로 이동하였다. 데이터 엔지니어, 분석가, 모델러로 이루어 진 소규모조직이다.
여태까지의 나는 혼자 일을했기때문에, 타인과 개발환경을 맞추거나, 버전을 맞춰야하는 일이 없었다. 하다못해 K8s 버전이나, Airflow 버전에 대한 요구도 없었고, 내가 선택해서 결정하면되었다. 일반적으로는 GCP에서 상용서비스로 제공하는 프로그램의 오픈소스 버전을 사용하는게 가장 합리적이라고 생각했고, 그렇게 행해왔다.
그리고 조직을 바꾸면서, 다른사람과 협업해야하는 일이 생겼다.
이 글은 ‘왜 개발환경을 맞추어야하는지’ 필요성에 대해서 느끼게 된 점을 정리한 글이다.
제컴퓨터에서는 돌아가는데요
하나 알아둬야할게, 내가 속해있는 Data분야에서는 관련프레임워크, 라이브러리가 버전마다 차이가 많이난다.
예를들어서, tensorflow 버전1에서 작성된 코드를 버전2환경에서 작동하려면, tensorflow 1에서만 있는 Session 같은 메소드를 전부 제거해주어야한다. 그 이유는 Tensorflow 2는 Tensorflow 1의 API를 모두 똑같이 가져온게 아니기 때문이다.
위에서는 tensorflow를 예시로 들었지만, 궁극적으로 하고싶은 말은 조직이 커질수록 개발환경을 통일시키는것에 노력을 사용해야한다는것이다.
여러명이 일하는 환경에서, 최대한 통일시켜서 동일한 개발환경을 구성하고, 개발한다고 해도 결국 어디선가 환경불일치가 발생할것이다.
내 컴퓨터에서는 잘 돌아가는데, 다른사람의 컴퓨터에서는 작동하지 않는 경우가 바로 이런경우다.
Pyenv, Conda, Docker
따라서, 개발환경을 갖추기 위한 다양한 도구가 있다. 어떤때에 쓰는지 알아보자.
Pyenv
여러버전의 Python 프로젝트를 관리하고, 각 프로젝트에 대한 특정 버전을 사용하는 버전관리 도구라고 보면 된다. 여러개의 파이썬 버전을 병렬로 설치하게 하고, 프로젝트마다 필요한 파이썬 버전을 선택하고 관리할 수 있다. Python이 설치될때 pyenv가 설치되서, 다른거 설치하기는 부담스럽고, python개발 만 한다고 했을때 일반적으로 사용하는것같다.
Conda
Conda는 Anaconda, Minicoda 등 관련된 시리즈가 많으니까 직접 확인해보는게 필요하다. Conda를 설치하게되면 Pandas Numpy 등의 데이터관련 라이브러리가 설치되서, DS 혹은 ML 엔지니어 분들이 많이 설치하는것같다. Conda를 사용했을때의 장점은 가상환경을 구성할수 있다는것이고, 제공하는 데이터관련 라이브러리가 많기때문에, 데이터관련 프로젝트를 할때 프로젝트마다 다른환경을 구성해야하는 니즈에 충족시킬수있다는것이다.
Docker
교과서대로 표현하자면 Docker는 컨테이너 기반 가상화 플랫폼이다. 환경 자체를 가상화 시켜서, 가상화된 환경 위에 올려서 띄우는 방식으로 이루어져있다. 이러한 특징때문에 Data 관련분야 뿐만아니라, 클라우드, 백엔드, 등등 거의 모든 분야에서 사용하는 기술이다.
그래서 해답은 Docker 다. 과연 그럴까?
가상화 기반 프로그램이 많이 나와서 개발조직에서 가장 빈번하게 사용하는건 Docker라고 보는게 일반적이다. 그렇다면 과연 Docker 를 사용하면, 모두 일치된 개발환경을 구성할수 있을까?
사실 그렇지도 않다.
여기서 ‘엥?’ 할거 같은데, 제대로 이유를 들어보면 알수 있다.
예를들어서 M1 애플 맥북과 Intel 애플 맥북에서 빌드한 Docker 이미지는 간혹, 다른 결과를 낼수 있다.
M1은 ARM 아키텍쳐를 사용하며, Intel 은 x86_64의 아키텍쳐 구조를사용한다. Docker의 경우, 호스트의 시스템 아키텍쳐에 따라 빌드되므로, 도커이미지 또한 아키텍쳐에 종속성을 가진다.
그래서 결론은 뭘까?
Docker에 맞추는게 조금 더 일반적이라고 생각하는데, 결론은 ‘정답은 없다’ 라고 생각한다. Docker가 가장 범용성있지만, 결국 Docker또한 아키텍쳐에 종속성이 있다는건 너무 치명적이라고 생각한다.
각자가 있는 개발조직의 환경에 맞게 구성하는게 맞는것같다.
예를들어 배포환경은 Ubuntu Linux이고, 개발하는 환경은 Window와 M1 맥북이라면, 우선 각각의 개발환경에서 작동할수 있도록 개발을 진행하고, 이후에 배포환경으로 컨버팅 해주는 작업을 진행하는 방법이 있을것이다.
또 다른 방법으로는 개발하는 환경을 바꿔서, 배포환경과 동일한 환경에서 개발을 진행하는것도 또 하나의 방법일것이라고 생각한다.
나는 개인적으로는 배포환경과 동일한 개발환경에서 진행하는게, 가장 리소스를 최소한으로 줄이는 방식이라고 생각한다.
'프로젝트의 고민들' 카테고리의 다른 글
티스토리 포스팅 할때 동글(Dong-gle) 사용해본 후기 (2) | 2023.11.13 |
---|---|
올바르게 일하기 (3) | 2023.09.21 |
데이터감시자. 수집기들이 일을 잘하고있나? (0) | 2023.03.19 |
어쩌다 홈 PC 클러스터링 (2) | 2023.03.06 |
데이터 인프라는 K8s에 올라가있는게 좋을까 (진짜모름) (0) | 2023.02.19 |