2026.01.01. 23:50
2025년도 결산
비전공자로 3월에 6개월짜리 국비 과정을 수료했고, 다행히 일은 바로 구했다.
그런데 일을 시작하자마자 든 생각은 딱 하나였다.
“기본기가 너무 부족하다.”
국비 과정 동안 서비스를 처음부터 끝까지 배포해본 경험이 없었다.
포트폴리오도 대부분 로컬호스트에서만 돌아갔고,
클라우드 배포도 강사가 시키는 대로 버튼만 눌러본 수준이었다.
솔직히 말하면 국비 과정에서는 꽤 자만했다.
모든 팀 프로젝트에서 PM을 맡았고, 개발도 주도적으로 했으며
GPT API를 붙여 RAG까지 구현하면서
“이 정도면 나 꽤 하는 거 아니냐”는 착각을 했다.
하지만 졸업 후 혼자 개발을 해보니 현실은 정반대였다.
레퍼런스 코드 없이는 게시판 하나도 제대로 못 만드는 수준이었고,
배포를 다시 해보려니 버튼 딸깍 말고는 아무것도 이해하지 못했다.
결국 나는
“강사가 쳐준 코드만 복사해서 따라 치던 사람” 이었다.
국비 프로젝트도 데이터 분석·딥러닝 위주였고
웹 개발은 사실상 찍먹에 가까웠다.
게다가 실무에 투입된 프로젝트들이 웹스퀘어 기반이라
이대로 가면 진짜 위험하겠다는 불안이 크게 올라왔다.
“일단 하나라도 제대로 만들어서 배포해보자”
그래서 목표를 하나 정했다.
“아주 단순해도 좋으니, 혼자서 서비스 하나를 만들어 배포해보자.”
국비에서 리액트를 독학으로 한 달 정도 다뤄봤고,
회사에서는 스프링을 쓰고 있었기 때문에
공부 겸 Next.js + Spring으로 블로그를 만들어보기로 했다.
결과는… 자신감이 산산조각 났다.
TypeScript, 라우팅, 디렉토리 구조, 레이어 분리, SSR 처리까지 겪으면서
예전엔 “프론트엔드? 그거 쉬운 거 아니냐”라고 생각했던 내가
“쉬운 건 하나도 없었고, 문제는 나였다” 는 걸 깨달았다.
리액트는 공식 문서로 공부했지만
국비 커리큘럼에는 구조 설계 같은 내용이 없어서
디렉토리 분리조차 제대로 몰랐다.
국비에서 만들었던 포트폴리오를 재활용하려고 열어봤지만
남은 건 내 실력 부족을 확인한 기억뿐이었다.
그래도 백엔드는 JWT 구현 경험 덕분에 일부 재활용할 수 있었다.
로컬 완성 → 배포의 벽
퇴근 후, 주말, 연휴를 쪼개서npm run dev와 이클립스 실행 버튼으로 돌아가는
로컬 블로그를 완성했다.
(이때가 5월 말~6월 초쯤)
스프링 시큐리티, 설정 파일, 테스트 코드 등
국비에서 “찍먹”만 했던 것들을 다시 정리했고
Next.js도 공부하면서 어떻게든 완성했다.
문제는 배포였다.
막상 배포를 하려니
배포가 정확히 뭔지
빌드와 컴파일 결과물이 뭔지
언제 어떤 걸 써야 하는지
개념만 알고 실제로는 하나도 이해하지 못하고 있었다.
GPT를 켜고 미친 듯이 질문하다가
결국 하나의 결론에 도달했다.
“홈서버를 직접 올려보자.”
홈서버 구축: 진짜 공부의 시작
이유는 두 가지였다.
클라우드 비용 폭탄이 무서웠고
직접 세팅하는 게 훨씬 공부가 될 것 같았다
집에 굴러다니던 구형 노트북에
Windows를 밀고 Ubuntu 22.04 LTS를 설치했다.
(USB가 없어서 다이소에서 하나 사 옴)
공유기에 접속해 IP를 고정하고
일단 내부망 테스트부터 시작했다.
포트포워딩은 나중으로 미뤘다.
Spring JAR 파일과 Next.js 빌드 결과물을 옮기고
node, JDK 등 필요한 것들을 하나씩 설치해 배포를 띄웠다.
그리고 예상대로… 에러의 향연이 시작됐다.
SSR, CSR, 그리고 nginx
문제를 파다 보니 원인이 보였다.
SSR: 같은 서버에서 돌아서
localhost:포트요청 가능CSR: 클라이언트에서 요청 → 서버가 못 받음
해결책은 두 가지였다.
Next.js의
/app/api라우트 사용nginx 리버스 프록시 구성
GPT와 고민 끝에 nginx를 선택했다.
어차피 HTTPS도 해야 했고,
정적 서빙 등도 공부할 겸 제대로 해보기로 했다.
nginx 리버스 프록시를 올리고
내부망에서는 mkcert로 HTTPS 테스트,
외부 공개를 위해 포트포워딩, 방화벽 설정 후
certbot + Let’s Encrypt로 HTTPS 적용
무료 DNS까지 받아서 실제 배포 완료.
이때가 7월 중순이었다.
처음으로
기획 → 개발 → 빌드 → 배포 → 운영
을 전부 혼자 해본 순간이었다.
“아, 이게 개발이구나” 싶었다.
도커와 배포 자동화 흉내
계속 개발하다 보니
빌드 → 파일 옮김 → 테스트 → 터짐
이 과정이 너무 비효율적이었다.
그래서 결국 Docker를 도입했다.
Dockerfile 작성
docker-compose 구성
환경변수 분리
이후에는
build → push → pull → up
이 네 단계만으로 배포가 되게 만들었다.
GitHub Actions나 Jenkins도 도전해봤지만
지금 실력으로는 무리라고 판단해서
CI/CD는 욕심내지 않고 수동 배포로 마무리했다.
이때가 8월.
잠시 멈춤, 그리고 CS의 힘
배포까지 끝내고 나니 살짝 지쳤고
업무도 바빠져서 한 달 정도 손을 놓았다.
대신 이 기간에
자료구조
CS
정보처리기사
를 공부했다.
의외로 이게 실무에서 바로 도움이 됐다.
천 단위 페이지를 관리하는 프로젝트에서
요구사항이 바뀌면
비슷한 요소를 가진 페이지를 전부 찾아 수정해야 했는데
IDE 검색만으로는 너무 비효율적이었다.
그래서 직접 로직을 짜서
페이지들을 검사·조회하고
CSV로 뽑아 엑셀로 정리했다.
불필요한 작업 시간이 크게 줄었고
작업 분배도 훨씬 수월해졌다.
이 시점이 10월.
실무에서 체감한 성장
10월 중순, 첫 프로젝트에서 철수하고
작은 ERP 프로젝트에 투입됐다.
이때 블로그 프로젝트의 효과를 확실히 느꼈다.
Nuxt를 처음 써봤는데도 금방 적응했고
공통 개발을 하면서 디자인 패턴을 실제로 써봤고
JPA, Jenkins도 제대로 다뤄보기 시작했다
예전처럼
엔티티만 선언해놓고 MyBatis로 트랜잭션을 처리하거나
JPA를 무식하게 쓰던 방식에서 벗어나
영속성을 이해하고 사용하는 단계로 넘어갔다.
이게 11월.
지금, 그리고 정리
이후 블로그에 리액트 취약점이 터져
도커 컨테이너가 내려가는 일도 있었지만
직접 패치하면서 문제를 해결했다.
12월 24일, 정보처리기사 합격 발표.
그리고 2026년 1월 1일.
돌아보면
국비 수료 시점의 나는 개발자를 흉내 내던 사람이었고
지금의 나는 부족하지만 최소한 스스로 문제를 해결하려는 개발자가 된 것 같다.