본문으로 건너뛰기

📖 무엇이 1등 팀을 만드는가

Chanho Lee
다양한 분야를 공부하고 있는 학생
정보

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

나는 리뷰어다 2024

Book Info

책 이미지를 클릭하면 교보문고 사이트로 이동합니다!

책

  • 제목: 무엇이 1등 팀을 만드는가
  • 저자: 애디 오스마니
  • 역자: LINE SQE 팀
  • 출판사: 한빛미디어
  • 출간: 2024-12-05

📖 소프트웨어 엔지니어 가이드북

Chanho Lee
다양한 분야를 공부하고 있는 학생
정보

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

나는 리뷰어다 2024

Book Info

책 이미지를 클릭하면 교보문고 사이트로 이동합니다!

책

  • 제목: 소프트웨어 엔지니어 가이드북
  • 저자: 게르겔리 오로스
  • 역자: 이민석
  • 출판사: 한빛미디어
  • 출간: 2024-10-30

🐋 Python 프로젝트를 위한 Docker 베이스 이미지 선택 시 Alpine Linux를 피해야 하는 이유

Chanho Lee
다양한 분야를 공부하고 있는 학생

Introduction

Django를 활용하여 블로그를 만들어보는 프로젝트를 진행하다가 docker로 환경을 옮기는 도중 여러 에러들을 만났다. 이 글은 문제를 해결하면서 얻은 지식을 공유하고자 작성한 글이다.

첫 번째 문제

Alpine Linux와 cryptography의 호환성 문제

Dockerfile, docker-compose.yml 파일을 작성 후 마지막으로 빌드를 하던 중 아래의 에러를 만났다.

ERROR: No matching distribution found for cryptography==3.4.7

현재 Dockerfile에서 사용하는 image 버전과 requirements.txt에 적힌 cryptography 버전은 아래와 같다. 이렇게 설정해두고 docker-compose로 빌드를 하려고 했는데 에러가 발생한 것이다.

FROM python:3.8-alpine
cryptography==3.4.7

해결

alpine linux와 python에서 암호화 알고리즘이 구현된 패키지인 cryptography의 호환성 문제라고 생각했고, cryptography의 공식 문서를 참고하여 해결책을 찾아보았다.

crypto-doc

대략 요약하면 cryptography 패키지는 Rust를 빌드할 때 사용한다. 즉, Rust의 패키지 관리자이자 빌드 도구인 cargo를 같이 설치해야지 돌아간다는 것이다.

$ sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev cargo

위의 코드를 Dockerfile에 추가하면서 첫 번째 문제는 잘 해결할 수 있었다.

두 번째 문제

빌드가 오래 걸리다가 안 되는 문제

위의 명령어를 Dockerfile에 추가하고 다시 build 하면 당연히 잘 작동될 거라 생각했으나 아래와 같이 다시 한 번 에러가 발생했다. 이미지를 보면 알 수 있듯이 still running이 지속되는 상황이다. 대략 10분 정도 그대로 놔뒀는데도 빌드가 안 되고 계속 진행하다가 종료가 된다.

더 상세한 details

해결

계속 구글링을 하면서 이 문제를 해결하려 했으며, cryptography 라이브러리와의 문제일 수도 있다고 생각하여 공식 문서도 다시 다 읽어보고, 라이브러리의 GitHub 이슈도 찾아보았다.

더 상세한 details

대략적으로 비슷한 이슈를 찾을 수 있었다. 위의 이미지는 cryptography GitHub 저장소에서 가져온 한 이슈 이미지다. 현재의 상황과 비슷하여 답변을 참고할 수 있었다.

대략 요약하자면 아래와 같다.

  1. Alpine Linux에서 Python 패키지를 빌드하는 작업이 느리며, 특히 CI/CD 환경에서 매번 빌드해야 하는 경우 비효율적이다.
  2. Python의 pip 및 휠 패키징과 관련하여 Alpine과 호환 가능한 휠을 업로드하는 작업이 필요하지만, 이는 pip/wheel/packaging 및 관련 PEP 논의가 필요하다.
  3. 최신 Alpine 환경에서 Python 패키지를 제대로 설치하려면 최신 Rust 컴파일러가 필요하다.
  4. Alpine에서 발생하는 이와 같은 문제는 문서화되어 있고, 현재로서는 개선 사항이 없으므로 추가적인 문제가 있다면 새로운 이슈를 열거나 PR(Pull Request)을 제출해야 한다.

이 답변에서의 핵심은 결국 1번과 2번이었다. 즉, Alpine 리눅스가 문제였고, 아래와 같이 이미지만 바꿈으로서 문제를 해결할 수 있었다.

FROM python:3.8-slim-buster

근데 문제만 해결하면 끝일까? 그건 아니다. 이유를 알아보자.

Alpine Linux가 파이썬 환경에서 적절하지 않은 이유

내가 alpine linux를 사용한 이유는 Ubuntu linux와 비교했을 때 용량도 작고 빌드할 때 더 빠르기 때문이다. 즉, 경량화가 잘 되어 있기 때문이다. 그러나 이 이미지는 python 환경에서는 적절하지 않다.

그 이유는 사용하는 라이브러리의 차이에서 시작된다. 대부분의 리눅스 배포판은 파이썬을 포함한 모든 C언어 프로그램에 필요한 C언어 표준 라이브러리인 GNU 라이브러리(glibc)를 사용한다. 그러나 Alpine Linux는 좀 더 경량화하기 위하여 GNU 라이브러리를 사용하는 것이 아니라 musl 라이브러리를 사용한다. 이 musl 라이브러리는 GNU 라이브러리로 컴파일 된 Wheel 바이너리를 지원하지 않는다. 그렇기 때문에 .whl 확장자를 갖는 패키지를 다운 받는 것이 아니라 .tar.gz 확장자 파일을 다운 받게 된다. 즉, alpine linux를 사용하는 경우 사용하는 모든 파이썬 패키지의 C 코드를 컴파일 해야 하므로 빌드 시간도 오래 걸리며 용량도 커진다는 것이다.

최근 대부분의 파이썬 패키지에는 PyPI의 Wheel 바이너리가 포함되어 있어 설치 시간이 빠르다. Wheel은 사실 .whl 확장자와 특별한 형식의 파일 이름으로 이루어진 ZIP 형식을 아카이브한 것이다. 쉽게 말하면 확장자만 바꾼 것이다.

  1. 빌드가 느리다.
  2. 이미지 용량이 커진다.
  3. 시간이 많이 낭비된다.(빌드하는 과정)
  4. 런타임 버그들을 만날 수 있다.

위의 이유들로 인해, Python 환경에서는 Alpine Linux보다는 Debian 기반의 slim 이미지나 Ubuntu 기반 이미지를 사용하는 것이 더 적합하다.

🌐References

✨10월 회고

Chanho Lee
다양한 분야를 공부하고 있는 학생

이전 글에서 10월 목표를 적었었다. 내 목표는 이루었는지 점검해보고자 이 글을 작성한다. 10월을 잘 살지 못 해서 이 글을 적는 것이 조금 무섭지만 그래도 적어본다.

독서

  • 몰입의 즐거움
  • 원씽
  • 오픈

이렇게 3권의 책을 읽었다. 책 읽으면서 반성이 되기도 하고, 내가 지금 너무 많은 것을 하려고 있는가에 대해 또 다시 생각하게 되면서 지금 나에게 당장 필요 없다고 생각하는 부분들은 없애고 있다.

자기 1시간 전에 독서하는 것도 목표였는데 이것도 첫 주는 잘 됐다. 근데 자기 전에 졸려 죽겠는데 인증까지 하는 것이 너무 귀찮아서 관두게 됐다. 지금은 책을 읽고 싶을 때나 여유롭다고 판단되는 주말 아침에 조금씩 읽고 있다.

현재 읽고 있는 책은 소프트웨어 엔지니어 가이드북이다. 이 책을 다 읽고 여유가 된다면 다음 책으로는 한강 작가님의 작별하지 않는다를 읽어 보고 싶다.

스터디

  • ETL 스터디(러닝 스파크): 데이터 엔지니어, 소프트웨어 엔지니어 분들과 함께 공부했던 스터디라 실제 현업에서의 내용도 들을 수 있었고, 배울 점이 정말 많았던 스터디였다. 한 가지 아쉬운 점은 책을 다 읽고 프로젝트를 하는 것까지 목표였는데, 졸업 작품이 마무리가 되어 가다 보니 바빠져서 집중할 시간이 없다고 판단하여 그만두었다.
  • 알고리즘 스터디(Coursera Stanford Algorithms): 이 강의는 알고리즘을 수학적으로 접근하는 부분들이 많아 좀 많이 어려웠다. 그렇지만 또 다시 알고리즘을 개념적으로 접근하여 공부하니 시간 복잡도 계산이 훨씬 수월해졌고, 알고리즘 문제를 푸는데도 도움이 됐다.
  • DDIA 스터디(데이터 중심 애플리케이션 설계): 이 스터디에도 DE, SWE 분들이 대부분이었어서 많은 걸 배울 수 있던 스터디였으나 지금의 나에게는 너무 어려운 내용이기도 하고, 마찬가지로 졸업 작품 때문에 너무 바빠져 그만두었다.

적다 보니 다 그만둔 내용 밖에 없는 것 같다. 아무래도 졸업 작품 마무리가 곧 다가오다 보니 그쪽에 더 신경을 쓸 수 밖에 없었다. 데이터 중심 애플리케이션 설계 책 같은 경우에는 나중에 바쁘지 않을 때 스터디를 다시 해야 할 것 같다. 책이 어렵기도 하고, 다른 분들과 함께 경험을 위주로 얘기하면서 공부하면 더 도움이 될 책이라 생각한다.

개인 공부

인과추론: 첫 주에 열심히 하다가 그만두었다. 정말 공부해보고 싶었던 분야지만 현재 내가 해야 할 공부는 아니라 판단했다. 지금은 취업 준비를 위한 공부가 더 우선이라 생각했다.

자바스크립트: 코어 자바스크립트 책을 다 읽었다. 정말 유익한 책이라 생각한다. 핵심만 들어가 있고, 책의 두께가 두껍지 않아 편하게 읽을 수 있었다. 이것도 사실 내가 프론트엔드로 취직할 것도 아니고 꼭 필요한 것은 아니지만 그래도 책이 얇아 읽어볼 수 있었다.

학교 수학 강의: 선형대수학, 확률 및 통계 그리고 고등학교에서 공부했던 수학에 약간의 정보 이론이 추가된 교양 강의다. 많은 분야를 한 번에 다루고 예전에 공부했던 것들이라 큰 어려움은 없었다.

졸업 작품

프로젝트 자체는 거의 마무리가 되어 전체 과정을 계속 반복해보면서 우리가 만든 알고리즘이 잘 작동되는지 확인했다. 그러고는 포스터를 만드는 것에 집중했다. 팀 미팅으로 주 3번 정도는 필수로 했고, 교수님과의 미팅은 매번 있던 것처럼 2주에 한 번씩 진행했다. 팀 미팅에는 언제나 조교님께서 조언을 해주시고, 방향성을 잡아주셔서 포스터도 깔끔하고 예쁘게 만들 수 있었다.

졸업 작품은 나중에 따로 회고를 올릴 예정이다.

취업 준비

이력서 작성

영문 이력서 작성을 마무리 했고, 가장 들어가고 싶었던 기업에 지원한 상태이다. 서류 합격을 했고, OA까지 본 상태이며 지금은 면접을 준비하고 있다. 이 채용 프로세스가 끝나면 한국어 이력서도 작성해둘 예정이다.

이전 프로젝트 코드 정리

지금까지 학교에서 진행했던 프로젝트를 아직 정리하고 있는 상태이다. 2000줄이 넘는 프로젝트도 있고, 했던 일들이 너무 많아 정리하기가 쉽지 않았다. 주석도 영문으로 바꾸고, 전체적으로 어떻게 작동되는지 구조를 파악하면서 공부 중이다. 특히 이력서에 적었던 프로젝트를 중심으로 정리하고 있다.

알고리즘

원래 목표는 매일 세 문제씩 푸는 것였지만 매일 아침에 일정 시간 내에 풀고 있고, 해설을 보면서 다시 생각해보면 시간이 확 가버려서 한 문제만 풀고 있다. 리트코드 기준으로 easy, medium 문제를 풀면서 문제에 어떻게 접근할지를 중심으로 생각하면서 풀고 있다.

네트워킹

강북에도사람있또

글또에 강북에도사람있또 모임에 한 번 참여했다. 노원에서 만날 줄 알았는데 의외로 충무로에서 모임을 진행했고, 오랜만에 꽤 멀리 놀러 가서 좋았다. 또, 개발이나 대학원 얘기 그리고 이것저것 다양한 주제의 얘기들도 할 수 있고, 들을 수 있어서 좋은 시간이었다. 이 모임을 통해 내 고민도 어느 정도 해결이 됐다. 그때 가장 큰 고민은 '어떤 분야로 앞으로 나아가야 할지 잘 모르겠다' 였는데 범용성을 생각하거나 완전히 하나의 분야만 파거나 둘 중 하나를 선택하라고 하신 조언이 나에게 엄청 와닿았다.

어색함 반, 재미 반이었지만 새로운 사람들과 만나서 얘기하는 건 언제나 재밌다. 특히 내 고민을 쉽게 얘기할 수 있다는 것도 너무 좋고, 다른 분들의 고민이나 경험을 들어볼 수 있다는 게 너무 큰 재미라고 생각한다. 동기부여도 되고, 평소 못 나누던 얘기들도 할 수 있기도 했다. 역시 커뮤니티가 주는 힘은 크다고 생각한다.

당근 테크 밋업

당근 테크 밋업에 운 좋게 참여할 수 있었다. 난 Data/ML 쪽에서 강연을 들었고, 또 운 좋게 다양한 당근 팀들과 네트워킹을 할 수 있었다. 당근 팀들과 네트워킹을 하는 것은 선착순이었다. 정말 빠른 속도로 네트워킹이 마감되었는데 채용 팀과의 네트워킹은 못 한 것이 매우 아쉬웠다.

다녀와서 내린 결론이 하나 있었다. 지금은 MLOps 직무는 아예 고려하지 않기로, 그리고 데이터 엔지니어링도 역시 생각하지 않기로 했다. 이런 직군은 보통 다 이직을 통해 되거나 직장에서 시켜서 일을 하게 되는 직무인 걸 알고 있음에도 '혹시나 신입에게 기회가 있지 않을까'라는 생각에 고려하고 있었는데 깔끔하게 놓아주기로 했다. 이건 데이터 엔지니어링 스터디를 진행하면서도 생각하게 된 결과이다.

그리고 만약에 MLE가 되고 싶다면 ML 기본기와 코딩 테스트는 잘 준비해야 한다. 유저 서비스 경험도 있으면 좋지만 신입에게 그것까지 바라지는 않는다고 하셨다. 그리고 프로젝트 경험은 역시나 캐글을 추천하셨다.

영어 공부

ChatGPT가 Advanced Voice Mode라는 기능을 발표했길래 영어 회화 공부를 해보려 했는데 상당히 쉽지 않았다. 스피킹은 난생 처음 해보는 거라 너무 어려웠고, 그러다 보니 습관으로 이어지지 않았던 것 같다.

11월 목표

  • 독서, 네트워킹은 취업에 방해되지 않는 선에서 조절
  • 리트코드 매일 1문제 풀기
  • 면접 준비
  • 졸업 작품 전시회 마무리
  • 스터디X

10월 목표에 비해 매우 단순해졌다. 면접을 앞두고 있다 보니 많은 것을 할 수 없는 상태이다.

나름 구체적으로 적었는데 또 나 자신과의 약속을 못 지킬까 두렵기도 하다. 그래도 내 블로그에 박제했으니 나 자신에게 부끄럽지 않으려면 고쳐야 하지 않을까. 결과가 어떻든 노력은 해보자.

📖 오픈

Chanho Lee
다양한 분야를 공부하고 있는 학생
정보

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

나는 리뷰어다 2024

Book Info

책 이미지를 클릭하면 교보문고 사이트로 이동합니다!

책

  • 제목: 오픈
  • 저자: 박수홍
  • 출판사: 한빛미디어
  • 출간: 2024-09-30