2년차 주니어 개발자 / 휴학생 / 예비 군인의 미리 쓰는 2022년 회고록
Post
취소

2년차 주니어 개발자 / 휴학생 / 예비 군인의 미리 쓰는 2022년 회고록

2년차 주니어 개발자, 휴학생, 예비 군인 등 많은 수식어가 생긴 올해의 회고록은 일찍 써보려 한다.

서론

이 회고록은 왜 일찍 쓰여지는 걸까?

작년 회고록 에서도 언급되었지만, 군대를 가야 합니다.

최대한 올해가 가기전에 입대를 하기 위해, 두 번이나 SW 개발병에 지원을 했었지만, 첫번째는 면접에서 탈락, 두번째는 서류에서 탈락했습니다.

아무래도 SW 개발병 점수에 포함되는 학력 점수가 영향을 많이 줬지 않았을까 생각하고 있습니다… (휴학을 너무 빨리 했습니다 ㅠ)

아무튼, SW 개발병으로 개발을 하면서 군대 생활을 하기엔 힘들겠다 판단했고, 기술행정병으로 지원했고 정보체계운용/정비 특기로 11월 28일에 입대합니다.

11월 언저리 넘어서야 올해 회고록 좀 써볼까 해왔었지만, 올해는 좀 서둘러봅니다.

올해는 큰 변화가 있었을까?

솔직히 큰 변화는 없던 한해 같습니다.

매일 아침 일어나 리모트 근무를 시작하고, 업무 시간이 끝나면 저녁을 먹고 독서 / 알고리즘 공부 / 유튜브 또는 넷플릭스 보기만 반복을 했던 것 같습니다.

어쩌면 2년동안 반복되는 생활에 큰 변화를 주면서, 언젠가는 해야 하는 의무를 다하기 위해 올해가 가기전에 입대를 하기로 한 것 같습니다.

올해는 뭘하며 지낸걸까?

회사 업무는 끝이 없었다.

JIRA 사이트에서 올해 내가 맡았던 이슈들 개수를 뽑았을 때 총 290개(2022.10.12 기준)가 나왔습니다…

처음에 뽑고나서 이렇게까지 많이 했었나? 라는 생각이 들었지만, 한번씩 제목들을 살펴봤더니 모두 기억에 남아있는 내용들이었습니다.

그 중에 기억에 남는 업무들을 간접적으로 나열해보고자 합니다.

1. 어쩌다보니 실험실이 된 프로젝트

다른 서비스에서 제공하는 API를 활용해야 하는 업무가 있었습니다. 근데 해당 서비스에서 제공하는 API는..

  1. 여러 복잡한 과정들을 거쳐서 값을 복호화 / 암호화해야 했습니다.
  2. 우리 부서만 사용하는게 아니었습니다.

그래서 결국 해당 API를 한번 걸러서 간편하게 사용할 수 있는 서버리스 프로젝트를 만들기로 했습니다.

그렇게 해당 프로젝트를 활용할 부서들에서 사람들이 모여서 개발을 시작했습니다.

해당 프로젝트를 진행하기 위해 여러 기술 / 인프라들이 합쳐지기 시작했는데,,,

Python, Flask, Docker(docker-compose), DynamoDB, AWS ECR, AWS Lambda, AWS API Gateway, Terraform

Python과 Flask

개발 자체는 Python과 Flask 프레임워크를 사용했습니다. (개발을 같이 하는 동료들의 주 언어가 대부분 Python 이었고, 간편하고 빠르게 개발할 수 있을 거라 생각했습니다.)

Terraform

그리고 해당 프로젝트의 인프라를 구성할 때, 가장 먼저 고려한 건 Terraform 이었습니다.

Terraform을 이용해 기본적인 VPC 부터 Lambda까지 모든 인프라를 구성하기로 했습니다. 사내에서 여러 프로젝트 인프라들이 Terraform으로 구성되고 있던 추세였고, 사용성이 나쁘지 않다고 생각되어서 도입을 하기로 했습니다.

Docker

AWS Lambda에 .zip 파일을 이용하여 배포하는 방식이 아니라,

Docker Container Image를 빌드하고, 해당 Image를 AWS ECR에 올린 후에, AWS Lambda에서 해당 이미지를 가져다가 구동하는 방식으로 배포하려 했기 때문에 Docker를 도입했습니다.

물론, 개발 과정 중 서버를 띄우는 등에서의 편리함이나 DynamoDB를 쉽게 로컬에서 테스트하기 위함도 있었습니다.


배포 과정 중에 API Gateway에 접근이 안되거나, 리소스 제한 정책, 보안 그룹 등의 설정들이 제대로 파악되지 않아 이슈가 있었습니다만..

어찌저찌 해결되어 결국 위 기술들이 모두 혼합되어 지금까지 잘 작동하고 있습니다. (자세히 이야기를 남기기엔 애매하네요.. 우리 회사에도 기술블로그 글을 쓴다면.. 할만한 이야기겠네요 ㅎㅎ)

그리고 추가적인 유지보수 작업들도 잘 이어지고 있는 상황입니다.

2. Jsonb 컬럼 치워!

DB 테이블 중, 한 테이블에 Jsonb 라는 타입의 컬럼들이 많이 있는 상황이었습니다.

말 그대로 컬럼에 Json 문자열이 들어가있기 때문에, 빠르게 안에 있는 정보를 파악하거나, DB Query로 통계를 뽑는 등의 작업이 쉽지 않았습니다. (Json 문자열 안에는 배열도 있었고, 2번, 3번이 중첩된 구조도 있었으며, FK 형식의 id값도 들어가있었습니다…)

Json 문자열 구조가 들어가있다보니, 임의적으로 데이터를 마이그레이션 하기도 쉽지 않았죠.

언젠가 뜯어고치고 만다! 라는 마음을 가지고 있었는데, 올해가 가기전에 편안하게 처리를 하게 되었습니다.

하는 방법은 의외로 간단했지만 험난했습니다.

  1. 새로운 테이블 / 모델 생성
  2. 기존의 Jsonb 컬럼에 있는 데이터를 옮기는 마이그레이션 잡 생성
  3. 기존 Jsonb 데이터로 사용하고 있던 “모든 부분”을 찾아내어 새로운 모델로 대체하기

1번은 그럭저럭 기존 Jsonb 내에있는 내용을 그대로 가져다 쓰는 거기에 큰 이슈는 없었습니다. 2번은 계속해서 써오고 있는 최적화 방법으로 쉽게 해결했습니다. 단순히 Insert 또는 Update하는 것을 쪼개서 실행하는 것이죠.. 마이그레이션하는 대상이 몇 십만개씩이었기 때문에, 한번에 Insert / Update를 하게되어 마이그레이션을 하다가 서버가 힘들어하는 상황을 막으려 했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 임의적으로 모델이나 테이블명을 바꾸었습니다

module Migrations
  class MigrateHelloModelJob < ApplicationJob
    queue_as :default

      def perform
        max_id = HelloModel.maximum(:id)

        0.upto(max_id / 10_000 + 1).each do |i|
          ActiveRecord::Base.connection.execute <<-SQL.squish
            INSERT INTO future_hello_models (blah)
            SELECT blah FROM hello_models
            WHERE hello_models.id > #{i * 10_000} AND hello_models.id <= #{(i + 1) * 10_000}
          SQL
        end
      end
  end
end

3번은 코드 검색을 더불어서, 지금까지 해당 모델들이 쓰였던 부분들을 다 순회하면서 찾아내어 TODO 코멘트를 붙여놓은 뒤, 다 정리했습니다.

그리고나서 워낙에 큰 마이그레이션이다 보니, 사용자들이 해당 서비스를 비교적 사용하지 않는 새벽에 점검 화면을 띄우고 배포를 진행하였습니다.

해커톤, 공모전 그리고 토이 프로젝트들

올해도 마찬가지로 사이드 프로젝트들을 했고, Github 링크와 간단한 설명을 정리하여 남겨보겠습니다.

TTL

Velog / 티스토리 / 깃헙 블로그 등에 흩어져 있는 TIL을 모두 모아보는 서비스

해당 프로젝트를 하면서, 처음으로 celery를 도입하여 사용해보았습니다.

하지만 celery 큐를 통해 주기적으로 사용자의 TIL 글들을 동기화하는 job을 돌리는 과정에서,

서버 리소스의 최적화가 되지 않아 주기적으로 웹서버가 죽는 이슈가 있었습니다. 최대한 job을 나누고, 코드의 최적화를 시도했지만 계속해서 웹서버는 죽었고 결국 해당 기능을 잠시 죽이는 안타까운 백그라운드가 있었습니다

Github

Sellon

실시간 중고 상품 경매 서비스

실시간성을 위한 API들을 어떻게 만들지에 대한 고민을 많이 한 프로젝트였습니다.

자세한 내용은 Github README를 참고하면 될 것 같습니다.

Github

Peacepiece

일상생활 속 환경을 위한 활동을 기반으로 가상공간을 꾸밀 수 있는 웹플랫폼

기획자이면서, 디자이너이면서, 백엔드 개발자이면서, 프론트엔드 개발자였던 개인적으로 굉장히 힘들었던 프로젝트였습니다.

Github

Army Tiger

🪖 군대 일정을 Github 프로필에 남겨둘 수 있어요

군대를 가면서, 여러 지인이 군대 일정에 대해서 물어보았습니다. 그러면서.. 한번 마지막 사이드 프로젝트로는 요걸 만들어봐야겠다는 생각이 들어서 바로 만들었습니다.

만드는 김에 다른 사람들도 쉽게 사용하면 좋지 않을까 싶어서 사용법 등도 최대한 자세하게 작성했습니다.

Github

혼세혼세한 개발 공부

올해 계속 공부해온 것, 조금씩 찍먹을 해본 것, 공부해보려고 한 것들을 나열해보려고 합니다.

군대를 다녀와서 어떤 걸, 어디서부터 시작할지 결정할때, 참고할 수 있지 않을까 싶습니다.

[인프라]

  • docker
    • 기존에 서버에서 바로 웹 서버를 띄웠던 것들을 모두 Dockerize하여 구성하였습니다.
    • 간단한 웹 서버를 구성해야할 때, 필요한 요소들을 템플릿화 하는 작업을 진행했습니다.
    • 이후에는, 기본적인 auth API 및 문서화 등을 할 수 있는 템플릿까지 만들면 좋을 것 같습니다.
  • docker-compose
    • DB, Redis 등을 설치하여 구동하지 않고, docker container를 통해 구동하고, 이를 웹서버 등과 같이 사용하기 위해 docke-compose를 이용하였습니다.
    • 캐싱같은 최적화를 좀더 찾아보면서 익힐 필요가 있을 것 같습니다.
    • 최근에 docker-compose를 이용하여 개발을 할 때, alpha, beta, production 환경을 나누는 과정에서 좀더 간단하게 구성할 수 있는 방법을 찾고자 했지만 실패했습니다. 결국 파일을 모두 나누어 구성했습니다. 예를 들어, docker-compose.alpha.yml 라는 식으로..
    • 로컬에서 docker-compose를 이용하여 개발한 후, 이미지를 ECR에 올려서 ECS로 배포하는 작업을 시도했습니다. 이후에는 Terraform을 이용해 미리 인프라를 구성하고, 이 인프라와 함께 이 방식을 이용해보면 좋을 것 같습니다.
  • k8s
    • 회사 동료분이 쿠버네티스를 강력 추천하여, 공부를 해보고 있었습니다.
    • 먼저, Django 웹 서버를 k8s에 얹어서 사용해보려 했지만.. 공부 기간이 너무 짧았습니다.
    • 군대에 가서는 쿠버네티스를 공부하고 실제로 해볼 방법이 없을 것 같아, 잠시 보류하려 합니다.
  • Terraform
    • AWS 인프라를 구성할 때, 최대한 Terraform을 이용하여 구성하고자 했습니다.
    • 인프라를 이전에 어떻게 구성했는지, 어떤 구성요소가 필요한건지에 대한 파악을 하기 쉬웠습니다.
    • 다만, 어떤 오류가 발생하였을 때, Terraform이 바로바로 오류를 뱉지 않고 오랜 시간동안 기다리는 경우가 있어서 불편했습니다.
    • 좀더 편한 방법을 공부해보면 좋을 것 같습니다.

[웹 프레임워크]

  • Rails
    • 회사에서 계속 Rails를 이용한 개발을 했습니다.
    • 최근에는 Service, Form 구조를 활용한 모듈 분리를 가장 많이 시도했습니다.
    • 군대를 다녀와서도.. Rails가 여전히 살아있다면(제발) 토이 프로젝트로 Rails 개발을 해볼까 합니다.
  • Django
    • 사이드 프로젝트에서는 거의 Django를 활용했습니다.
    • 웹 개발을 할 때, 가장 손에 익은 게 Python / Django 조합이었습니다.
    • 하지만 대부분, drf를 계속해서 사용하는 반복적인 내용이었습니다.
    • Django와 더불어 새로운 기술을 더 활용하는 프로젝트를 진행하면 좋을 것 같습니다.
  • Koa.js
    • 큰 이유 없이 제 영어 이름이 Koa이기에, 한번 이름값(?)해보고자 시작해봤습니다.
    • 기존 Rails와 Django와 달리, node.js 진영의 웹 프레임워크들이 ORM을 쉽게 사용하는 방법이나, DB 마이그레이션을 효율적으로 관리하는 방법을 못 찾아서 그만두었습니다. 개발자에게 편리한 것이 많은 프레임워크들을 사용하다보니, 실망감이 컸던 것 같습니다. 나중엔 더 편해져있겠죠?
  • Spring
    • 이후에는 Spring도 사용하지 않을까하는 막연한 생각으로 공부를 해보려 했습니다.
    • 인프런에서, 인프런 아이돌님의 강의를 쭉 듣고 있습니다. 생각보다 강의가 너무 많아서, 군대에서도 계속 들어보는 장기전이 될 것 같습니다.
    • 처음에 강의를 들으면서 든 생각은, 이거 Django에서는 되게 쉽게 되는데.. 였지만, 일단 참고 들어보고 있습니다.

[언어]

  • ruby
    • Rails를 하면서, 자연스레 루비 숙련도가 늘었습니다. PS를 할때도 ruby를 이따금씩 쓰기도 했습니다.
    • single line if statement, ?/! method 등의 ruby에서 편한 문법을 좋아하게 되었습니다.
    • 하지만, Rails가 없는 루비는 정말 불편했습니다. 이후에 어떻게 공부를 이어나가야 할지 감이 오지 않습니다.
  • python
    • python은 웹 개발 뿐만이 아니라 여러 분야에 다 활용했습니다. 로컬에서의 파일 정리등에도 말이죠.
    • 하지만, pythonic 하게 코드를 짤 줄 아니? 라고 물어보면 No라고 답할 것 같습니다. Production Python 코드에 대한 경험이 적기도 하고, Python Senior 개발자들의 코드를 훔쳐?보는 경험을 할 기회가 별로 없었습니다. 좀더 심오하게 파고들 필요가 있습니다.
  • rust
    • 유데미 강의를 듣고 있었습니다. 군대를 가서도 해당 강의를 계속 듣지 않을까 싶습니다.
    • C/C++ 개발자들이 Rust로 옮겨가고 있는 추세로 보였고, 왜 그런지를 알고싶었습니다.
    • 웹 어셈블리를 이용한 웹 개발을 진행해보고 싶었습니다.
  • c/c++
    • 알고리즘 문제 풀이에만 활용했습니다.
    • c/c++로 production 코드를 개발하고 싶지는 않습니다. c/c++은 알고리즘 문제 풀이로만 활용하고 싶고, 이 생각은 변하지 않을 것 같습니다.

[PS / 알고리즘]

  • 아직 PS(Problem Solving) / 알고리즘 공부를 놓지 못했습니다.
  • 주로 BOJSolved.ac를 이용해 문제를 풀었습니다.
  • CodeforcesAtcoder는 자신감이 부족해서 문제 수 4,000 문제와 다이아 3 달성하기 전까지는 안할려 합니다.

  • 기본 구현 문제
    • 최근에 Production 코드에 집착을 하다보니, 기본 구현 문제를 빠르게 생각하고 짜지 못하는 것 같았습니다.
    • 그래서 최대한 Bronze, Silver 문제들을 가볍고 빠르게 짜는 연습을 했습니다.
  • 문자열
    • 구현 문제들을 풀면서, 많은 기본 문제를 풀게 되었습니다.
    • 하지만, 기본적인 KMP, Trie 등을 활용하는 문제를 최근에 안 풀어서, 숙련도가 낮아졌습니다. 예전부터 문자열 문제에는 손이 안가는 것 같습니다.
  • DFS / BFS
    • solved.ac 에서 lang:ko tag:dfs - @$me 라는 식으로 검색하여, 한국어 DFS 문제 중 내가 안 푼 문제를 검색하여, 난이도 순으로 쭉 풀고 있었습니다.
    • 채용 코테 또는 알고리즘 대회 등에서도 DFS/BFS는 무조건 한번은 나온다는 생각이 있기 때문에, 최대한 빠르고 정확하게 짜는 연습을 해보고 있습니다.
    • 생각보다 DFS가 많은 알고리즘의 기초라는 사실을 종만북을 다시 읽다가 깨닫게 되어서, 깊게 파보고 있습니다.
  • 트리
    • 트리와 쿼리 시리즈를 계속 풀어보려고 트리 알고리즘들을 공부해보고 있었습니다.
    • 하지만.. 트리랑은 제 머리가 맞지 않나 싶을 정도로 안 풀렸지만요.. 일단 LCA / Sparse Table 들을 활용하는 기본 트리 문제를 다 풀어서, 배수진을 칠까 합니다.
  • 기하
    • 기하는 알면 쉽지만, 모르면 못푸는 문제가 너무 많습니다. 이차원 벡터 등의 구현체들을 하나씩 만들어두면서 활용하고 있습니다.
    • 최근에 볼롤껍질, 회전하는 캘리퍼스 문제를 다시 풀어봤습니다. 역시나 알고나면 너무 쉬운 문제였습니다.
  • 정수론
    • 대학에서도 수학 공부를 별로 안했는데, 알고리즘 문제 풀겠다고 수학 공부를 하고 있는 저를 보고 참 웃겼습니다.
    • 정수론 책들을 사서까지 보고 있었는데, 군대가서 아마 요 책들을 읽지 않을까.. 싶네요.. 하하..
  • 탐색
    • 몇달전에야 삼진탐색을 제대로 알게 되었습니다. 하지만 카테고리를 보지않고 “이 문제 삼진 탐색이다!”하는 연습은 더 필요할 것 같습니다. 아직 이진탐색을 알아채는 것도 좀 늦는 것 같습니다 ㅠ
  • DP
    • DP 문제들을 보고, 와 이거 DP다! 를 알아채는 시간은 줄었지만, 빠르고 간결하게 짜는 걸 더 연습해야 합니다.
    • 그리고 한번 긁어서 되는 기본적인 DP 문제들보다, 이제 DP 최적화 기법들을 공부해봐야 할 것 같습니다. 아마 koosaga 님의 글을 참고해서 더 공부해야할 것 같습니다. 세상에, 너무 공부할게 많네요.

자격증을 땄다?

COS Pro 1급 Python정보처리산업기사를 땄습니다.

두 자격증을 따는 데, 긴 기간을 쓰지는 않았습니다.

Cos Pro는 시험 전날에 무슨 문제가 나왔었나 찾아보는 정도였고,

정보처리산업기사는 필기 한달, 실기 2주정도 자격증 책을 보고 공부(라고 하고 암기)했습니다.

기존에 알고리즘이나 CS를 계속 공부하고 있던지라 그렇게 어렵지는 않았습니다.

AWS 자격증도 따고 가고 싶었는데, 점점 미루고 미루다가 못 따고 가네요..

결론

올해는 일 / 사이드 프로젝트 / 알고리즘 공부 / 유튜브, 넷플릭스 / 잠 의 반복이었지 않나 싶습니다.

곧, 군대에 입대합니다. 내년에는 회고록을 쓸 수 있을지 잘 모르겠습니다.

군대에 있으면서 시간이 날 때마다 개발 공부를 하고는 싶습니다.. 하게 된다면 그 내용들을 정리하는 글을 써봐도 좋을 것 같습니다.

아무튼 다치지 않고 군대 잘 다녀오겠습니다.

충성.

This post is licensed under CC BY 4.0 by the author.

[BOJ] 16942 문자열 접기

[BOJ] 2618 경찰차