🤔 개발과 함께한지 3년... 벌써?
생각해보면 참 신기하다.
단지 웹사이트를 보고 HTML, CSS만으로 시작한 사이트 클론 퍼블리싱을 시작으로
프론트엔드 개발, 서버 개발, 사이트배포, 개발자로 취업까지 하게 되었다니...!
개발을 시작한건 늦다면 늦은 나이 29살 즈음이었지만,
어느 것을 했을 때보다 강한 성취감을 느꼈고, 개발과 함께한 3년이 지난 지금에도
개발에 임할 때의 태도는 변하지 않았으며 매번 나를 성장시켜주고 있다는 생각 또한
변하지 않고 여전히 나와 함께 머물고 있다.
개발은 여전히 나에게 가치 있는 삶이 무엇인지 알려준 지표이고
일생을 함께하고 싶은 친구다.
그렇기에 앞으로도 개발을 놓치지 않게 최선을 다 하며 살 생각이다.
오래오래 함께 하자!
🧑🏻💻 개발자로서 1년 6개월
지난 게시글 중 SI 회사에 취업에 성공했다는 이야기를한적이 있다.
그렇다... 나는 그 SI회사에서 1년 6개월이라는 시간을 보내고 있다.
잠시 개발자 신입( 경력무관 ) 취업 경쟁률을 이야기 해보자면,
그 당시에도 나는 200 : 1 경쟁률로 지금 회사에 입사하였고 얼마전에 회사에서
2명을 채용한다는 채용공고를 올렸는데 350명이 지원을 했다.
이제는 정말 취업이 더욱 쉽지않은 세상이 되어버린 것 같다...
(참고로 우리 회사는 법인 설립 5년이 채 되지 않은 SI 스타트업이다 ...)
🖥️Frontend
🌱2024.02.
입사를 하고 당시 회사는 모든 직원이 신입들로만 이루어져있다는 것을 알게 되었다.
아무도 이끌어 줄 사람이 없었고 특히나 팀원 간 커뮤니케이션을 통해 컨벤션을
설립해야 하는데 원할하지 못했던 것 같다.
프론트엔드 개발자들과 소통해보니 모두 필요성을 느끼고 있었지만 그 누구도
나서지 않고 있었고 그저 각자 업무가 너무 바쁘다는 이유로 소통비용 조차
쓸 여유가 없다는 것이었다.
하지만 나는 전혀 그렇게 생각하지 않는다.
함께 하나의 프로젝트를 완성시켜 나아가는 것이지, 개인 프로젝트가 아니기 때문에
협업은 반드시 커뮤니테이션이 통해 나아가야한다고 생각하기 때문이다.
때문에 소통의 중요성을 이야기하며 노력한 끝에 함께 소통하며
컨벤션을 맞추어 개발을 하기 시작했다.
이전에 모두 각자 개발하고 제 각각의 네이밍 케이스, 파일 구조를 가지고 있었다면
점진적으로 일관화된 컨벤션이 되어가고, 함께 소통하는 것이 즐겁고 뿌듯했다.
🐤 ~ 2025. 08
나는 주로 React의 상태 흐름(state flow), 컴포넌트 트리 구조에 대한 이해를
바탕으로 버그를 fix하는 것과 모듈 의존성 구조에 대한 이해를 바탕으로
참조 순환(circular reference) 문제를 해결하는 등 전체적으로 문제해결에
많은 일을 도맡아 해왔던 것 같다.
그리고 UX향상을 위해 많은 노력을 해왔던 것 같다.
컨텐츠가 넘치거나 없을 때의 경우 디자인이 빠져있는 경우가 꽤나 많았고
응답이 지연되는 상황에 대응하는 로딩 스피너, 스켈레톤 대체, 로딩화면 풀커버링 등
누락된 디자인들에 대해 필요성을 이야기하며 추가 디자인을 요구하며 프로젝트를
진행해왔다.
개발 부에서는 어색한 CSS의 개선과 tablet사이즈부터 mobile사이즈까지 대응 가능한
폭 넓은 반응형 style을 만들어내고 컴포넌트 Lazy import로 발생하는 Fallback을
커스텀 훅 useSoftNaviate를 구현하여 부드러운 전환을 만들어내는 등
UX향상을 정말 많이 신경쓰며 개발해왔다.
디자이너님과 소수 개발자분들은 UX향상 해준 것이 체감되고 중요하다고 말하지만
생각보다 사내 대다수 개발자들은 잘 모르겠다, 개발시간이 더 중요하기 때문에
그럴 시간이 없다 등... 오히려 좋지 않은 시선을 받는 경우도 많았다.
UX향상을 위해 보통 10분~ 30분을 더 투자하기도 하고 난해한 경우에는 그냥
야근을 해서라도 UX가 좋은 화면을 구현하고 싶은 것이 이기적인 욕심인가?
라는 생각도 들었다.
( 그리고 기한을 넘겨서 고객사에 피해를 끼친적도 없다 ㅠㅠ )
SI기업의 특성상 일정이 빠듯해서 동료들의 입장도 이해가 되긴한다.
그리고 지금의 회사에서 모두가 그렇다고 해도 스스로가 만족하지 못한다면 그저
혼자 더 작업을 하면 될 뿐이고, 나는 이러한 생각을 바꾸고싶지 않다 ㅎㅎ
💾Backend
뭐야 너 프론트엔드 개발자잖아.
아니다. 이제는 그냥 잡부라고 보면 될 것 같다.
기존에 Nest.js로 Node기반 서버를 만들어 직접 메모서비스를 배포해보기도 하였고,
Next.js와 Prisma를 활용한 Serverless Architecture로 개발하여 현재 실제 운영중인
경제학습 사이트도 개발한 경험도 있다.
JAVA Spring에서는 아주 단순한 버그나 확장성에 저해되는 구조를 리팩토링해본
경험도 있고 가장 크게 백엔드를 경험한 것은 Python서버를 개발한 경험이다.
개발한 Python서버는 사내 프로젝트중에 사업계획서를 분석해서 보완하면
좋을 부분이나 추가하면 좋을 내용 등을 LLM( GPT )을 프롬프트를 활용해서 내용을
반환해주는 일명 " 사업계획서 피드백 챗봇서버 "를 만들었다.
사실 이 부분은 대표님께서 신입 직원으로 Python을 다뤄본 컴퓨터공학과 개발자를
채용하였고 그 신입직원분이 초기 개발을 진행했다.
그런데 갑자기 그 분이 떠나게 되었다.
급하게 Python 개발자 파견 인력이 필요했고 때문에 신입 직원분은 사무실을 떠나
고객사에 배치되어 파견업무를 시작하게 된 것...
아무래도 서버 개발이니 내가 할 이유도 없었고 해도 서버개발자가 할 것 같았다.
하지만 사무실 배치 인력들은 Python을 본적도 없고 할 줄 모른다는 이유로
서버개발자들도 못한다고 단정지으며 안된다고 했다.
나는 Nest.js로 서버를 구현한 적이 있고 JAVA를 공부할 때도 사실 큰 흐름에 대한 것은
다르지 않다 라는걸 알고 있기 때문에 하면 할 수 있다 라고 생각했다.
결국 모두가 할 수 없다는 결론이 나왔고, 제가 해보겠다고 자진해서 Python서버를
이어서 개발하기로 했다.
🥧Python...
나는 프론트엔드 개발자이지만 한 눈에 알아 볼 수 있었다.
큰일났다. 아무리 그래도 그렇지 app.py에 모든 코드를 넣어버릴 줄은......
가장 우선적으로 프로세스, 로직의 플로우를 이해하기가 매우 어려운 상황이었다.
그래서 절차적으로 공부 계획을 짰다...
1. 파이썬 언어가 어떻게 작동하는지, 스레드는 어떤 방식으로 활용하는지
2. 파이썬 문법은 어떻게 활용하는지, 지금 코드에서는 어떻게 활용하고 있는 것인지
3. 사용되고 있는 핵심 라이브러리
이렇게 절차적으로 이해도를 가진 상태에서는 디자인패턴을 반드시 추가해야겠다는
생각이 들었다.
기본적으로 가장 친숙하게 활용해보았던 Nest.js와 유사한 패턴( MVC와 유사 )으로
폴더를 분기하여 유지보수에 더 유리하도록 리팩토링했다.
처음 파이썬을 프로젝트를 열어봤을 때 package.json 같은 패키지 관리파일이 없었고
공부하며 알아보니 requirements.txt 라는 폴더로 package list를 export하고 해당
txt파일을 기준으로 install할 수 있는 기능이 있다는 것을 알게 되었다.
그리고 전역에 패키지를 인스톨하는 기존 방식에서 venv를 활용하면 프로젝트 단위로
가상 환경에 패키지를 설치할 수 있다는 사실도 알게 되었다...
requirements.txt를 활용한 패키지 리스트관리, venv를 활용한 프로젝트 단위의
가상환경 패키지 관리를 설정하였고 얼마나 날것의 코드인지 알게되는 순간이었다...
하지만 챗봇 서버 특성상 중간에 요청을 취소할 수 있어야 했는데
기존에 작업했던 모든 라이브러리가 비동기적으로 활용 불가능한 라이브러리들 뿐이었다...
기본적으로 동기적으로만 작동한다면 응답 취소가 불가능하다.
또한 블로킹 형태가 되어 동시에 여러명이 요청을 하게 되면 응답시간이 지연되는
문제도 있었다.
때문에 http통신, dbconnection 라이브러리를 교체하여 논블로킹 방식으로 리팩토링했다.
pymysql => aiosql
requests => aiohttp
그리고 안전하고 정확하게 요청을 취소하기 위해서 직접 worker-pool을 만들어
요청할 때 받은 id를 pool에 가지고 있다가 취소한 경우 정확하게 해당 id요청을
취소할 수 있도록 구현하였다.
db커넥션 속도를 최적화 시키기 위해 db pool 또한 구현하여 처리속도를
약 2배 더 향상시켰고 결과적으로 처리속도는 약 4배 빨라졌고 취소 요청도 모두
성공적으로 작동하는 챗봇서버로 재탄생하였다.
그리고 토큰검증을 편리하게 활용하기 위해 기존 java spring서버로 구성되어있는
토큰검증만을 실행하는 api를 작업자에게 작업요청하고 이를 활용하기로 했다.
해당 api를 데코레이터로 구성하여 동기/비동기요청에 따라 분기처리하고
토큰을 검증하는 AuthGuard데코레이터로 만들어 간단하게 controller 매서드 위에
선언하여 활용하기도 했다.
🏠DevOps
⚙️API 자동생성
기본적으로 포지션이 프론트엔드이기 때문에 서버 개발자들과 요청 시 데이터 형과
필요한 데이터들에 대해 소통할 일이 많고 swagger-ui로 요청 데이터의 key, value를 확인하며
fetch api를 제작하게 된다.
나는 개발자를 준비하며 Swagger에 작성된 내용을 자동생성하는 OpenApi - generator를
구현한 경험이 있어 이를 사내 프로젝트에서도 기여하고자 했고, mustache파일을 직접 추출해서
경로를 지정하고 mustache파일을 직접 커스텀하여 swagger 기반으로 API를 자동생성할 수 있도록
package.json - scripts에 명령어를 추가하여 소통비용을 줄이기도 했다.
화면을 구현하는 것 역시 재미있지만, 개발 환경을 자동화하는 것도 정말 재밌는 것 같다.
🤵🏻Jenkins pipeline & 무중단 배포
기존에 구성되어있던 pipline은 대부분 sh파일을 통해서 직접 pid를 관리하며 down-time이
존재하는 레거시 방식으로 구현되어있었다.
프론트엔드 빌드파일은 직접 pm2를 활용하여 cluster mode로 무중단배포화 하기 위해
static html파일을 띄우는 것이 아닌, fastify로 구성한 server.js를 구현하고 node환경에서
무중단배포가 가능하도록 구현했고, 서버작업자에게는 Blue/Green 배포 방식으로 변경하는
것을 권장드렸다.
근데 1년전에 말한 것 같은데 아직 바뀌지 않은 것 같다...
조만간 내가 eginx에 추가 코드를 작성해서 무중단배포가 가능하도록 구성해야겠다.
pipline은 stage를 필요 구성으로 수정하고 각 처리마다 echo 메시지를 넣어 디버깅에 더욱
유리하게 구성하였고 execCommand를 좀 더 상세히 작성해서 서버가 띄워져 있다면 reload,
서버가 없다면 start 등으로 완전 자동화 방식으로 작업환경을 개선했다.
✍️마치며...
이렇게 돌아보며 1년 정도 회고를 해보니 정말 많은 경험을 했고 많은 일이 있었던 것 같다... 매번 생각하지만 스스로 개발자를 자처한다면 아무리 자기 포지션이 아니더라도 해낼 수 있다는 자신감을 가지고 뛰어들어보는 것도 정말 좋은 것 같다. 나는 그렇게 성장해왔고 덕분에 매번 개발이 즐겁거운 것 같다.