면접에서는 밝고 웃는 모습, 그리고 자신감을 보여주면 된다고 생각을 했었다. 개발자의 경우, 코딩테스트와 포트폴리오로 그 사람을 정량것 평가가 가능하니, 면접에서는 태도와 자신감이 중심일 거라고 더더욱 생각을 했었다. 하지만, 이는 나의 착각. 1차 면접, 그리고 2차 면접에서도 여전히 그 사람의 역량을 꾸준히 평가한다.
기술면접 질문을 답변을 하더라도, 그 사람의 역량이 어느정도 되냐에 따라 답변의 깊이가 다르다. 또한, 꼬리질문을 몇 단계로 나아가기 때문에, 겉으로만 외워서 말하는 건지 평가도 가능하다.
그래서인지.. 서류 합격, 코딩테스트 합격을 해서 면접 기회를 얻었다고 해서 안심하지 못하는 습관을 가지게 되었다. 그래서 면접을 준비할 때마다, 단순히 답변을 외우기보다는 어떤 질문이 반복적으로 등장하고, 왜 이런 질문을 하는지를 중심으로 정리하기 시작했다. 이 글에서는 특정 기업이나 실제 면접 질문을 다루기보다는, 여러 면접 경험을 통해 반복적으로 마주쳤던 기술 질문의 유형과 그 질문들이 평가하려는 포인트를 정리해보고자 한다.
서론이 길었다... 바로 스타트!
1. 해시테이블이란 무엇인가요?
Set, Map, Heap, Stack과 같은 자료구조에 대한 질문과 더불어서 빈도높은 질문 중 하나다. 사실, HashTable도 Map과 자료구조가 유사하다. <Key, Value> 기반으로 구성된 자료구조이며, Key 값을 기준으로 Value를 찾을 수 있다. 다만, for 문과 같이 모든 요소를 순회하면서 value를 찾는 O(n)의 시간 복잡도가 아닌 O(1)의 시간복잡도가 걸린다. 어떻게 모든 요소를 순회하지 않고 한 번에 찾을 수 있냐? 하면, Hash함수를 이용해서 index를 내부적으로 index를 걸어놓는 방식으로 찾는다. (여기서 index가 뭐냐고 꼬리질문이 들어올 수 있다.)

다만, Java를 기준으로 HashMap과 HashTable의 자료구조 간 묘사한 차이가 있다. HashTable의 경우 동기화가 지원된다. 멀티 스레드 환경에서 안전하게 자료구조를 사용할 수 있으나, 좀 느리다는 단점이 있다.
2. REST API란 무엇인가요?

간단한 질문일 수 있으나, 익숙한 개념으로 생각하고 제대로 답변을 하지 못하는 경우가 꽤 있다. 여기서 Rest란 REpresential State Transfer의 약자이다. 한국어로 해석하자면, 자원에 이름을 명시하여, 자원의 상태를 전송한다는 것이다. 여기서 상태가 무엇인지 잘 모르는 경우가 있다. 상태란, 해당 자원이 어떠한 상황이냐는 것이다.
{
"id": 1,
"status": "ACTIVE"
}
위와 같이, status가 id가 1인 자원의 상태의 예시로 들 수 있다. 정확히 말하자면 상태(State) 자체를 "전송"하는 것이 아니라, 상태를 Json과 같은 형태로 "표현(Represential)"을 하여 전송을 하는 것이다.
3. 정렬 알고리즘에 대해 설명하세요.
정렬 알고리즘은 사실 여러가지가 있다. 이 중에 자주 나오는 5가지에 대해 표로 정리를 하자면 다음 아래와 같다. 붉은 색으로 칠한 정렬은 기존의 n^2 시간복잡도가 아닌 nlog(n) 형태이다.
| 선택정렬 | 정렬안된 요소를 순회를 하면서 가장 작은(큰) 값을 찾아서 정렬 칸에 넣는다. |
| 삽입정렬 | 정렬할 대상을 현재 정렬된 묶음의 요소들을 하나하나 비교하면서 적절한 위치에 삽입한다. |
| 버블정렬 | 2개를 버블로 묶어서 정렬을 한다. 더 이상 버블이 정렬(자리바꿈)할 필요가 없을 때 까지 반복한다. |
| 병합정렬 | 대진표 처럼 생각해도 좋다. 분할하여 정복(정렬/우선순위 두기)한 다음, 병합을 한다. |
| 퀵 정렬 | Pivot(축)을 설정하여 작은 값과 큰 값은 좌우로 옮긴다. 재귀적으로 반복한다. |
사실 이 부분에 대해 굉장히 자세히 설명한 글이 있어, 함께 링크를 남겨놓겠다: https://sjh9708.tistory.com/209#google_vignette
4. 스프링 부트(Spring Boot)의 동작 흐름에 대해 설명하세요.
모든 백엔드 직군이 아닌, Java직군이라면 JVM과 함께 자주 들을 수 있는 질문이다. 여기서 말하는 동작 흐름은 실행 상태에서 "요청을 처리하는 과정"으로 이해를 하면 되겠다. 먼저 스프링 부트는 MVC(Model - View - Controller) 패턴으로 동작을 한다. 클라이언트가 요청을 할 경우 이를 처리하는 순서를 MVC와 함께 설명을 하자면 다음과 같다:
1) 클라이언트의 요청
2) DispatcherServlet이 요청을 접수한다. 그리고 어떤 HandlerMapping을 사용할 지 결정한다.
3) 사용할 Handler Mapping이 결정되었다. 이를 통해 Controller를 찾고, 해당 컨트롤러를 실행할 Handler Adapter를 DispatcherServlet이 찾는다. 즉, DispatcherServlet은 운영 전반을 관리하고 책임지는 오케스트레이션 역할을 한다고 볼 수 있다.

4) Controller에서 요청을 처리한다.
5) 요청은 Service그리고 Repository 계층까지 내려간다. DB에서 요청한 객체를 찾아내는데 이를 Model이라고 한다.
6) 이 Model은 이후 Controller로 전달되어, View 계층에서 JSON 형태로 표현되어 응답된다.
5. 스프링 부트(Spring Boot)와 노드(Node.js)와의 차이점을 말하세요.
본인의 경우, Spring Boot와 Node.js 이 둘을 백엔드로서 구현한 경험이 있다. 여러 프레임워크를 사용해보았을 경우, 이에 대한 차이나 장단점 등을 물어볼 가능성도 높고, 또 각 프레임워크에 대해 알고 사용하는 것이 중요하다.
| Spring Boot | Node.js | |
| 특징 정리 | Java 기반. 멀티 스레드로 운영이 가능하다(하나의 힙에 여러 개의 스택 영역을 가질 수 있음). 객체 지향의 프레임워크. IoC(제어 역전) 설계를 지향한다. 직접 new 클라스 명(); 으로 인스턴스 생성이 아닌, Spring에서 이를 관리하도록 위임한다. |
Javascript 기반. 싱글 스레드(하나의 힙과 콜 스택 영역을 가진다). I/O request의 경우, libuv에서 비동기적으로 처리. 이러한 요청을 libuv에 보내고, 처리된 작업은 콜 스택에 옮기도록 하는 관리를 event loop에서 한다. |
이외에도 설명할 것은 굉장히 많으나, 핵심 내용만 간추려서 요약을 해보았다.
6. JVM(Java Virtual Machine)이 무엇인지 설명하세요.
JVM은 자바 가상 머신의 약자이다. 말 그대로 자바의 바이트코드를 실행하는 가상 컴퓨터이다.
여기서 말하는 가상에 대한 이해가 중요하나. 혹시 마인크래프트의 레드스톤을 사용해 본 적이 있나? 레드스톤 회로엔 리피터와 트렌지스터 블록이 있다. 이를 이용해서 마인크래프트에서 컴퓨터를 만들 수 있는데, 그것도 가상 컴퓨터이다. 마치 하나의 레이어를 덧 씌워서 만든 계층이라 생각하면 될 듯하다.
JVM에는 5개의 메모리 영역이 있다. 클라스 정보를 담는 Method Area, 객체와 인스턴스를 여러 스레드에서 공유하는 Heap 영역, 각 스레드마다 할당하는 Stack 영역, 그리고 PC register와 Native Stack이 있다.
그 이외에도 GC(Garabage Collector)가 있는데, 말 그대로 쓰레기 수집가.. 필요가 없다고 생각되는 데이터는 지우는 역할을 한다.

이렇게... 여전히 궁금한 부분도 있고, 더 많은 생각도 떠오르나, 오늘은 6개의 질문으로 마치려고 한다. 읽어주신 분들께 감사의 말씀을 드린다.
그럼. 끝!
'TIL' 카테고리의 다른 글
| Java의 메모리 구조: 힙(heap)과 스택(stack)을 중심으로 알아보자 (1) | 2025.09.18 |
|---|---|
| 동시성 문제: 여러 개의 스레드를 돌리면 반드시 발생하는 일 (8) | 2025.08.08 |
| OAuth란? 그리고 적용시 고려해야 하는 점 (20) | 2025.07.29 |
| 왜 백엔드에서는 Spring을 사용하는가? (12) | 2025.05.17 |
| 백엔드 개발자라면 당신이 알아야 할 것! OSI 7 계층 (0) | 2025.02.18 |