8개월 차, 아직도 컴포넌트 분리를 헷갈리는 이유

8개월 차, 아직도 컴포넌트 분리를 헷갈리는 이유

8개월 차, 아직도 컴포넌트 분리를 헷갈리는 이유 오늘도 코드리뷰에서 혼났다 출근하자마자 슬랙 알림. 심장이 쿵 내려앉았다. "이신입님, 이 컴포넌트 너무 크지 않나요? 분리하면 좋을 것 같은데요." 민수 선배다. 항상 친절하게 말하지만 그게 더 무섭다. 어제 올린 PR이었다. UserProfile.jsx 파일. 300줄짜리. "아... 네네 수정하겠습니다." 일단 답장부터. 그리고 코드를 다시 봤다. 뭘 분리하라는 건지 솔직히 모르겠다. 전부 프로필 관련 코드인데. 프로필 사진, 이름, 소개, 팔로우 버튼, 게시글 목록, 좋아요 수. 다 유저 프로필이잖아. 그럼 UserProfile 컴포넌트에 있는 게 맞는 거 아닌가. 근데 선배는 분리하래.8개월 됐다. 근데 아직도 모르겠다. 컴포넌트를 어떻게 나누는 게 정답인지. 부트캠프 때는 간단했다. 헤더는 Header.jsx, 버튼은 Button.jsx. 그게 끝이었다. 근데 실무는 다르다. UserProfile.jsx를 열면 그 안에 또 뭐가 들어가야 하는지. ProfileHeader? ProfileInfo? UserAvatar? FollowButton? 어디까지가 한 덩어리고 어디서부터 분리해야 하는지. 그냥 다 한 파일에 쓰면 안 되나. 길어도 Ctrl+F 하면 찾을 수 있는데. 선배들이 말하는 '재사용성' "재사용 가능하게 만들어야죠." 코드리뷰 댓글에 항상 나오는 말. 재사용성. 근데 뭘 재사용한다는 건지 모르겠다. 이 프로필 페이지는 프로필 페이지에서만 쓰는데. 다른 데서 언제 쓴다고. FollowButton을 분리했다. 그럼 다른 페이지에서도 팔로우 버튼 쓸 수 있으니까 재사용 가능한 거다. 이해했다고 생각했다. 근데 일주일 뒤 또 지적받았다. "ProfileInfo도 분리하면 좋을 것 같아요." ProfileInfo는 이름이랑 소개 보여주는 부분. 이건 어디서 재사용해. 프로필 페이지에서만 쓰는데. 물어봤다. 용기 내서. "선배님, 근데 ProfileInfo는 프로필에서만 쓰지 않나요?" "지금은 그렇죠. 근데 나중에 모달에서도 쓸 수도 있고, 카드 형태로 보여줄 수도 있잖아요." 나중에. 모달. 카드. 모르겠다. 나중은 언제고 모달은 아직 없는데 지금 분리하라는 건가.그래서 분리했다. ProfileInfo.jsx. 그 안에 이름이랑 소개만 넣었다. 30줄. 30줄짜리 파일을 만드는 게 맞나. components 폴더 열 때마다 파일이 수십 개다. 뭐가 뭔지 모르겠다. Button.jsx, CustomButton.jsx, StyledButton.jsx, PrimaryButton.jsx. 다 버튼인데 뭐가 다른 건지. 누가 정리 좀 해줬으면 좋겠다. 컴포넌트 분리의 기준이 뭔데 구글링했다. "React 컴포넌트 분리 기준". 블로그마다 다르다. 어떤 글은 "50줄 넘으면 분리하세요"래. 그럼 난 이미 300줄인데 6개로 쪼개야 하나. 어떤 글은 "단일 책임 원칙"이래. 하나의 컴포넌트는 하나의 일만. 그게 뭔데. 프로필 보여주는 게 한 가지 일 아닌가. 어떤 글은 "props가 5개 넘으면 분리"래. 그럼 지금 당장 분리해야 할 게 10개는 넘는다. 유튜브도 봤다. 영상마다 다르다. "작게 쪼갤수록 좋습니다." vs "너무 잘게 쪼개면 오히려 복잡해져요." 둘 다 맞는 말 같은데 반대다. 뭘 믿어야 하지. ChatGPT한테 물어봤다. 코드 붙여넣고 "이거 어떻게 분리하면 좋을까요?" 3가지 방법을 알려줬다. 전부 다른 방법. 어느 게 정답이래. "상황에 따라 다릅니다." 상황. 그 상황을 내가 모르는데 어떡하라고. 분리했더니 props 지옥 결국 분리했다. UserProfile을 5개로 쪼갰다. ProfileHeader, ProfileAvatar, ProfileInfo, FollowButton, PostList. 뿌듯했다. 이제 각 파일이 50줄 정도. 깔끔하다. PR 올렸다. "props drilling이 너무 심한 것 같아요." 뭐라고. UserProfile에서 userId를 받아서 ProfileHeader한테 넘기고, ProfileHeader가 또 ProfileAvatar한테 넘기고, ProfileAvatar가 이미지 URL 받아오려고 또... props가 3단계를 내려간다. userId -> ProfileHeader -> ProfileAvatar -> 실제 사용. "Context API 쓰시거나 상태관리 라이브러리 고려해보세요." Context API. 배웠다. 근데 언제 쓰는 건지 모르겠다. 이 정도면 쓰는 건가. 아직 안 쓰는 건가. Zustand? Recoil? Redux는 너무 어렵다고 하던데. 뭘 선택해야 하나. 일단 물어봤다. 또. "선배님, 이거 Context 써야 할까요?" "음... 지금은 괜찮을 것 같은데요. 나중에 상태가 복잡해지면 그때 고민해봐요." 나중에. 또 나중에.그래서 원래대로 돌렸다. props 3개만 넘기게. 근데 그러니까 ProfileHeader가 너무 많은 일을 한다고 또 지적받았다. "ProfileHeader가 너무 많은 책임을 가지고 있네요." 책임. 또 책임. 뭐가 책임인지 모르겠다. 그냥 props 전달하는 건데. 이것도 책임인가. 결국 정답은 없다는 걸 깨달았다 3주 걸렸다. 한 페이지 리팩토링하는 데. 처음 300줄 UserProfile.jsx는 이제 10개 파일이 됐다. components/profile 폴더에 들어가면 파일이 즐비하다. ProfileHeader.jsx ProfileAvatar.jsx ProfileBadge.jsx ProfileInfo.jsx ProfileBio.jsx FollowButton.jsx FollowStats.jsx PostList.jsx PostItem.jsx PostImage.jsx 10개. 원래 하나였는데. 깔끔한가. 모르겠다. 파일 찾으려고 왔다 갔다 하는 게 더 불편한 것 같기도 하다. 근데 민수 선배는 좋다고 했다. "이제 훨씬 읽기 좋네요. 수고했어요." 읽기 좋다고. 진짜 그런가. 난 아직도 헷갈리는데. 어제 신입이 한 명 더 들어왔다. 나보다 3개월 늦게. 이름은 김신입. "선배님, 컴포넌트 어떻게 나누는 게 좋아요?" 물어봤다. 나한테. 선배라고. "음... 재사용 가능하게? 그리고 너무 길어지면 분리하고..." 내가 하는 말이 민수 선배랑 똑같다. 웃겼다. 근데 김신입이 물었다. "그럼 몇 줄 정도가 적당한가요?" "그게... 상황에 따라 달라요." 이 말을 내가 하고 있다. 3주 전에 제일 듣기 싫었던 말을. 아직도 모르지만 조금 알 것 같기도 하다 오늘도 컴포넌트 분리했다. 새로운 기능. 장바구니 페이지. 처음부터 나눴다. ShoppingCart.jsx 하나에 다 쓰지 않았다. CartHeader, CartItem, CartSummary, CheckoutButton. 4개로 시작했다. 200줄이 4개 파일, 50줄씩. PR 올리기 전에 스스로 봤다. CartItem이 좀 긴 것 같다. 80줄. 분리했다. CartItemImage, CartItemInfo, CartItemQuantity. 혼자 했다. 지적받기 전에. 뿌듯했다. 조금. 아주 조금. 그리고 민수 선배가 approve 눌렀다. 댓글 없이. 댓글 없는 게 제일 좋은 거다. 배웠다. 여전히 모른다. 정확한 기준 같은 건. 몇 줄에서 나누고, 어떤 이름을 붙이고, props를 몇 개까지 넘기고. 근데 계속 하다 보니까 감이 생긴다. 이 정도면 분리해야겠다. 이건 하나여도 되겠다. 틀릴 때도 있다. 많다. 근데 틀리면 또 고치면 된다. 3주 걸려도 되고. 8개월 차. 아직도 주니어. 컴포넌트 분리는 여전히 어렵다. 근데 3개월 전보다는 덜 어렵다. 그게 성장인가 보다. 내일도 분리하겠지. 또 헷갈리겠지. 그래도 해본다.김신입한테 알려줄 건 생겼다. "일단 해봐. 틀려도 돼."

메모장의 모르는 용어들: 퇴근 후 인터넷 검색의 시작

메모장의 모르는 용어들: 퇴근 후 인터넷 검색의 시작

오늘도 메모장에 한 줄 추가 아침 회의. 팀장님이 말한다. "이번 스프린트에는 CI/CD 파이프라인 개선도 같이 진행합시다." 고개를 끄덕인다. 모른다. CI/CD가 뭔지도 잘 모른다. 대충 '자동으로 뭔가 되는 거'라고만 알고 있다. 책상으로 돌아와서 메모장을 연다. 노트북 왼쪽에 항상 놔두는 A5 노트. 연필로 적는다. "CI/CD 파이프라인" 오늘의 첫 번째 모르는 용어다. 아직 오전 10시다.점심 먹고 오면 더 늘어난다 오후 2시. 선배가 슬랙에 메시지를 보낸다. "이신입님, 이 API 레이트 리미팅 적용해주실 수 있을까요? 현재 무제한이라 서버 부하가 심해요." 읽는다. 세 번 읽는다. 뭔 소리인지 모른다. '레이트 리미팅'이 뭐지. 'API 제한' 같은 건가. 아닌가. 메시지에 👍 이모지를 누른다. 일단 '확인했다'는 의미. 이해했다는 의미는 아니다. 메모장을 펼친다. "레이트 리미팅 (Rate Limiting?)" 두 번째 용어. 영어 스펠링도 맞는지 모르겠다. 오후 4시. 코드리뷰가 올라온다. 다른 팀 선배가 쓴 코드. "Redis 캐시 레이어 추가로 응답속도 30% 개선" 댓글이 달린다. "오 레디스 좋죠. TTL은 어떻게 설정하셨어요?" 나도 댓글을 단다. "좋네요!" TTL이 뭔지는 모른다. 레디스도 잘 모른다. 그냥 '좋네요'라고 쓴다. 메모장에 적는다. "Redis" "TTL" 네 개가 됐다. 하루가 아직 두 시간 반 남았다.퇴근길 지하철에서 미리보기 7시. 퇴근한다. 지하철에 앉는다. 메모장을 꺼낸다. 오늘 적은 용어를 센다. 총 7개다. 오후 5시에 회의 하나 더 있었다. 거기서 3개가 추가됐다. "컨테이너 오케스트레이션" "로드 밸런싱" "gRPC" 마지막 건 선배가 "우리도 gRPC 도입하면 어떨까요"라고 했는데 다들 고개를 끄덕였다. 나도 끄덕였다. 뭔지는 모른다. 휴대폰을 꺼낸다. 구글에 'gRPC'를 검색한다. "Google Remote Procedure Call..." 읽는다. 이해가 안 된다. 일단 북마크한다. 집 가서 다시 볼 것이다. 창밖을 본다. 어두워졌다. 지하철은 계속 간다. 이해 안 되는 게 너무 많다. 회사 사람들은 다 아는 것 같은데 나만 모른다. 아니면 다들 모르는데 아는 척하는 건가. 그것도 모르겠다. 집에 도착, 본격 검색 시작 8시 반. 집에 도착한다. 샤워하고 편의점 도시락 먹는다. 9시 20분. 노트북을 켠다. 메모장을 펼친다. 오늘의 용어: 7개. 일단 첫 번째부터. 'CI/CD'. 구글에 검색한다. "CI/CD란?" 블로그가 나온다. 10개 정도 탭으로 연다. 첫 번째 블로그: "CI/CD는 Continuous Integration과 Continuous Deployment의 약자로..." 읽는다. 이해가 반쯤 된다. "그러니까 코드 올리면 자동으로 테스트하고 배포하는 거?" 두 번째 블로그 연다. 그림이 있다. 파이프라인이 화살표로 그려져 있다. "아, 이렇게 되는 거구나." 조금 더 이해된다. 50%에서 60%로. 노션을 연다. '오늘 배운 것' 페이지. 적는다. "CI/CD: 코드 푸시하면 자동으로 빌드/테스트/배포. GitHub Actions 같은 걸로 한다고 함." 한 줄 요약. 내일 또 까먹을 것 같지만 일단 적는다.두 번째 용어, 그리고 세 번째 '레이트 리미팅' 검색. "Rate Limiting, API 호출 제한 기법..." 읽는다. "1분에 100번만 호출 가능하게 막는다?" 블로그를 3개 더 읽는다. "express-rate-limit 라이브러리 쓰면 된다고?" npm 문서를 연다. 코드 예제가 있다. const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 100 });복사한다. 노션에 붙여넣는다. "내일 출근하면 이거 적용해보자." 될지 안 될지는 모른다. 일단 시도는 해볼 것이다. 시계를 본다. 10시 반. 아직 5개 남았다. 'Redis' 검색. "인메모리 데이터베이스..." 읽는다. 이해가 안 된다. "그러니까 RAM에 저장하는 DB?" 블로그를 더 찾는다. 그림이 있는 걸로. "캐시 용도로 많이 쓴다. 빠르다. 근데 서버 끄면 데이터 날아간다." 대충 이해했다. 70%쯤. 'TTL' 검색. "Time To Live. 데이터 유효기간." 이건 쉽다. "Redis에 데이터 넣을 때 '10분 후 자동 삭제' 이런 거구나." 노션에 적는다. 한 줄씩. 시계를 본다. 11시. 끝나지 않는 검색의 밤 '컨테이너 오케스트레이션' 검색. 어렵다. "여러 개의 컨테이너를 관리하는..." '컨테이너'부터 모른다. '도커 컨테이너란' 검색. "애플리케이션을 격리된 환경에서..." 읽는다. 이해가 30%. 유튜브를 연다. "도커 10분 정리" 영상. 본다. 12분짜리. "아, 가상머신 같은 건데 더 가볍다?" 다시 '컨테이너 오케스트레이션' 검색. "쿠버네티스가 대표적..." 읽는다. 그림을 본다. "여러 개 컨테이너를 자동으로 관리. 하나 죽으면 다시 살린다?" 대충 이해했다. 40%. 노션에 적는다. "컨테이너 오케스트레이션: 쿠버네티스 같은 거. 컨테이너 여러 개 자동 관리. 나중에 제대로 공부 필요." 마지막 줄이 핵심이다. '나중에 제대로 공부'. 언제 할지는 모른다. '로드 밸런싱' 검색. "서버 여러 대에 트래픽 분산..." 이건 비교적 쉽다. "사용자 요청을 여러 서버로 나눠서 처리. 한 서버에 몰리지 않게." 그림을 본다. 화살표가 여러 개로 갈라진다. 이해됐다. 80%. 노션에 적는다. 'gRPC' 검색. 어렵다. "Protocol Buffers를 사용하는..." 'Protocol Buffers' 검색. "구조화된 데이터 직렬화..." 포기한다. "일단 REST API보다 빠른 통신 방법." 이 정도로 적는다. 40% 이해. 시계를 본다. 자정. 메모장의 7개 용어를 다 찾아봤다. 내일은 또 다른 용어들 이불 속에 눕는다. 오늘 배운 것들을 떠올린다. CI/CD, 레이트 리미팅, Redis, TTL, 컨테이너 오케스트레이션, 로드 밸런싱, gRPC. 머릿속에서 정리가 안 된다. 뒤죽박죽이다. "내일 회의에서 또 뭐가 나올까." 걱정된다. 선배가 "이거 알죠?"라고 물으면 뭐라고 대답해야 할까. 모른다고 하면 "이것도 몰라?" 소리 들을 것 같다. 안다고 하면 "그럼 이거 해주세요" 할 것 같다. 둘 다 싫다. 휴대폰을 든다. 노션을 연다. '오늘 배운 것' 페이지. 7개 용어가 적혀 있다. 각각 한두 줄씩. 이게 내 지식이다. 얕다. 하지만 어제보다는 늘었다. 내일은 또 메모장을 펼칠 것이다. 회의 중에, 슬랙 메시지 읽다가, 코드리뷰 보다가. 모르는 용어가 나오면 몰래 적을 것이다. 그리고 퇴근 후에 또 검색할 것이다. "이게 개발자 공부구나." 학원에서는 안 가르쳐줬다. 실무에서 모르는 게 나오면 스스로 찾아서 공부하는 것. 매일 새로운 용어. 매일 검색. 매일 노션에 한 줄씩. 3개월 뒤에는 조금 나아질까. 6개월 뒤에는 선배들 대화를 알아듣게 될까. 모르겠다. 일단 내일도 메모장을 챙겨야겠다. 눈을 감는다. 일주일 후 메모장 월요일. 메모장을 펼친다. 이번 주에 적은 용어들. 총 23개. 평균 하루 4개씩. "많네." 하나씩 읽어본다. "웹소켓, SSE, 폴링, 롱폴링, JWT, OAuth, CORS, CSP..." 머리가 아프다. 다 검색했다. 다 노션에 적었다. 근데 오늘 회의에서 'OAuth'가 또 나왔다. "어? 이거 저번 주에 찾아봤는데." 기억이 안 난다. 노션을 연다. 찾는다. "OAuth: 구글 로그인 같은 거. 토큰 기반 인증." "아, 맞다." 다시 기억난다. 50%. 검색했던 블로그를 다시 연다. 또 읽는다. "한 번 찾아보는 걸로는 안 되는구나." 여러 번 봐야 한다. 실제로 써봐야 한다. 근데 실제로 쓸 일은 언제 올까. 선배가 시켜야 한다. 그래야 해본다. 스스로 하기에는 뭘 해야 할지도 모르겠다. 한 달 후 변화 입사 9개월차. 메모장을 펼친다. 이번 달에 적은 용어: 67개. "진짜 많네." 근데 신기한 게 있다. 지난달에 적었던 용어가 또 나온다. 'Redis' 세 번째 등장. 이제는 검색 안 해도 안다. "인메모리 캐시. TTL 설정 가능. 빠름." 회의에서 나와도 끄덕일 수 있다. 진짜로 이해하고. 'CI/CD'도 이제 안다. 직접 GitHub Actions 설정해봤다. 선배가 시켜서. 에러 10번 나고 성공했다. "이제 알겠다. 이게 CI/CD구나." 메모장에 적었던 용어들이 하나씩 지워진다. 아니, 지우는 건 아니고. 체크 표시를 한다. ✓ CI/CD ✓ Redis ✓ 레이트 리미팅 체크된 게 17개. 아직 50개 남았다. 근데 괜찮다. 한 달 전보다는 늘었다. 메모장의 의미 메모장을 덮는다. 이제 이 메모장이 내 공부 기록이다. 모르는 게 나오면 적는다. 퇴근 후 찾아본다. 노션에 정리한다. 며칠 후 또 나오면 다시 본다. 몇 번 반복하면 외워진다. 이게 내 공부법이다. 학원에서는 커리큘럼이 있었다. "오늘은 이거 배웁니다." 정해져 있었다. 회사는 다르다. "이거 해주세요." 모르면 내가 찾아야 한다. 메모장이 내 커리큘럼이다. 오늘 적힌 용어가 오늘의 공부 주제. 무작위다. 체계적이지 않다. 근데 이게 실무다. 필요한 걸 필요할 때 배운다. 깊이는 얕다. 넓이는 넓어진다. 3개월 전보다 아는 게 많아졌다. 여전히 모르는 게 더 많지만.내일도 메모장을 챙긴다. 오늘은 3개 적었다. 내일은 몇 개일까.

입버릇 '아... 네네'로 버티는 시간들

입버릇 '아... 네네'로 버티는 시간들

입버릇 '아... 네네'로 버티는 시간들 오전 10시, 회의실 "이신입씨, 이 부분 이해됐어요?" "아... 네네." 거짓말이다. 하나도 모른다. 선배가 15분간 설명한 건 Redux Saga였다. Redux도 겨우 쓰는데 Saga는 뭐지. 제너레이터 함수? yield? 대학교 때 C언어 배웠는데 그것도 잘 모른다. 회의실 나오면서 손에 땀이 났다. 노트에는 'Redux Saga 찾아보기'라고만 적혀 있다. 뭘 찾아봐야 하는지도 모른다.입버릇의 탄생 입사 첫 주였다. "리액트 훅 알죠?" "네." "useCallback이랑 useMemo 차이 아시죠?" "네." 둘 다 거짓말이었다. 부트캠프 때 들어는 봤다. 써본 적은 없다. 그때부터 '아... 네네'가 시작됐다. 모른다고 하면 뭐라고 할 것 같았다. '그것도 모르고 입사했어?'라는 눈빛이 무서웠다. 2개월 차에 팀장이 물었다. "API 설계 괜찮아요?" "아... 네네." REST API가 뭔지는 안다. POST, GET 정도. 근데 설계? 뭘 봐야 하는지 모른다. 일단 '네'부터 하고 본다. 3개월 차엔 더 심해졌다. "타입 가드 써봤죠?" "아... 네네." 타입스크립트도 겨우 쓴다. any 떼고 string 붙이는 게 전부다. 타입 가드는 검색해도 이해가 안 됐다. 점심시간의 검색 편의점 샌드위치 뜯으면서 핸드폰을 켠다. 'Redux Saga 뭔가요' '타입 가드 쉽게' 'useCallback 언제 써요' 검색 기록이 다 이렇다. 블로그 10개를 봐도 모르겠다. 설명은 친절한데 내 머리가 안 따라간다. 유튜브를 켠다. "Redux Saga 10분 정리". 재생한다. 5분 만에 포기한다. 빠른 이해가 목표인 영상인데 나는 느리다. ChatGPT한테 물어본다. "Redux Saga를 초등학생도 이해할 수 있게 설명해줘" 답변은 길다. 읽다가 졸린다. 복붙해서 노션에 저장한다. 나중에 보겠지. 안 본다.오후 3시, 코드 리뷰 PR을 올렸다. 30분 뒤에 댓글이 달렸다. "이 부분 useMemo로 최적화하면 좋을 것 같아요" "props drilling 심한데 context 쓰는 게 어때요" "이 로직 custom hook으로 분리해보세요" 하나도 모르겠다. 일단 댓글을 단다. "아 네네 수정하겠습니다!" 느낌표까지 쳤다. 긍정적으로 보이려고. 사수가 슬랙 DM을 보냈다. "useMemo 어떻게 쓸지 아시겠어요?" "네 찾아보겠습니다" 거짓말이다. 찾아봐도 모를 거다. 일단 시간을 번다. 내일 물어보면 또 '아... 네네' 할 거다. 저녁 7시, 혼자 남은 자리 동기들은 퇴근했다. 나는 남았다. 오늘 받은 피드백을 고쳐야 한다. useMemo 공식 문서를 켠다. 영어다. 번역기 돌린다. 한국어인데도 모르겠다. 유튜브를 다시 켠다. "useMemo 5분 정리". 본다. 이해가 안 된다. 코드를 따라 친다. 에러가 난다. console.log를 찍는다. 10개 찍는다. 뭐가 문젠지 모른다. 선배 코드를 복붙한다. 돌아간다. 이해는 못 했다. 일단 커밋한다. 커밋 메시지: "refactor: useMemo 적용" 거짓말이다. 리팩토링이 뭔지도 모른다.퇴근길, 지하철 안 오늘도 '아... 네네'로 버텼다. 몇 번이었을까. 세어보지 않았다. 10번? 15번? 모르는 걸 모른다고 하면 뭐가 문제일까. 생각해본다. 시간이 없어서? 아니다. 오히려 시간은 더 걸린다. 혼자 헤매니까. 창피해서? 맞다. 이게 맞다. '그것도 모르세요?' '그럼 왜 리액트 할 줄 안다고 했어요?' '이 정도는 알고 입사하는 건데' 이런 말 들을까 봐 무섭다. 근데 웃긴 건, 어차피 나중에 들킨다는 거다. 코드 보면 다 티가 난다. useMemo를 어떻게 쓰는지도 모르고 그냥 붙였다는 게. 밤 11시, 원룸 침대에 누워서 천장을 본다. 내일도 회의가 있다. 또 모르는 게 나올 거다. 또 '아... 네네' 할 거다. 언제까지 이럴까. 수습 기간 3개월. 이제 1개월 남았다. 평가 항목에 '기술 이해도'가 있다. 망했다. 부트캠프 동기 단톡방을 켠다. "너네 회사에서 모르는 거 나오면 어떻게 해?" 답장이 온다. "나도 그냥 네네 하고 나중에 몰래 찾아봄 ㅋㅋ" "ㅇㅈ 물어보기 무서움" "선배들 바빠 보여서 미안해서 못 물어봄" 다들 나랑 똑같다. 근데 이게 답은 아니다. 알고 있다. 금요일 오후, 1on1 팀장이 말했다. "요즘 어때요?" "아... 네네 괜찮습니다." 또 이거다. 팀장이 웃었다. "신입씨 입버릇이 '아 네네'더라고요. 회의 때마다." 들켰다. 얼굴이 빨개졌다. "모르는 거 있으면 물어봐도 돼요. 다들 그렇게 배웠어요." "아... 네네." 또 했다. 팀장이 다시 웃었다. "지금도 했잖아요." 바뀐 것들 다음 주 월요일이었다. 사수가 Redux Saga 설명을 시작했다. 3분 지났다. 모르겠다. 손을 들었다. "저... 제너레이터 함수가 뭔지 잘 모르겠는데요." 심장이 뛰었다. 사수가 대답했다. "아 그거요? 저도 처음엔 몰랐어요. 보통 그래요." 10분 더 설명을 들었다. 조금 이해됐다. 완벽하진 않다. 근데 '아... 네네'보다는 낫다. 수요일에는 코드 리뷰에서 물었다. "useMemo를 왜 여기 쓰는 게 좋은 건가요?" 선배가 답했다. "이 연산이 무거워서요. 리렌더링마다 다시 계산하면 느려져요." "아 렌더링 될 때마다요?" "네 맞아요." 이해했다. 완전히는 아니다. 근데 어제보단 낫다. 한 달 뒤 아직도 모르는 게 많다. 어제는 Recoil이 뭔지 몰랐다. 오늘은 SSR이 헷갈렸다. 근데 '아... 네네'는 줄었다. 일주일에 한두 번? 물어보는 게 익숙해졌다. 부끄럽긴 하다. 근데 혼자 3시간 헤매는 것보단 낫다. 선배가 말했다. "신입 때는 모르는 게 당연한 거예요. 우리도 다 그랬어요." 믿기지 않는다. 이 선배도 useEffect 몰랐을까. Redux 몰랐을까. 근데 생각해보면 맞다. 처음부터 아는 사람은 없다. 지금 여전히 어렵다. 오늘도 GraphQL이 뭔지 몰라서 30분 헤맸다. 근데 이젠 안다. 30분 헤매면 물어보면 된다는 걸. '아... 네네'로 3시간 버티는 것보다, '죄송한데 이거 모르겠는데요' 5분이 낫다. 부끄럽다. 맞다. 근데 더 부끄러운 건, 모르는 걸 숨기고 결국 들키는 거다. 입버릇은 안 바뀐다. '아... 네네'는 아직도 나온다. 근데 횟수는 줄었다. 조금씩이다. 천천히다. 근데 분명히 줄고 있다.모르는 게 부끄러운 게 아니라, 모른다고 말 못 하는 게 부끄러운 거더라.

코드리뷰 후 '감사합니다' 클릭하는 순간의 마음

코드리뷰 후 '감사합니다' 클릭하는 순간의 마음

코드리뷰 후 '감사합니다' 클릭하는 순간의 마음 빨간 알림이 뜬다 슬랙 알림이 떴다. 심장이 쿵 내려앉는다. "@이신입 코드리뷰 남겼어요 👍" 이모지가 웃고 있지만 나는 못 웃는다. 일단 깃허브를 켠다. PR 탭을 누른다. 손가락이 미세하게 떨린다. 댓글이 7개다. 7개. 첫 번째 댓글을 연다. "여기 useCallback으로 감싸는 게 좋을 것 같아요. 지금은 매 렌더링마다 함수가 재생성되고 있어서요." useCallback. 들어봤다. 강의에서 봤다. 근데 왜 쓰는 거더라. 일단 고개를 끄덕인다. 아무도 안 보는데 끄덕인다.구글링을 시작한다 새 탭을 연다. "useCallback 언제 쓰나요" 검색한다. 벨로그 글이 나온다. 읽는다. 아 뭔가 알 것 같다. 스크롤을 내린다. 모르겠다. 두 번째 글을 연다. "useCallback vs useMemo 차이점" 제목이다. 차이점이 아니라 useCallback만 알고 싶은데. 세 번째 글은 영어다. 스택오버플로우다. 패스한다. 다시 첫 번째 글로 돌아간다. 코드 예시를 본다. 복사한다. 메모장에 붙여넣는다. 시계를 본다. 벌써 20분이 지났다. 아직 첫 번째 댓글이다. "빨리 수정해야 하는데..." 입에서 나온다. 혼잣말이다.두 번째 댓글을 연다 "dependency array에 count를 넣어주세요. 지금은 stale closure 문제가 있을 수 있어요." stale closure. 처음 보는 단어다. 아니다. 본 것 같기도 하다. 기억이 안 난다. 또 구글링한다. "stale closure 뜻" 검색한다. 영어 글만 나온다. 한국어로 바꾼다. "오래된 클로저 문제" 이렇게 나온다. 오래된 클로저. 클로저도 잘 모르는데. useEffect 강의를 다시 찾는다. 인프런에 저장해둔 거다. 49분짜리 영상이다. "일단 나중에 보자." 북마크에 넣는다. 이미 북마크는 87개다. 세 번째 댓글을 연다. "early return 패턴 사용하면 가독성이 더 좋을 것 같습니다." 이건 뭔지 안다. if 문을 먼저 쓰는 거다. 이건 할 수 있다. 처음으로 뭔가 이해했다. 기분이 좋다. 3초 정도. 네 번째부터는 포기한다 "불필요한 props drilling이 있네요. Context API 고려해보시겠어요?" Context API. 들어봤다. 쓴 적은 없다. "여기 memo 처리하면 리렌더링 줄일 수 있을 거예요." memo. React.memo. 이것도 들어봤다. 언제 쓰는지는 모른다. "이 부분 custom hook으로 분리하면 어떨까요?" custom hook. 만들어본 적 없다. 선배들 코드에서만 봤다. 마지막 댓글을 연다. "전반적으로 잘 작성하셨어요! 몇 가지만 수정하면 될 것 같습니다 👍" 이 한 줄이 제일 중요하다. "잘 작성하셨어요" 이 부분. 적어도 완전히 망친 건 아니구나. 조금 안심한다.'감사합니다' 버튼을 누른다 이제 답을 달아야 한다. 첫 번째 댓글에 답한다. "아 감사합니다! 수정하겠습니다 👍" 두 번째도 똑같이 쓴다. "감사합니다! 반영하겠습니다 👍" 세 번째는 조금 바꾼다. "오 좋은 의견 감사합니다! 수정할게요 👍" 네 번째부터는 복사 붙여넣기다. 이모지만 바꾼다. 👍에서 🙏로. 마지막 댓글엔 "피드백 감사합니다! 많이 배웠습니다 🙏" 이렇게 쓴다. 많이 배웠습니다. 사실 반만 이해했다. 아니다. 30%도 이해 못 했다. 근데 뭐라고 써야 하나. "죄송한데 이해 못 했어요" 이렇게 쓸 수는 없다. 물어보면 된다고 하는데 7개를 다 물어볼 수는 없다. "바쁘신데 죄송합니다" 이것도 이상하다. 그냥 "감사합니다"가 제일 무난하다. 언제나 그렇다. 실제로 수정을 시작한다 early return부터 한다. 이건 할 수 있다. if 문을 위로 올린다. 커밋한다. "refactor: apply early return pattern" useCallback을 추가한다. 아까 복사한 코드를 참고한다. 함수를 감싼다. 의존성 배열에 뭘 넣어야 하는지 모르겠다. 일단 빈 배열 넣는다. 에러가 난다. ESLint가 뭐라고 한다. "React Hook useCallback has a missing dependency" 의존성 배열에 count를 넣는다. 에러가 사라진다. 된 거 같다. 근데 왜 이렇게 해야 하는지는 모르겠다. 일단 넘어간다. Context API는 패스한다. 시간이 너무 오래 걸릴 것 같다. "다음 PR에 반영하겠습니다" 댓글을 단다. custom hook도 패스한다. 같은 답변을 단다. memo는... 일단 구글링부터 한다. 30분 후에 포기한다. 이것도 "다음에 반영하겠습니다" 댓글을 단다. 다시 리뷰를 요청한다 수정한 코드를 푸시한다. 슬랙에 멘션한다. "@김선배님 수정 완료했습니다! 확인 부탁드립니다 🙏" 10분 후 답장이 온다. "확인했어요 👍 Approve 했습니다~" Approve. 승인이다. 됐다는 거다. 가슴이 뛴다. 진짜로 뛴다. "감사합니다!!" 답장한다. 이번엔 느낌표 2개다. 머지 버튼을 누른다. "Merge pull request" 초록색 버튼이다. 클릭한다. 화면이 보라색으로 바뀐다. "Pull request successfully merged and closed" 성공이다. 첫 PR이 머지됐다. 기분이 좋다. 근데 동시에 불안하다. "저 코드가 진짜 괜찮은 걸까. 내가 제대로 이해한 걸까." 모르겠다. 일단 됐으니까 된 거다. 그렇게 생각하기로 한다. 저녁을 먹는다 편의점에 간다. 김치볶음밥 도시락을 산다. 3900원이다. 사무실로 돌아온다. 전자레인지에 돌린다. 2분 30초. 돌아가는 소리를 들으며 휴대폰을 본다. 깃허브 알림을 다시 확인한다. "Closed" 표시가 있다. 정말 끝난 거다. 딩 소리가 난다. 도시락이 다 됐다. 먹으면서 생각한다. "다음 PR은 좀 더 잘해야지." 근데 다음 PR도 비슷할 것 같다. 댓글 받고, 구글링하고, 반만 이해하고, "감사합니다" 누르고. 그래도 괜찮다. 이게 배우는 거니까. 선배들도 다 이랬을 거니까. 그렇게 믿기로 한다. 퇴근 전 한 가지 더 퇴근 30분 전이다. 노션을 연다. "오늘 배운 것" 페이지다. 마지막 작성일이 2주 전이다. 다시 시작한다. "2024.01.15 배운 것:useCallback: 함수를 메모이제이션함 (아직 정확히는 모름) early return: 조건문을 먼저 처리하는 패턴 코드리뷰 답변 잘하는 법: 일단 감사하다고 하기"마지막 줄은 농담이다. 근데 사실이기도 하다. 저장한다. 노션 페이지를 닫는다. 슬랙을 확인한다. 새 메시지는 없다. 다행이다. 9시가 됐다. 가방을 챙긴다. 노트북을 넣는다. 무겁다. 엘리베이터를 탄다. 1층 버튼을 누른다. 내려가면서 생각한다. "내일은 새 이슈를 받을 거다. 또 PR을 올릴 거다. 또 리뷰를 받을 거다." "또 '감사합니다'를 누를 거다." 문이 열린다. 밖으로 나간다. 바람이 차다. 집에 가서 useCallback 강의를 봐야지. 진짜로 이해하고 싶다. 근데 아마 10분 보다가 잘 거다. 언제나 그랬듯이. 그래도 괜찮다. 조금씩이라도 배우고 있으니까. '감사합니다' 버튼을 누를 때마다, 진짜로 배우는 중이니까.오늘도 '감사합니다'를 7번 눌렀다. 내일은 몇 번 누를까.

여자친구 없음, 만들 여유도 없음

여자친구 없음, 만들 여유도 없음

여자친구? 그거 어디서 만들어요 오늘도 혼자 삼각김밥 점심시간이다. 12시 30분. 동료들은 짝 지어 나간다. "뭐 먹으러 가요?" 하면서. 나는 편의점이다. 항상. 참치마요 삼각김밥 2개, 바나나우유 1개. 5,300원. 구석 자리에 앉아서 유튜브를 본다. '리액트 useState 완벽 정리' 같은 거. 밥 먹으면서도 공부한다. 안 하면 불안하다. 15분 만에 먹고 사무실 복귀. 남은 시간에 블로그 글 하나 읽는다. 점심시간 1시간. 밥 15분, 공부 30분, 멍 15분. 이게 내 일상이다.퇴근은 8시, 집 도착은 9시 정시 퇴근은 신기루다. 6시 칼퇴는 선배들 눈치에 못 한다. 7시까지는 있어야 한다. 암묵적 룰. 실제로 일하는 건 아니다. 그냥 있는 거다. 코드 보는 척, 문서 읽는 척. 8시쯤 되면 선배가 "신입, 퇴근해" 한다. 그제야 가방 챙긴다. "수고하셨습니다" 10번 말하고 나온다. 지하철 40분. 집 도착 9시. 샤워하고 밥 먹으면 10시. 인프런 강의 켠다. '자바스크립트 딥다이브' 같은 거. 3시간짜리. 10분 보다가 졸린다. 핸드폰 만진다. 유튜브 쇼츠 본다. 정신 차리면 12시. 내일 또 9시 출근인데. 여자친구? 언제 만나요?주말도 공부다 토요일 오전 11시 기상. 일단 누워서 핸드폰 본다. 커뮤니티 글 읽는다. '신입 개발자 현실' 검색. 다들 나랑 비슷하다. 조금 위안된다. 점심은 배달. 치킨이나 중국집. 혼자 먹기 딱 좋은 거. 오후 2시. "오늘은 공부 좀 해야지" 다짐한다. 노트북 켠다. 유튜브 강의 재생. 30분 보다가 집중력 떨어진다. 디스코드 확인. 부트캠프 동기들 단톡. "야 너 요즘 어때" 누가 묻는다. "그냥 살아" 답한다. "ㅋㅋㅋ 나도" "ㄹㅇ" 다들 힘들다. 위로가 된다. 그러다 보면 저녁 7시. 강의는 30분 봤다. 6시간 날렸다. 일요일도 마찬가지다. 이러다 월요일 아침. 또 출근. 주말에 뭐 했냐고 물으면 "그냥 쉬었어요" 한다. 사실은 쉰 것도 아니다. 그냥 있었다.소개팅 제안이 왔다 부트캠프 동기가 물었다. "신입아, 소개팅 할래?" 친구 회사 후배래. 26살 디자이너. "어... 나 요즘 바빠서" 했다. 거짓말이다. 안 바쁘다. 그냥 여유가 없다. 소개팅 나가면 뭐하냐. 밥 먹고 영화 보고 커피 마시고. 3시간 쓴다. 돈도 5만원 든다. 그 시간에 강의 하나 듣는 게 낫다. 돈도 아낀다. 아니, 사실은 자신이 없다. 나 지금 매력적인 사람인가? 아니다. 연봉 3400만원. 부모님 집 전세 보증금 빌렸다. 취미도 없다. 코딩 공부가 취미다. 재미는 없다. 대화 주제도 없다. 요즘 본 영화도 없다. 드라마도 모른다. "회사 어때요?" 물으면 뭐라 답하나. "힘들어요" 하면 분위기 죽는다. "재밌어요" 하면 거짓말이다. 그냥 안 만나는 게 낫다. 상처만 준다. "다음에 할게" 했다. 동기는 "알았어" 했다. 더 안 물었다. 고맙다. 선배는 말한다 "신입 때 열심히 해야지. 지금 안 하면 나중에 후회해." 맞다. 안다. 그래서 매일 공부한다. 주말도 공부한다. 블로그도 쓴다. 깃허브도 관리한다. 커밋은 매일. 이력서에 쓸 프로젝트도 만든다. 토이 프로젝트. 혼자 만든다. "3년 차 되면 여유 생겨" 선배가 말한다. 3년. 2027년. 그때 되면 29살이다. 그때 연애하면 되나? 근데 다른 선배는 또 말한다. "3년 차도 바빠. 5년 차 돼야 진짜 여유 생겨." 5년 차면 31살이다. 그럼 언제 연애하나요? 퇴근길 지하철에서 여자 둘이 앉아있다. 20대 중반쯤. 손 잡고 있다. 커플이다. 남자가 여자 어깨에 기댄다. 여자는 웃는다. 부럽다. 나도 저러고 싶다. 누군가 손잡고 퇴근하고 싶다. 근데 현실은 혼자다. 지친 얼굴로 핸드폰 본다. 슬랙 메시지 확인한다. 내일 회의 있다. 자료 준비해야 한다. 집 가서 또 일해야 한다. 손잡을 여유가 없다. 마음의 여유도 없다. 지하철 내린다. 편의점 들른다. 컵라면 하나 산다. 1,500원. 집 가서 라면 끓인다. 노트북 켠다. 작업한다. 12시 넘어서 잔다. 내일 또 9시 출근. 이게 내 일상이다. 연애? 그거 어디서 하는 건가요. 커뮤니티에서 본 글 오늘 개발자 커뮤니티에서 글 하나 봤다. "신입 때 연애 포기했습니다. 3년 공부만 했습니다. 후회 없습니다." 댓글 많았다. "저도요" "ㅇㅈ" "그게 답임" 근데 다른 댓글도 있었다. "30 넘으니까 만날 사람도 없더라" "연애 타이밍 놓치지 마세요" 뭐가 맞는 건가. 공부해야 하나. 연애해야 하나. 둘 다 하면 되는 거 아니냐고? 안 된다. 시간이 없다. 체력도 없다. 퇴근하면 녹초다. 주말도 피곤하다. 누군가 만나서 대화하고 데이트하고 그럴 에너지가 없다. 그냥 혼자 있는 게 편하다. 편하다는 건 외롭다는 말이다. 근데 외로운 건 참을 만하다. 익숙해진다. 무서운 건 이게 계속되는 거다. 언제까지 이럴 건가. 어머니의 전화 한 달에 한 번 전화 온다. 어머니. "밥은 먹냐" "회사 괜찮냐" 묻는다. "네 잘 먹어요" "회사 좋아요" 답한다. 거짓말이다. 편의점 삼각김밥 먹는다. 회사는 힘들다. 근데 진실 말하면 걱정하신다. 그러고 싶지 않다. "여자친구는?" 가끔 묻는다. "아직이요" 한다. "이제 나이도 있는데 누구 소개해줄까?" 하신다. "괜찮아요 알아서 할게요" 한다. 알아서 할 거 없다. 만날 생각도 없다. 어머니는 아신다. 내가 거짓말하는 거. 그래도 더 안 묻는다. 고맙다. 전화 끊고 나면 좀 슬프다. 부모님한테 자랑할 게 없다. 여자친구도 없고. 돈도 없고. 그냥 살아있다는 것만 보고하는 전화다. 언젠가는 자랑할 게 생길까. 여자친구 데려가서 "이 사람이에요" 할 수 있을까. 모르겠다. 지금은 아니다. 금요일 저녁 동기들이 물었다. "저녁 먹을래?" 오랜만이다. 다들 바쁘다. 삼겹살집 갔다. 4명. 다 신입 개발자들. 소주 시켰다. 3병 마셨다. 다들 푸념한다. "코드리뷰 스트레스 죽겠어" "선배가 무서워" "나 언제 제대로 하지" 공감한다. 다 같은 처지다. 그러다 누가 물었다. "너네 연애는?" 다들 웃었다. 쓴웃음. "시간이 없지" "돈도 없고" "나부터 잘해야지" 다 같은 답이다. "우리 30 넘으면 결혼 못 하는 거 아니야?" 누가 농담했다. 웃었다. 근데 웃을 일이 아니다. 진짜 그럴 수도 있다. 집 갔다. 취했다. 누웠다. 천장 본다. 생각한다. 나 언제쯤 여유로워질까. 여자친구 만들고, 데이트하고, 행복할 수 있을까. 모르겠다. 지금은 너무 멀다. 그래도 포기는 안 한다. 언젠가는 된다고 믿는다. 3년 차 되면, 아니 5년 차 되면, 여유 생길 거다. 그때 만나면 된다. 천천히 하면 된다. 지금은 나를 키울 때다. 개발자로서, 사람으로서. 그렇게 믿는다. 믿고 싶다. 오늘도 출근한다. 코드 짠다. 공부한다. 내일도 그럴 거다. 모레도. 여자친구는 없다. 만들 여유도 없다. 근데 괜찮다. 아니, 괜찮아질 거다. 언젠가는.오늘도 혼자 삼각김밥이다. 내일도 그럴 거다.