6주차 주말이 끝나가고 있다 크아악..!
이번 주말에는 늦잠도 자고, 평소에 하지 못했던 게임도 원없이 즐겼다.
(어제 문명5 저녁에 켰다가 새벽 3시까지 했다. 진짜 시간 순삭 게임..
)
오랜만에 충분히 쉬면서 머리를 비우니, 다음 주를 조금 더 힘차게 시작할 수 있을 것 같다.
나는 6주차에 무엇을 배웠나!
미션
정적 파일과 Binary 데이터 학습
•
이번 주에는 이미지와 같은 정적 파일을 응답하는 기능을 구현했다.
•
처음에는 HttpResponse 클래스의 body 타입을 string으로만 정의해 두었기 때문에 텍스트 기반 응답은 문제가 없었지만, 이미지와 같은 binary 데이터를 다루려니 한계가 있었다.
•
그제서야 네트워크에서 전송되는 데이터가 모두 바이트 단위로 처리된다는 점을 떠올리고, body의 데이터 타입을 Buffer로 변경했다.
•
또한 문자열과 달리 binary 데이터는 인코딩 과정에서 손상될 수 있기 때문에 Buffer.concat을 활용해 안전하게 합쳤다.
•
결과적으로 이미지와 텍스트 등 모든 정적 파일을 일관성 있게 처리할 수 있는 구조를 만들 수 있었다.
•
다만 CS 연결고리 퀴즈에서는 OSI 7계층 기반 데이터 흐름을 제대로 설명하지 못했기 때문에,
•
차주에는 네트워크 데이터 흐름과 계층별 역할을 코드 구현과 연결하여 학습할 계획이다.
세션 저장소 설계
•
또 다른 고민은 세션 저장소를 설계하면서 세션 ID를 어떻게 생성하고 관리할지 고민했다.
•
세션 ID 생성 방법으로 crypto.randomBytes와 crypto.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 레이어만 수정하면 되고, Service나 Controller는 변경하지 않아도 되는 구조가 바람직하다.
◦
다만, 과도한 분리와 추상화도 항상 경계 해야한다!! (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주차도 파이팅 해보자!! 
