본문 바로가기
개발자/취업 커리어 입문

불합격 메일을 받던 날, 나는 무엇을 몰랐던 걸까

by 나무011 2026. 6. 21.
면접 경험담 취준 솔직 후기 ⏱ 읽는 시간 약 9분

첫 개발자 면접 탈락 경험담. 기술만 공부하면 된다고 믿었던 내가 현실에서 부딪힌 것들

메일 제목은 "채용 전형 결과 안내"였다. 열어보기 전에 이미 알았다. 합격 메일은 보통 "축하합니다"로 시작하니까. 화면을 스크롤하지 않아도 "아쉽게도"라는 세 글자가 보였다.

그게 내 첫 번째 개발자 면접의 결말이었다. 포트폴리오 만드는 데 석 달, 면접 준비에 두 달. 그리고 탈락 메일 한 통. 그날 저녁 치킨을 시켜놓고 한 조각도 못 먹었다.

이 글은 그 탈락이 내게 가르쳐준 것들을 기록한 것이다. 결과적으로 그 면접이 없었다면, 이후 합격도 없었을 거라고 생각한다. 그래도 당시엔 그냥 아팠다.

불합격 메일을 받던 날
불합격 메일을 받던 날
1지망
첫 면접 지원 회사
당시 드림 컴퍼니
1차
탈락 단계
기술 면접에서 컷
5개월
탈락 후
재정비 기간
합격
두 번째 시도
같은 회사 재지원

면접 당일 — 머릿속이 하얘졌다

면접장에 들어서면서 처음 든 생각은 "왜 이렇게 덥지"였다. 에어컨이 켜져 있는데도 땀이 났다. 면접관이 세 명이었는데, 한 분이 인사도 채 끝나기 전에 질문을 시작했다.

"클로저(Closure)가 무엇인지 설명해 주시겠어요?"

클로저. 나는 클로저를 알고 있었다. 공부했다. MDN도 읽었고 블로그 글도 봤다. 그런데 막상 입을 열자 말이 안 나왔다. 머릿속에서는 분명히 개념이 있는데, 그게 말로 조합이 안 됐다. 결국 "함수가... 외부 변수에 접근할 수 있는... 그러니까 스코프가..."로 시작해서 어딘가 흐지부지 끝났다.

"알고 있는 것과, 설명할 수 있는 것은 완전히 다른 능력이었다."

— 면접장 나오는 길에 깨달은 것

그게 첫 단추였다. 첫 질문에서 흔들리자 이후 질문들이 전부 어렵게 느껴졌다. 이벤트 루프, 프로토타입 체인, 가상 DOM의 동작 원리. 하나하나는 알고 있는 것들이었는데, 면접관 앞에서 말로 풀어내려니 전부 엉켰다.

🔴 실제 면접 질문 & 내 대답 (당시 재현)
Q. "React의 useEffect 의존성 배열이 왜 필요한지 설명해 주세요."
내 대답 (당시)
"useEffect는... 렌더링이 될 때마다 실행되는데, 의존성 배열을 넣으면 그... 특정 값이 바뀔 때만 실행이 돼서, 최적화를 위해서 씁니다. 빈 배열이면 마운트 때만 실행되고요."
나중에 다듬은 대답
"useEffect는 기본적으로 매 렌더링 후 실행됩니다. 의존성 배열은 '이 값들이 변경됐을 때만 이펙트를 다시 실행하라'는 조건을 명시하는 장치입니다. 빈 배열은 '최초 마운트 시 한 번만'을 의미하고, 배열 생략은 '매 렌더링마다'를 의미합니다. 핵심은 이펙트가 의존하는 모든 반응형 값을 배열에 포함시켜 외부 값과의 동기화를 보장하는 것입니다."

당시 대답과 나중에 다듬은 대답을 비교해보면, 내가 틀린 말을 한 게 아니었다. 그냥 불완전하게 알고 있었다. 쓸 줄은 알았지만, 왜 그렇게 설계됐는지는 몰랐던 것이다.

내가 틀렸던 것들 — 솔직 정리

탈락 이후 면접 전날 밤까지 공부했던 내용들을 다시 꺼냈다. 그리고 내가 공부한 방식과 실제 면접에서 필요한 것 사이의 간극을 찾아봤다.

❌ 내가 실제로 준비한 것
개념 글 읽기 (이해한 척)
코딩 테스트 문제 풀기만
포트폴리오 기능 구현
예상 질문 리스트 암기
혼자 공부, 말로 안 해봄
✅ 실제로 필요했던 것
개념을 말로 설명하는 연습
코드 짜면서 이유 설명하기
포트폴리오 기술 선택 근거
꼬리 질문 대비 (왜? 어떻게?)
모의 면접 or 혼잣말 훈련

가장 크게 깨달은 건 "혼자 공부, 말로 안 해봄" 항목이었다. 나는 면접 준비를 전부 책상 앞에 앉아서 읽고 쓰는 방식으로만 했다. 실제로 입 밖으로 꺼내본 적이 한 번도 없었다. 그러니 막상 면접관 앞에서 말이 안 나오는 게 당연했다.

🚨
면접 당일 가장 당황했던 질문들
• "방금 설명하신 내용에서, 그렇게 동작하는 이유가 뭔가요?" (꼬리 질문)
• "프로젝트에서 이 기술을 선택한 이유가 뭐예요? 다른 옵션도 검토해보셨나요?"
• "이 코드를 더 개선할 수 있다면 어떻게 하시겠어요?"
• "가장 어려웠던 기술적 문제가 뭐였고, 어떻게 해결했나요?"

전부 암기로 대비할 수 없는 질문들이었다. 이해가 진짜여야만 답할 수 있었다.

코딩 테스트 — 풀었는데 왜 떨어졌나

코딩 테스트는 3문제 중 2문제를 풀었다. 나름 선방했다고 생각했다. 그런데 면접에서 그 코드를 놓고 질문을 받았을 때 문제가 드러났다.

🟡 코딩 테스트 후 면접관 질문
Q. "이 풀이의 시간 복잡도가 어떻게 되나요?"
내 대답 (당시)
"음... O(n)인 것 같은데요. 반복문이 한 번이라서요."
실제 복잡도 (나중에 분석)
"중첩 반복문이 있어서 O(n²)이었다. 나는 바깥 루프만 보고 O(n)이라고 했다. 면접관은 그 자리에서 내 코드를 가리키며 안쪽 루프를 보여줬다. 쥐구멍을 찾았다."

코딩 테스트를 "일단 통과"만 목표로 준비했기 때문에 생긴 문제였다. 풀고 나서 복잡도를 분석하거나, 더 나은 방법을 고민해본 적이 없었다. 면접관은 풀었냐가 아니라 이해하고 풀었냐를 보고 있었던 것이다.

 
 
 
내가 제출한 코드 vs 면접관이 기대한 수준
// 내가 제출한 코드 — 동작은 하지만 O(n²)
function twoSum(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j];
      }
    }
  }
}

// 면접관이 "개선하면?"이라고 물었을 때 나왔어야 할 답 — O(n)
function twoSum(nums, target) {
  const map = new Map();
  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    if (map.has(complement)) return [map.get(complement), i];
    map.set(nums[i], i); // 값 → 인덱스 저장
  }
}

HashMap을 쓰면 O(n)으로 줄일 수 있다는 걸 면접 이후에야 공부했다. 알고리즘 문제를 "맞추는 것"에만 집중했지, "왜 이게 더 나은가"를 생각해본 적이 없었다.

포트폴리오 — 내 코드인데 설명 못 했다

면접에서 가장 부끄러웠던 순간이 따로 있다. 포트폴리오 프로젝트를 설명하는 도중이었다.

🔵 포트폴리오 관련 질문
Q. "Next.js를 사용하셨는데, SSR과 CSR을 어떤 기준으로 나눠 적용하셨나요?"
내 대답 (당시)
"메인 페이지는 SSR로 했고, 나머지는 CSR로 했습니다."
면접관의 후속 질문 (그리고 나의 침묵)
"그렇게 나누신 이유가 있으신가요? SEO 때문인지, 초기 로딩 때문인지, 아니면 데이터 패칭 전략 때문인지..."

나는 "그냥 Next.js 쓰면 기본으로 그렇게 되는 것 아닌가요?"라고 했다. 면접관의 표정이 묘하게 굳었다.

이게 가장 뼈아픈 부분이었다. 내가 직접 만든 프로젝트인데, 왜 그 기술을 썼는지 설명을 못 했다. 튜토리얼 따라 만들면서 Next.js를 쓴 게 전부였다. "쓸 줄 안다"와 "이해하고 썼다"의 차이. 핵심 교훈

⚠️
포트폴리오 준비의 함정
기능이 동작하는 것과, 왜 그 기술을 선택했는지 설명할 수 있는 것은 다르다. 면접관은 코드를 보는 게 아니라 사고 과정을 보고 있다. "이거 만들어봤어요"가 아니라 "이 문제를 이렇게 판단해서 이 기술로 해결했어요"가 필요하다.

탈락 이후 5개월 — 뭘 바꿨나

😶
 
Month 1 — 멘탈 회복
아무것도 안 했다
솔직히 말하면 2주는 진짜 아무것도 안 했다. 억지로 공부하면 더 안 됐다. 그냥 산책하고, 밥 먹고, 다른 개발자 탈락 후기를 찾아 읽었다. 나만 그런 게 아니라는 걸 확인하는 것만으로도 조금 나아졌다.
📝
 
Month 2 — 복기
면접 질문 하나하나 다시 파헤쳤다
기억나는 질문을 전부 적었다. 그리고 당시 내 대답과 "제대로 된 대답"을 나란히 써봤다. 클로저, 이벤트 루프, 가상 DOM, 렌더링 최적화 — 이번엔 읽는 게 아니라 말로 설명하는 영상을 혼자 찍어봤다. 처음엔 30초도 못 버텼다.
💻
 
Month 3–4 — 재건
포트폴리오를 처음부터 다시 만들었다
기능을 추가하는 게 아니라, 기존 코드의 모든 기술 선택에 이유를 달았다. 왜 Context API 대신 Zustand를 썼는지, 왜 이 컴포넌트를 이렇게 분리했는지. README를 5번 고쳤다. 알고리즘은 풀고 나서 반드시 복잡도와 개선 방법을 메모했다.
🎤
Month 5 — 실전 준비
스터디 멤버와 모의 면접 10회
취준 커뮤니티에서 스터디를 찾아 들어갔다. 주 2회 모의 면접. 처음엔 너무 창피했다. 말이 꼬이면 얼굴이 빨개졌다. 그런데 10회 정도 하고 나자 질문이 날아와도 일단 호흡부터 하고 시작하는 습관이 생겼다. 그게 실제 면접에서 결정적이었다.

두 번째 면접 — 같은 회사에 재지원했다

5개월 후, 같은 회사의 공채가 다시 열렸다. 지원해야 할지 고민했다. 또 떨어지면 더 힘들 것 같았다. 그런데 그 회사 말고 다른 데를 가면 "떨어진 게 그 회사가 어려워서가 아니라 내가 못 해서였는지" 영영 모를 것 같았다. 그냥 넣었다.

🟢 두 번째 면접 — 같은 질문, 다른 대답
Q. (동일 면접관) "클로저가 무엇인지 설명해 주시겠어요?"
두 번째 대답
"클로저는 함수가 선언될 당시의 렉시컬 스코프를 기억하는 것입니다. 즉 함수가 외부 스코프의 변수에 대한 참조를 유지한 채로 반환될 수 있습니다. 자바스크립트에서는 함수가 일급 객체이기 때문에 이게 가능합니다. 실제로 React의 useState나 이벤트 핸들러에서 클로저가 자주 쓰이는데, 예를 들면..."

같은 면접관이었다. 표정이 달라지는 게 느껴졌다.

결과는 합격이었다. 당일 저녁에 연락이 왔다. 치킨을 또 시켰는데 이번엔 다 먹었다.

결국 배운 것 — 6가지로 정리한다

01
아는 것과 설명하는 것은 다르다
개념을 읽고 이해했다고 느껴도, 말로 꺼낼 수 없으면 면접에서는 모르는 것과 같다. 공부 후엔 반드시 혼자라도 입 밖에 내보는 훈련이 필요하다.
02
포트폴리오는 결과물이 아니라 사고 과정이다
기능이 동작하는 것보다, 왜 그 방식을 택했는지를 설명할 수 있어야 한다. 기술 선택의 근거가 없으면 면접관 눈엔 튜토리얼 복사본으로 보인다.
03
꼬리 질문이 진짜 면접이다
"왜요?", "그렇다면?", "다른 방법은요?" 예상 질문 암기로는 대비 불가능하다. 개념의 깊이가 있어야 꼬리를 자를 수 있다.
04
코딩 테스트는 풀고 나서가 더 중요하다
정답 맞추고 넘어가면 절반짜리 준비다. 시간/공간 복잡도 분석, 더 나은 풀이, 엣지 케이스 — 이것까지가 한 세트다.
05
첫 탈락은 실력 측정이다
떨어진 게 실패가 아니라 현재 수준의 정확한 피드백이다. 받기 싫어도, 이 정보가 없으면 어디를 고쳐야 하는지 알 수 없다.
06
모의 면접은 선택이 아니라 필수다
실제 면접과 가장 가까운 환경을 미리 경험하는 것. 혼자 공부한 양의 20%만큼의 모의 면접이, 혼자 공부 80%보다 효과적이었다.
지금 면접을 준비하고 있다면 — 딱 세 가지만
① 오늘 공부한 개념을 자기 전에 30초 동안 혼잣말로 설명해보기
② 포트폴리오의 모든 기술 선택에 "왜?"라는 질문을 달아두기
③ 탈락하면 그 자리에서 기억나는 질문을 전부 메모해두기 (그게 가장 정확한 복기 자료)

첫 탈락은 아팠다. 그런데 돌아보면 그게 없었으면 합격도 없었다. 5개월 동안 고친 것들이 실제로 효과가 있었다는 걸, 두 번째 면접에서 확인했다. 지금 탈락 메일을 받고 이 글을 읽는 분이 있다면 — 오늘 치킨 시키세요. 내일 복기하면 됩니다.


💬 여러분의 첫 면접 경험이 궁금합니다

첫 개발자 면접에서 가장 당황했던 순간이 뭐였나요? 혹은 탈락 이후 어떻게 준비 방식을 바꾸셨는지 — 댓글로 들려주세요. 지금 준비 중인 분들에게도 분명 도움이 될 것 같습니다. 탈락 경험일수록 더 솔직하게 써주셔도 됩니다. 여기는 그런 공간이니까요. 🙏


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 나무핀