Opinion

입사 1년 회고

October 29, 2018

입사 1년 회고

어느덧 지금 회사에 다닌지도 1년이 넘었다. 근래 이 곳에서 별로 해둔 일이 없다는 생각을 많이 한다. 그래서 이력서를 정리하거나 면접에서의 내 모습을 상상할 때도 딱히 무슨 말을 해야 할지 떠오르지가 않는다. 꽤 심각한 문제가 아닌가 하는 느낌을 받고 이렇게 입사 1년을 회고 해보려고 한다.

아무래도 회고를 하는 목적상, 기술 분야 위주의 서술이 될 것 같다. 생활 관련 부분, 혹은 개발이라고 해도 피쳐 추가/변경은 비즈니스 로직 덩어리이기 때문에 (애플리케이션 설계, 디자인 이야기를 할 게 아니라면)딱히 쓸 이야기가 없다.

1. 배운 것

전통적인 웹 서비스 아키텍쳐를 AWS 위에서 구현하기

Name Server

  • Route 53
  • 도메인 구입과 네임서버 설정
  • HTTP → HTTPS 리다이렉트를 Route53에서 S3 버킷을 이용해 한다는 점이 재밌었음

Load Balancer

  • Application Load Balancer
  • Listener, Listener Rule을 이용한 리버스 프록싱
  • Target Group, Auto Scailing Group을 이용한 스케일 아웃

Computing

  • EC2
  • AMI 프로비저닝
  • Lambda

Storage

  • RDS의 리플리카, 클러스터 개념
  • Elastic Cache의 리플리카
  • S3의 Region간 리플리카

Monitoring

  • CloudWatch
  • Athena

Static Resource Delivery

  • CloudFront

AWS VPC를 이용한 망 분리와 VPN 운영

  • AWS Availablity Zone 개념
  • Private/Public Subnet 개념
  • Internet Gateway, NAT의 개념
  • Routing Table을 이용한 VPC 내부 통신
  • OpenVPN을 이용한 제한적 망 접속

MySQL 운영 및 쿼리 튜닝

  • EXPLAIN 문을 이용한 쿼리 분석 및 튜닝
  • ORDER BY, GROUP BY 등의 성능 저하를 피하기 위한 다양한 방법 적용

프로덕션 환경의 DBMS 엔진 변경 (MySQL → AWS Aurora)

  • 다운 타임을 최소화하면서 엔진 변경
  • 클러스터 엔드포인트 개념
  • Read Replica Auto Scailing 가능
  • Failover시 애플리케이션에서의 헬스 체크

2. 내가 도입한 것

AWS Athena 도입 (동료분의 제안으로 시작한 거라 좀 애매)

  • 기존 ElasticSearch에 적재하던 로그를 S3, Athena를 이용해서 적재하고 쿼리
  • 미해결 JSON 파일이 깨지는 문제 발견 (Python Logger가 Thread-Safe하지 않음)

로컬 개발 환경을 Dockerize

  • Flask, Celery, MySQL, Redis를 Docker Compose로 묶어 관리
  • Python의 site-packages를 관리하기 위해 Docker Volumne 사용
  • MySQL의 데이터가 컨테이너 재시작 후에도 삭제되지 않게 하기 위해 Docker Volumne 사용

Zappa를 이용한 마이크로 서비스를 프로덕션에 적용 해보기

Flask Best Practice 고민 및 공유

  • API 단위의 데이터베이스 트랜잭션 관리
패키지 구조 고민…
  • 결국 Django 스타일로 가는 것 같다. (앱/서비스 패턴)
  • 고민중 한 프로젝트에서 앱/서비스 간에 공통되는 모듈은 어떻게 관리하는게 좋을까? (common 패키지 말고 다른 해결책은 없을까?)
  • 고민중 프로젝트별로 공통되는 유틸리티들은 어떻게 관리하는게 좋을지 고민이 필요 (순수 유틸리티라면 내부 라이브러리-패키지로 관리?)
  • 고민중 Python 생태계의 경우 주로 컨트롤러/모델 모듈로 나누어 개발하는데…
  • 모델 클래스에는 데이터베이스 스키마 정보만 남기고 서비스 레이어를 따로 만들어 개발하는 것이 더 좋지 않을까?
테스트 환경 고민
  • 데이터베이스 스키마 자동 최신화 (using Alembic programmically)
  • 자동 롤백 데이터베이스 세션 Fixture
CircleCI 도입
  • Flake8 Lint
  • Pytest 실행
  • 위 단계를 통과시 배포 버튼 클릭을 통한 매뉴얼 배포 (Zappa를 이용한 배포를 진행하기 때문에 복잡한 AWS 네트웍 설정과 씨름할 필요 없음 Just zappa deploy www)

메인 서버 테스트 환경 도입

  • Flask 앱을 팩토리 패턴으로 생성하지 않기 때문에 테스트용 설정 주입이 쉽지 않음 (미해결 팩토리 패턴을 적용하고 나서 개선 필요)
  • Alembic Revision이 데이터베이스의 모든 히스토리를 담고 있지 않기 때문에, MySQL 스키마 덤프를 사용해 스키마 최신화하고 매 테스트 케이스마다 TRUNCATE 문으로 테이블 청소 (미해결 Alembic과 실제 스키마를 동기화 하고 나서 개선 필요)
  • Pytest와 FactoryBoy의 적극적으로 쓰다보니… 사용법을 일반화하려 할 수록 사용법이 복잡해지고 규칙이 늘어나는데, 적정 지점을 찾는 것이 중요한데 해보면서 결정할 수 밖에 없는 것 같아 아쉬움

개발 환경에 IaC 적용

  • 개발 조직이 커짐에 따라 테스트 해야 할 코드가 많아지고 개발 환경이 부족하게 됨
  • 개발 환경을 마구 찍어내기 위해 IaC를 고민하고 AWS CloudFormation을 이용

고민중 JIRA의 적극적 사용

  • 흠 겨우 이제 시작해서…
  • JIRA 자체 보다는 내부의 제품 개발 프로세스를 확립하고 이를 실행하려는 의지가 훨씬 중요한 것 같음

3. 배우고 싶은 것

로그 수집 및 모니터링 시스템 구축

  • API 로그를 쌓고 Athena로 보고 있기는 하지만… 마케팅/사업 조직 등에서 요구하는 데이터를 동적으로 쌓고, 쉽게 정제/가공할 수 있으며, 원하는 메트릭으로 쉽게 볼 수 있는 시스템이 있어야 할 텐데 그런 점이 매우 부족한 상황
  • 동료분이 로깅 서비스 구축을 생각하고 계시는데 그 때 같이 하고 싶음

Docker를 이용한 프로덕션 서비스 운영

  • 개발 환경에서는 Docker를 사용하고 있지만, 프로덕션에서 사용하고 있지 않음
  • CI/CD 시스템이나 로깅/모니터링 시스템을 구축할 때 Docker를 활용할 확률이 높을 텐데 이 때 같이 고민해 보는 것도 좋을 듯

많은 트래픽과 대용량 데이터

  • 이건… 어쩔 수 없나?
  • 실제 유저가 많지 않다고 해도 내부 시스템의 일부에서는 많은 트래픽/데이터가 발생할 수도…?

4. 도입 해보고 싶은 것

AMI 빌드 자동화

  • Docker를 쓰는 것과는 별개로 아직은 생각보다 많은 부분을 IaaS로 처리해야 하는데, 이 경우 AMI 빌드는 필수
  • 이 때, 프로비저닝을 자동화하는 방법이 필요함
  • 이는 IaC와도 연관이 되어 있는 문제라서 중요함

전체적인 CI/CD 적용

  • 이슈 트래커 → 브랜치에서 개발 → 정적 분석 & 테스트 & 빌드 → 독립적인 새 QA 환경에 배포 → 프로덕션 배포의 프로세스를 확립할 필요 있음
  • 혼자서는 할 수 없는 문제… 우선 업무 프로세스 확립이 먼저이고, 개발팀 뿐 아니라 전사에 이 엄격한 제품 개발 프로세스가 중요하다는 인식이 필요하며 개발팀 내부에서는 이 문제를 책임지고 드리븐할 사람이 필요

더 좋은 애플리케이션 디자인

  • 일단 지금까지 이 쪽으로는 책도 연습도 게을리 했음
  • 관심을 더 많이 갖는 것이 우선적으로 필요
  • 진짜 어렵다… 정확한 베스트 프랙티스 조차 모를 정도로 어렵다…
  • TDD, DDD, CQRS…?!

감상

늘어놓고 보니 생각보다 한 게 있기도 하고, 또 1년 동안 겨우 이거 했네 하는 느낌을 받기도 한다. 올 해 1년을 알차게 보냈을 수도, 아닐 수도 있겠지만, 문제는 내가 5년차, 내년이면 6년차가 된다는 데 있다. 지금 내가 하는 고민들을 이제서야 해도 되는 걸까? 그러나 어쩌겠나, 지금부터라도 잘 해야지. 이런 생각을 5년 째 하고 있다는 건 함정.

언제나 더 좋은 시스템이 가능할 거라 믿고 실천합니다.

내 이력서 짧은 자기 소개란에 쓰여있는 문장이다. 이 회사에서의 1년 동안, 내가 저 말을 잘 실천했다고 자신있게 말 할 수 있을까? 이 질문에 지금 대답하기 보다는 앞으로 ‘그렇다’라고 대답할 수 있게 사는 것을 목표로 하는 게 더 좋을 것 같다.