Search

네이버 부스트캠프 웹・모바일 10기 멤버십 6주차 회고

생성일
2025/09/28
URL
6주차 주말이 끝나가고 있다 크아악..!
이번 주말에는 늦잠도 자고, 평소에 하지 못했던 게임도 원없이 즐겼다.
(어제 문명5 저녁에 켰다가 새벽 3시까지 했다. 진짜 시간 순삭 게임.. )
오랜만에 충분히 쉬면서 머리를 비우니, 다음 주를 조금 더 힘차게 시작할 수 있을 것 같다.

나는 6주차에 무엇을 배웠나!

 미션

정적 파일과 Binary 데이터 학습

이번 주에는 이미지와 같은 정적 파일을 응답하는 기능을 구현했다.
처음에는 HttpResponse 클래스의 body 타입을 string으로만 정의해 두었기 때문에 텍스트 기반 응답은 문제가 없었지만, 이미지와 같은 binary 데이터를 다루려니 한계가 있었다.
그제서야 네트워크에서 전송되는 데이터가 모두 바이트 단위로 처리된다는 점을 떠올리고, body의 데이터 타입을 Buffer로 변경했다.
또한 문자열과 달리 binary 데이터는 인코딩 과정에서 손상될 수 있기 때문에 Buffer.concat을 활용해 안전하게 합쳤다.
결과적으로 이미지와 텍스트 등 모든 정적 파일을 일관성 있게 처리할 수 있는 구조를 만들 수 있었다.
다만 CS 연결고리 퀴즈에서는 OSI 7계층 기반 데이터 흐름을 제대로 설명하지 못했기 때문에,
차주에는 네트워크 데이터 흐름과 계층별 역할을 코드 구현과 연결하여 학습할 계획이다.

세션 저장소 설계

또 다른 고민은 세션 저장소를 설계하면서 세션 ID를 어떻게 생성하고 관리할지 고민했다.
세션 ID 생성 방법으로 crypto.randomBytescrypto.randomUUID를 검토하며, 각각의 동작 방식과 장단점을 학습했다.
이 과정에서 express-session 라이브러리 코드를 까보면서, 세션 ID 생성 알고리즘이 실제로 어떻게 구현되어 있는지도 확인해봤다.. ㅋㅋㅋ (동훈님 스타일로)
세션 관리는 이번 미션 범위 내에서는 인메모리로 충분하다고 판단했고, 분산 환경에서는 외부 저장소(Redis)를 사용하는 것이 더 적합하다고 생각했다.
오버 엔지니어링을 피하면서 근거 있는 기술 선택을 했다는 점에서 뿌듯했다.

디렉터리 트래버설 취약점

동료와 짝 코드 리뷰를 진행하던 도중에 내 코드에서 디렉터리 트래버설 취약점을 발견해주셨다.
requestPath../ 같은 입력이 들어오면 static 디렉터리 바깥의 파일까지 열람할 수 있는 위험이 있었다.
그래서 최종 경로가 base 디렉터리(static)로 시작하는지 startsWith로 검증하도록 코드를 개선했다.
보안 취약점은 내가 직접 공부하거나 누군가 알려주지 않으면 절대 알 수 없기에, 이를 알려준 동료에게 너무 감사했다.
다음 주에는 테스트 코드를 추가해서 재발 방지를 확실히 해야겠다.

피어 리뷰

데일리 스크럼

이번 주는 지식 공유에 아주 아주 아주 열정적인 분들을 만나서 많이 배웠다.
express 라이브러리 코드를 하나하나 까서 설명해주시는 동료분도 계셨고,
도라에몽 주머니처럼 학습 자료와 참고 링크들을 아낌없이 꺼내서 나눠주시는 분도 계셨다.
한 분도 빠짐 없이 의견 공유에 진심이셔서, 목요일에는 2시간 넘게 스크럼이 이어졌다 ㅋㅋㅋ
덕분에 나도 자연스럽게 뭐 하나라도 도움이 되기 위해서 의견을 내고, 내가 아는 걸 공유하려고 노력했다.

학습 번아웃

매일매일 열심히는 하고 있지만, 이번 한 주는 유독 힘든 느낌이 있었다.
새로운 지식과 정보는 많이 들어오는데, 내가 받아들일 수 있는 한계를 넘어서는 느낌이 들었다.
그러다보니 주간 계획도 소홀히 하게 되고, 해야 할 일들이 조금씩 밀려 자책하는 악순환이 반복됐다.
그래서 내 개인적인 고민을 처음으로 동료들에게 솔직하게 털어놓았다.
동료들은 내 상황을 100% 공감해주었고, 우선순위 설정에 대한 팁과 격려를 아낌없이 건네주었다.
표현을 잘 못해서 마음을 충분히 전하지 못했던 것 같은데, 속으로 너무 감동 받았다.
서연님, 은미님, 동훈님 정말 감사드려요 ~~ !!
이번 경험을 계기로 나도 동료들이 어려움에 처했을 때 조금이라도 힘이 되어줘야겠다고 생각했다.

동료 피드백

5주차 동료들의 피드백이 도착했다! 따듯한 피드백을 남겨주신 동료들에게 너무 감사했다.
지금까지 총 세 번의 피드백을 받았는데 AI의 도움을 받아서 요약해보았다.
잘하고 있어요!
1.
지식을 체계적으로 정리해서 팀원들과 공유하는 능력
2.
기술 선택 시 다양한 관점을 고려하고 근거 있는 결정을 내리는 능력
3.
동료에게 선한 영향력을 주고 함께 성장할 수 있도록 돕는 능력
더 노력해주세요!
1.
새로운 기술이나 방법을 더 시도해보기
2.
AI를 어떤 상황에서, 어떻게 활용했는지, 얻은 인사이트를 팀과 공유 해보기
3.
설계 문서를 더 구체적으로 작성해보기
정말 신기한건 내가 생각하는 나의 장단점과 동료들의 피드백 내용이 많이 맞아떨어진다는 점이었다.
앞으로 내 강점은 더 잘 살리면서, 약점은 어떻게 개선해 나갈지 고민해봐야겠다!

오프라인 참여

이번 주는 지난 주차와 다르게 좌석 지정제가 생겨서, 새로운 동료분들을 많이 만날 수 있었다!!
사람은 적응의 동물이라고 한 주만 나갔는 데도 오프라인 환경과 분위기에 금세 익숙해졌다 ㅎㅎ..
이번 주에는 점심으로 부대찌개와 돈까스를 먹었다.
왕두꺼비부대찌개: 남자 넷이서 9,000원으로 가성비 있게 먹을 수 있었다. (밥+라면사리 무한리필)
카츠이음: 선향님의 추천으로 갔던 돈까스집! 로스카츠 기준으로 10,000원인데 겉바속촉으로 맛있었다. 김치카츠나베도 맛있다고 하니 기회가 된다면 먹어보고 싶다.
TMI로 양재 코드 스쿼드 교육장에는 다트, 보드게임, 플레이스테이션 등 재밌는 것들이 많아서 잠깐의 휴식 시간에 동료들과 친해지기 정말 좋다.

현업 개발자 코드 리뷰

6주차 네이버 FE 리뷰어님

현업에서는 DTO를 어떤 식으로 관리하는가!
네이버에서는 Swagger에서 DTO를 자동 추출해 readonly 타입으로 활용한다.
다만 데이터를 그대로 사용하기보다는, FE에서 필요한 별도 타입을 정의해 변환하는 방식을 사용한다.
실제로 FE에서는 UI 표현을 위해 추가적인 상태 관리 필드가 필요한 경우가 많기 때문이다. (ex. isSelected, displayName 등)
API 응답 데이터는 공통 DTO를 사용하되, 실제 컴포넌트에서 사용할 때는 FE 전용 타입으로 매핑한다.
코드 책임 분리가 적절한가!
3계층 구조로 충실하게 구현한 점 아주 좋다!
코드 책임 분리를 판단하는 기준은 "유지보수 시 변경 영향 최소화" 이다.
특정 기능을 수정했을 때 예상치 못한 사이드 이펙트가 발생하지 않도록 하는 것이 핵심이다.
예를 들면, DB가 교체될 때 Repository 레이어만 수정하면 되고, ServiceController는 변경하지 않아도 되는 구조가 바람직하다.
다만, 과도한 분리와 추상화도 항상 경계 해야한다!! (YAGNI)
현재 필요한 만큼만 추상화하고 분리하고, 실제로 복잡도가 증가할 때 점진적으로 리팩토링 해보자.
에러 핸들링이 잘 되고 있는가!
HttpError 클래스를 중심으로 기본적인 에러 처리구조를 작성한 점 아주 좋다!
앞으로는 도메인 특화 에러들도 정의해보면 좋겠다.
FE에서 일관적으로 에러를 처리할 수 있도록 에러 메시지를 표준화하고 구조화해서 응답해준다면 베스트!
예: { error: { code: 'USER_NOT_FOUND', message: '사용자를 찾을 수 없습니다' } }
취약점은 없는가!
정적 파일을 응답해줄 때 허용된 파일 확장자와 디렉터리만 접근 가능하도록 명시적으로 제한해보면 좋을 것 같다!
참고로, 프로덕션 환경에서는 정적 파일 서빙을 WAS가 처리하지 않는다.
주로 CDN이나 웹서버(Nginx)에 위임하여 처리한다. (보안적으로도 성능적으로도 이점이 존재)

5주차 인프랩 BE 리뷰어님

인프랩에서 일하고 계시는 리뷰어님께서 감사하게도 임직원 50% 할인 쿠폰을 나눠주셨다!!
Real MySQL 책 내용이 잘 이해가 가지 않아서 강의를 찾고 있던 와중에, 김영한님의 DB 인프런 강의가 떠올라서 바로 쿠폰을 사용해 구매했다!
이런 귀한 쿠폰을 스터디 그룹 캠퍼들에게 나눠주신 명일님과 인프랩에 너무너무 감사드린다.

마스터 클래스

크롱님의 조언

멤버십은 챌린지와 다르게 긴 텀으로 진행되기 때문에 성장의 느낌이 덜 할 수 있다.
low level의 지식이 중요해졌다. 대형 AI 모델 학습 시 GPU 수급이 제한적이어서, 하드웨어 효율을 극대화하는 방향으로 설계를 최적화하는 경우가 있다.
지나치게 파일을 나누는 행위는 응집도를 떨어뜨리는 행위이기에 지양하는게 좋다.
spread operator를 활용해서 immutable 방식으로 새로운 객체를 생성하는데 장점은 무엇일까?
바이브코딩 프롬프트 꿀팁: 함수를 하나의 역할로 최대한 작게 만들어라. 클래스 사용 금지.
AI를 이용해서라도 함수 위에 JSDoc를 적어두자.
given, when, then 방식으로 테스트 코드 작성하는 연습하기!

호눅스님의 조언

번아웃 조심해라. 너무 빠르게 성장하려는 목표 자체가 포기하게 만든다.
너무 빠르게 기능 구현을 하다 보면 테스트 코드를 놓치는 경우가 많다.
행동 주도 개발(Behavior-Driven Development, BDD) 추천!
테스트가 힘들다는 것은 코드가 개선될 여지가 있다는 신호이다.
기존에 잘 돌아가는 시스템을 유지보수할 때는, “좋은 구조”를 경험적으로 확인할 수 있다.
하지만 신규 기능을 구현할 때는 아직 경험적 데이터가 없으므로 좋은 구조를 추측할 수밖에 없다.
그래서 반드시 테스트 코드를 작성하고, 리팩토링을 해보면서 스스로 깨닫는 과정이 꼭 필요하다.
미래를 생각한 코드보다는 현재에 주어진 문제를 해결하는데 필요한 코드를 작성해라.

마치며

이번 한 주 동안 약간의 학습 번아웃(?)이 와서 "내가 잘하고 있는걸까?" 고민을 했었는데,
회고를 다 작성하고 보니 그렇게 헛되게 보내진 시간은 아니었다는 생각이 든다.
힘든 순간도 있었지만, 좋은 동료들과 마스터(리뷰어)님들 덕분에 지치지 않고 끝까지 집중할 수 있었다.
다음 주에는 동료들이 나에게 해주었던 피드백들을 바탕으로 다시 힘내서 실천에 옮겨보려고 한다.
7주차도 파이팅 해보자!!