Published on

KAKAO 기술 면접 리뷰

Authors
img1
  • 목차

배경

지난 3월 카카오 수시모집에 전형에 지원하였습니다. 그리고 서류-코딩테스트-전화면접-대면기술면접 까지 합격했지만 아쉽게 탈락하고 말았습니다. 떨어져서 아쉬운 마음이 크지만 부족한 점을 깨달은 것은 큰 성과였습니다. 제 자기소개서를 바탕으로 기술면접 때 나왔던 질문을 정리해 보려고 합니다.

질문 & 답변

  • 경력 1년 있으신 데 가장 인상깊었던 프로젝트에서 기여한 바 설명해 주세요.
    • 타운홀 1.0 리뉴얼 프로젝트 설명함. 루비온레일즈 사용했다.
  • 레일즈에서 모델을 다룰 때 어떻게 다뤘나요?
    • 새로운 모델과의 관계를 추가할 때는 어떻게 하나요?
      • 액티브 레코드 모델에 has_many, belong_to 사용 + migration으로 컬럼 추가
    • 레일즈 ORM이 어떻게 작동하는 지 아나요?
      • 나 : 답 X (select 후 limit 1 하는 것 까지만 안다)
    • 커넥션 풀이 무엇인가요?
      • 나 : DB에 접속할 때 새로 연결하면 비용이 켜서 항상 켜저 있으면서 살아있는 무언가
    • 커넥션풀이 어떻게 DB와 연결되었다는 표시를 하나요?
      • 나 : 신호를 보낸다.
    • 한 모델에 종속된 다른 모델의 100개의를 조회했다고 하면 ORM이 실제 쿼리를 어떻게 날리나요?
      • 나 : 100개 모두 limit 1 로 해서 조회합니다.
    • 그렇다면 그것을 개선하기 위해서 한번에 날리는 방법을 아시나요?
      • 나 : 답 X —> 성능 이슈를 고민해 본 적이 없네요ㅠㅠ
  • 오라클 DB를 다뤘다고 했는데 인덱스를 걸 때 규칙에 대해서 설명해 주세요.
    • 나 : 답 X 그냥 대충 걸어보고 빠른 걸로 했던 것 같습니다.
  • Javascript
    • Javascript 콜백함수에 대해서 설명하고 콜백지옥이 무엇인지 설명해 주세요.
      • 나: 콜백이 예를 들어서 폼에서 로그인을 눌렀다고 할 때 그 때 실행되는 함수 맞나요?
      • 유저가 버튼 눌렀을 때, 비동기로 서버에서 어떤 응답이 오고 그것을 처리해서 다시 서버로 전송하는 그런 상황을 상상해 보세요.
      • 나 : 대답 X
    • Javascript var과 let의 차이는 무엇인가요?
    • 스코프 란 무엇인가요? 나 : 변수를 사용할 수 있는 범위입니다. for문 에 괄호 열고 닫히는 것 같은 범위요
    • 화살표 함수란 무엇이고 기존 익명 함수와 차이는 무엇인가요? (내 블로그에서 봤다고…)
    • 나 : 대답X
    • 동기형 프로그래밍과 비동기 프로그래밍의 차이는 무엇인가요?
    • 나 : 대답X
  • Spring의 기본 개념 : AOP, DI, POJO에 대해서 설명하시오
    • 나 : 대답X, 프로퍼티 패턴과 DI를 혼동함.
  • 나의 질문?
    • 디자이너분이 디자인을 하고 나서 실제 서비스에 어떻게 적용되나요?
      • 퍼블리싱을 전문으로 하는 팀이 있어서 퍼블리싱 된 결과를 Vue.js로 다시 변환하는 식으로 작업한다.
    • IDE는 무엇을 사용하나요?
      • InteliJ
    • 혹시 저한테 피드백 할 점이 있나요?
      • 넓고 얕게 공부하신 것 같은데 앞으로 넓고 깊어지면 좋겠다.

면접 후기

1차적인 개념은 대부분 뭉뚱그려서라도 설명했지만 질문이 한단계, 두단계 깊어지자 금세 말문이 막히는 제 자신을 발견했습니다. 창피하기도 했고 제가 평소에 지식을 대하는 태도가 굉장히 느슨했음을 절감할 수 있었습니다. 또 제가 경험했다고 자기소개서에 작성한 내용을 면접에서 답할 수준으로 알고 있지 않다는 것을 깨달았습니다. 앞으로 자기소개서에는 명확히 답변할 수 있는 경험만 적으려고 합니다.

앞으로 공부할 것들

  • 레일즈 액티브 레코드 퍼포먼스 튜닝
    • 관련 링크 내용 요약
      • 쿼리 최적화
        • :select : 필요한 필드만 조회
        • :include : join 처리
      • 테이블 Level Caching
      • 페이지 조각 Caching
      • 페이지 Caching
  • 데이터베이스에 인덱스를 생성하는 규칙
  • 커넥션 풀이란?
    • a database connection cache implementation 데이터베이션 커넥션 캐시를 구현한 것
    • 보통 minimum pool size와 maximum pool size가 있습니다. 만약 maximum pool size에 도달하여, 사용가능한 커넥션이 없다면 풀에서 자원이 반납될 때까지 기다립니다. time-out 시간 안에 다른 커넥션이 반납되지 않는다면 에러가 발생합니다.
    • 커멕션 풀은 데이터베이스에 어떻게 계속 사용중이라는 신호를 보내나요?
      • 커넥션을 주기적으로 heartbeat 혹은 헬스체크 를 합니다.
      • aged timeout, unused timeout 등을 설정해서 주기적으로 리프레쉬 할 수 있습니다.
  • 비동기 프로그래밍과 Callback Hell(콜백 지옥)에 대해서 설명하기
    • 관련 링크
    • 비동기 프로그래밍이란?
      • 코드의 내용을 순차적으로 실행하면서 특정 로직이 끝날 때까지 기다리는 것이 아니라 다음 코드를 먼저 실행하는 것. 자바스크립트의 기본적인 특성이기도 합니다.
      • 예시) Ajax Call, SetTimeOut
    • 콜백 함수란?
      • 다른 함수에 의해 접근할 수 있는 함수
      • 다른 함수의 실행이 완료되었을 때 실행되는 함수
    • 왜 콜백 함수가 비동기 프로그래밍의 문제를 해결할 수 있지?
      • 기다리지 않고 실행되는 비동기 프로그래밍 상황에서 특정 함수가 끝났을 때 실행되어야 할 함수를 정의할 수 있다.
      • ex) 식당 예약
    • Callback Hell(콜백 지옥)은 무엇이지?
      • 콜백 함수 안에 콜백 함수 안에 콜백 함수가 들어 있는 상황.
      • ex) ajax call -> 인코딩 -> 사용자 인증 -> 화면에 표시
      • 이전의 작업이 끝나야 실행할 수 있는 로직이 계속된다면 가독성이 떨어지고 로직을 변경하기도 아주 어려운 상황이 됩니다.
    • 어떻게 해결하지?
      • 콜백 익명 함수를 각각의 함수로 분리합니다.
      • Promise나 Async를 이용합니다.
    • Promise란 무엇이지?
      • Javascript 비동기 처리에 사용되는 객체입니다.
      • 상태
        • Pending : 처음 호출했을 때의 상태
        • Fulfilled : 콜백 함수의 인자 resolved를 모두 수행하였을 때의 상태를 뜻합니다. .then()을 사용해 처리의 결과값을 받아올 수 있습니다.
        • Rejected : resolved가 실패하였을 때의 상태입니다.
      • MDN Promise 링크를 참조하면 더 자세히 알 수 있습니다.
    • Callback Hell의 문제처럼 여러 작업을 어떻게 처리하지?
      • Promise는 작업이 끝나고 Promise 객체를 반환합니다.
      • 반환된 Promise 객체에 .then()을 사용해 Chaining을 할 수 있습니다.
    • 에러 처리는 어떻게 하나요?
      • reject 함수를 등록하기보다 .then().catch() 를 사용하는 편이 좋습니다.
    • Synchronous/Asynchronous, Block/Non-Block
      • 이 링크에 잘 설명되어 있습니다. 개념적인 이해는 가능하나 실무 경험이 좀 더 있어야 깊은 이해와 설명이 가능할 듯 합니다.
    • Closure(클로저)란 무엇일까요?
      • 클로저는 외부함수(포함하고 있는)의 변수에 접근할 수 있는 내부 함수를 일컫습니다. 스코프 체인(scope chain)으로 표현되기도 합니다. 클로저는 세가지 스코프 체인을 가집니다: 클로저 자신에 대한 접근(자신의 블럭내에 정의된 변수), 외부 함수의 변수에 대한 접근, 그리고 전역 변수에 대한 접근. 이렇게 3단계로 구분할 수 있습니다.
      • 클로저를 통해 내부 변수를 참조하는 동안에는 내부 변수가 차지하는 메모리를 GC가 회수하지 않습니다. 따라서 클로저 사용이 끝나면 참조를 제거하는 것이 좋다고 합니다.
      • 이 링크에 설명이 잘 되어 있습니다.