백엔드 개발자를 준비하면서 받았던 면접 질문, 학습했던 내용, 예상가능한 질문을 선별했습니다.
이 저작물은 CC BY-NC(저작자 표시-비영리)입니다.
기여를 통해서 더 좋은 컨텐츠가 될 수 있도록 해주세요.
이 컨텐츠의 목표는 가능하면 간단하게 면접질문에 대답을 할 수 있도록 하는 것입니다.
당연히 세부적인 지식에 대한 꼬리질문이 들어올 수 있으니, 깊이 있게 공부하는 것을 권장합니다.
신입 포지션에 대한 질문의 모음이기 때문에 경력직의 면접질문은 정리하지 않았습니다.
제가 Java를 주로 사용해서 타 언어에 대한 지식이 부족합니다. 보통 그 언어를 많이 사용해보았는지 정도의 문제가 출제됩니다. 기여가 가능하시다면 부탁드립니다.
백엔드 포지션은 면접 전 검증을 위해 과제 전형을 보는 경우도 많지만, 코딩테스트를 보는 경우가 훨씬 많습니다.
문제를 보고 음성메모로 답을 해봅시다. 그리고 음성메모를 들으면서 자신이 알고있는 것이 잘 전달되는지 확인합시다.
문제에 대한 내용에 대한 답변은 상당히 간추린 내용이기 때문에, 누락되거나 불필요하다 판단하여 덜어낸 부분이 존재할 수 있습니다. 그리고 정답이라고 할만한 것이 존재하지 않는 문제도 존재하기 때문에 '이 사람은 이렇게 답변했겠구나' 정도로 받아들이시는 것을 권장합니다.
예제 답변 그대로 답변하면 좋겠지만, 최대한 짧고 간결하게 대답해야만 면접자 입장에서 좀 더 유리합니다. 궁금하면 면접관님께서 꼬리질문으로 깊이있게 물어보실 것입니다.
추가로 아래 내용에 보충을 하고싶다면, issue 혹은 PR로 기여를 해주세요. 저도 초보 개발자이기 때문에 틀리거나, 잘못된 내용이 있을 수 있습니다.
모의 면접을 도와줄 지인이 있다면 모의면접을 부탁해서 실제 면접처럼 수행하면 더욱 실전에서 도움이 될 것 같습니다.
과제 전형은 애플리케이션 서버를 만들거나, 아니면 특정 프로그램을 작성하는 과제로 나눠질 수 있습니다.
팁을 드리자면 출제 의도를 파악하려고 노력한 코딩을 하셔야합니다. 그리고, 면접에서 관련된 질문이 나올 수 있으니 사용해 본 기술이거나 처음 사용했더라도 학습을 해두셔야합니다. '왜 이 기술을 사용했는가?', '이 기술 말고 다른 선택지는 없는가?' 정도의 질문은 예상해 볼만한 질문이니 대비를 해둡시다. 과제가 통과되었다면 끝난 것이 아닙니다. 그 과제에서 더 개선할 부분은 무엇인지, 확장 포인트는 어디인지까지 고민해봅시다.
과제 전형 자체가 약간 새로운 시도에 가깝기 때문에 정답은 없습니다. 본인이 할 수 있는 최선을 다해서 해당 언어의 철학에 맞는 코드를 작성해봅시다. 가령 객체지향 프로그래밍 언어라면, '재사용성', '변경에 유연함'을 염두에 두고 개선 포인트를 잡아봅시다. 또, 해당 회사의 기술스택을 확인하고 이를 적용할만하다면 적극적으로 사용해봅시다. 최신 기술에 유연한 사고를 갖고 있다는 인상을 줄 수도 있습니다.
코딩테스트는 여러 플랫폼이 있으며, 요즘은 프로그래머스를 많이 사용하고, 언어는 Python을 추천합니다.
제가 추천하는 학습 방법은 2개월 정도를 잡고 코딩테스트 관련 서적을 한 권 끝내거나, 유형별 문제를 푸는 것이고, 여유가 있다면 1~2시간 풀어보고(난이도마다 상이) 풀었다면 시간 복잡도를 생각하고, 다른 풀이는 없는지 고민해봅시다. 대략 이 정도 수준의 공부를 하시고, 실력을 유지하기 위해 꾸준히 한 두 문제씩 풀어봅시다. 저는 코딩테스트가 약한편이어서 더 많은 팁을 드릴 수는 없을 것 같네요.
알고리즘 코딩테스트가 재밌다면 모르겠지만 저처럼 그리 즐겁지 않은신 분은 너무 자존심을 깎아가면서 까지 준비하지는 마시는걸 추천드립니다. 안풀리면 풀이를 보고 이해하시고, 이해가 가지 않는 문제는 현재의 나에겐 너무 어려운 문제일 뿐입니다. 나중에 다시 풀 때, 풀이 없이 풀려고 노력해보고, 같은 과정을 반복해봅시다.
실제 코딩테스트를 볼 때에는, 코드에 주석을 달아두는 편이 유용합니다. 내가 어떻게 풀려고 했는지 의도를 전달할 수 있기 때문입니다. 내가 작성한 코드를 문제와 함께 정리해둡시다. 합격한다면 어떤 질문이 나올지 생각해봅시다.
또, 너무 유형위주의 학습을 하다보면 모든 문제를 유형적으로 분류해서 풀려고 하는 잘못된 접근을 할 수도 있습니다.
문제를 이해하고, 문제를 해결할 수 있는 여러 방법을 고려해서 최적의 방법을 선택해봅시다. 문제를 해결하는 방법은 여러 방법이 있을 수 있습니다.
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리 2.0 대한민국 라이선스에 따라 이용할 수 있습니다.
웹 통신의 큰 흐름: https://www.google.com/ 을 접속할 때 일어나는 일
면접 단골 문제입니다. 면접관 입장에서는 한 질문으로 많은 답변을 들을 수 있기 때문에 대부분의 면접자리에서 나왔던 문제입니다. OSI 7계층과도 연관지어 설명하라는 질문을 받은적도 있습니다.
브라우저가 URL에 적힌 값을 파싱해서 HTTP Request Message를 만들고, OS에 전송 요청을 합니다. 이 때, Domain으로 요청을 보낼 수 없기 때문에 DNS Lookup을 수행합니다.
크롬의 경우 브라우저 → hosts 파일 → DNS Cache의 순서로 도메인에 매칭되는 ip를 찾습니다. 만약 없다면 루트 도메인부터 서브도메인 순으로 찾게됩니다.이 요청은 프로토콜 스택이라는 OS에 내장된 네트워크 제어용 소프트웨어에 의해 패킷에 담기고 패킷에 제어정보를 덧붙여 LAN 어댑터에 전송하고, LAN 어댑터는 이를 전기신호로 변환시켜 송출합니다.
패킷은 스위칭 허브 등을 경유하여 인터넷 접속용 라우터에서 ISP로 전달되고 인터넷으로 이동합니다.
액세스 회선에 의해 통신사용 라우터로 운반되고 인터넷의 핵심부로 전달됩니다. 고속 라우터들 사이로 목적지까지 패킷이 흘러들어가게 됩니다.
핵심부를 통과한 패킷은 목적지의 LAN에 도착하고, 방화벽이 패킷을 검사한 후 캐시 서버로 보내어 웹 서버에 갈 필요가 있는지 검사합니다.
웹 서버에 도착한 패킷은 프로토콜 스택이 패킷을 추출하여 메시지를 복원하고 웹 서버 애플리케이션에 넘깁니다. 애플리케이션은 요청에 대한 응답 데이터를 작성하여 클라이언트로 회송하고, 이는 전달된 방식 그대로 전송됩니다.
TCP와 UDP의 차이점에 대해서 설명해보세요.
TCP는 연결 지향형 프로토콜이고 UDP는 데이터를 데이터그램단위로 전송하는 프로토콜입니다.
TCP는 가상 회선을 만들어 신뢰성을 보장하도록(흐름 제어, 혼잡 제어, 오류 제어) 하는 프로토콜로 따로 신뢰성을 보장하기 위한 절차가 없는 UDP에 비해 속도가 느린편입니다.
TCP는 그래서 파일전송과 같은 신뢰성이 중요한 서비스에 사용되고, UDP는 스트리밍, RTP와 같이 연속성이 더 중요한 서비스에 사용됩니다.
+) 하지만 UDP도 신뢰성을 UDP자체에서 보장하지 않는 것 뿐이지, 개발자가 직접 신뢰성을 보장하도록 할 수 있습니다. 그래서 HTTP/3은 QUIC이라는 프로토콜을 기반으로 하는데, QUIC은 UDP를 기반으로 합니다. 즉, UDP 자체는 신뢰성을 보장하지 않지만, 추가적인 정의를 통해 신뢰성을 보장받을 수 있습니다.
TCP 3, 4 way handshake에 대해서 설명해보세요.
TCP가 가상회선을 만들고 제거하는 과정에 대해서 묻는 질문입니다. TCP를 공부하셨다면 이 정도는 알겠지 하고 묻는 문제고, 실제 면접자리에서는 보통 네트워크에 대해서 설명할 때, 직접 설명하는 편입니다.
TCP 3way handshake는 가상회선을 수립하는 단계입니다. 클라이언트는 서버에 요청을 전송할 수 있는지, 서버는 클라이언트에게 응답을 전송할 수 있는지 확인하는 과정입니다. SYN, ACK 패킷을 주고받으며, 임의의 난수로 SYN 플래그를 전송하고, ACK 플래그에는 1을 더한값을 전송합니다. 정확한 순서는 SYN(n) -> ACK(n + 1), SYN(m) -> ACK(m + 1) 순으로 일어납니다.
왜 임의의 난수를 지정하느냐는 꼬리질문이 나올 수 있습니다. 기존 요청과 구분하기 위해서 정도로 알고있고, 그 이상은 생각해본적이 없네요.
TCP 4way handshake는 TCP연결을 해제하는 단계로, 클라이언트는 서버에게 연결해제를 통지하고 서버가 이를 확인하고 클라이언트에게 이를 받았음을 전송해주고 최종적으로 연결이 해제됩니다. 단, 서버에서 소켓이 닫혔다고 통지해도 클라이언트 측에서는 일정시간 대기하는데, 혹시나 패킷이 나중에 도착할 수 있기 때문입니다.
HTTP와 HTTPS의 차이점에 대해서 설명해보세요.
HTTP는 따로 암호화 과정을 거치지 않기 때문에 중간에 패킷을 가로챌 수 있고, 수정할 수 있습니다. 따라서 보안이 취약해짐을 알 수 있습니다. 이를 보완하기 위해 나온 것이 HTTPS입니다. 중간에 암호화 계층을 거쳐서 패킷을 암호화합니다.
HTTPS에 대해서 설명하고 SSL Handshake에 대해서 설명해보세요.
HTTPS는 HTTP에 보안 계층을 추가한 것입니다. HTTPS는 제3자 인증, 공개키 암호화, 비밀키 암호화를 사용합니다.
제3자 인증은 믿을 수 있는 인증기관에 등록된 인증서만 신뢰하는 것이고, 공개키 암호화는 비밀키를 공유하기 위해 사용합니다. 비밀키 암호화는 통신하는 데이터를 암호화하는데 사용합니다.
클라이언트는 TCP 3way handshake를 수행한 이후 Client Hello를 전송합니다. 서버는 인증서를 보냅니다.(다른 정보들도 전송하나 검색을 통해 알 수 있는 부분입니다. 대개 그 정도까지는 요구하지 않습니다.)
클라이언트는 받은 인증서를 신뢰하기 위해서 등록된 인증기관인지 확인합니다. 이 인증서는 인증기관의 개인키로 암호화되어있고, 공개키로 검증할 수 있습니다.(브라우저에 내장되어있음) 클라이언트는 사이트의 정보와, 서버의 공개키를 얻을 수 있습니다.
서버의 공개키로 통신에 사용할 비밀키를 암호화해서 서버에 보냅니다. 서버는 이를 개인키로 확인하고 이후 통신은 공유된 비밀키로 암호화되어 통신합니다.
제3자 인증: 인증서, 인증기관/공개키 암호화: 인증서, 비밀키 공유/비밀키 암호화: 통신과정
왜 공개키 암호화와 비밀키 암호화를 복합적으로 사용했는지도 질문을 받았습니다.
GET과 POST의 차이점에 대해서 설명해보세요.
대개의 경우 아래의 HTTP 메서드 질문을 더 많이합니다. 하지만 둘의 차이만을 물을 수도 있습니다.
GET요청은 서버에 존재하는 정보를 요청합니다. 이 때 반환되는 정보는 정보 자체가 아니라 정보의 표현입니다.(뒤의 내용은 REST와 연관이 있고, 굳이 답변하지 않으셔도 됩니다.) 일반적으로 Request Body는 입력하지 않는 것이 일반적이며, 레거시 시스템의 경우 요청을 받아들이지 않을 수 있습니다. 캐싱을 수행하기 때문에 캐싱되지 않는 요청은 GET 요청이 맞지 않을 수 있습니다.
POST요청은 서버에 정보를 생성하는 것을 요청합니다. 예전 HTTP 통신은 POST 요청으로 데이터 삭제, 수정도 form요청으로 같이 수행했습니다. POST 요청은 서버의 상태를 변경시키기 때문에 멱등성이 유지되지 않습니다. 보통 Request Body에 요청하는 데이터를 담아 전송합니다.
HTTP 메서드와 이것이 하는 역할에 대해서 설명해보세요.
보통 REST API를 설계했다면 이해할 수 있을정도로 설명하면 되는 것 같습니다.
OPTIONS, HEAD, TRACE의 존재에 대해서는 알아만 둡시다. 특히 TRACE는 몰라도 되는 것 같습니다. OPTIONS는 해당 uri에 대해 서버가 허용하는 메서드를 확인할 때 사용합니다. HEAD는 GET과 비슷하나 header만 가져옵니다.
- GET 요청은 서버에 존재하는 데이터를 요청하는 것입니다. CRUD로 따지면 R입니다.
- POST 요청은 서버에 데이터를 생성하는 것을 요청합니다. CRUD로 따지면 C입니다.
- PUT 요청은 서버에 존재하는 데이터를 수정하거나 존재하지 않으면 생성합니다. CRUD로 따지면 C,U입니다.
- DELETE 요청은 서버에 데이터를 제거할 것을 요청합니다. 존재하지 않아도 동일하게 동작합니다. CRUD로 따지면 D입니다.
- PATCH 요청은 서버에 존재하는 데이터를 일부 수정합니다. CRUD로 따지면 U입니다.
더 나아가서 불필요한 메서드는 허용하지 않고 필요한 메서드만 허용하는 Whitelist 방식으로 관리합시다. 자세한 내용은 HTTP Method 취약점에 대해 검색합시다.
RESTful이란 무엇이며, 이것에 대해서 아는대로 설명해보세요.(보충필요)
REST는 굉장히 난해한 개념입니다. 하지만 REST가 무엇인지 대략의 감은 잡아둡시다. REST API를 설계했다면 충분히 물어볼만한 질문입니다.
HTTP URI를 통해 자원을 표시하고 HTTP Method를 통해 자원에 대한 처리를 표현합니다. 사람이 읽을 수 있는 API라는 것이 특징입니다. HTTP를 사용하기 때문에 HTTP의 특성을 그대로 반영합니다. 또한 별도의 인프라 구축이 필요없습니다.
단점으로는 명확한 표준이 존재하지 않는다는 점, RESTful을 완전히 만족하는 API를 만들기는 매우 까다롭다는 점(그런 REST API로 괜찮은가 참고), REST API가 분산환경에 적합하지 않다는 점이 있습니다.(멱등성을 보장하기 힘들기 때문)
HATEOAS라는 개념이 있는데, 동적인 API를 제공할 수 있게됩니다.(모든 관련된 동작을 URI를 통해 알려줍니다.) 즉, 클라이언트가 API의 변화에 일일이 대응하지 않아도 된다는 장점을 가져옵니다.
CORS란 무엇이며 이것에 대해서 설명해보세요.
CORS는 웹개발을 하다가 흔히 만날 수 있는 이슈입니다. 대개는 프론트엔드 개발시에 로컬에서 API 서버에 요청을 보낼 때 흔하게 발생합니다.
서로 다른 도메인간에 자원을 공유하는 것을 뜻합니다. 대부분의 브라우저에서는 이를 기본적으로 차단하며, 서버측에서 헤더를 통해서 사용가능한 자원을 알려줍니다.
preflight request는 실제 요청을 보내도 안전한지 판단하기 위해 사전에 보내는 요청입니다. OPTIONS 메서드로 요청하며 CORS를 허용하는지 확인합니다. CORS가 허용된 웹서버라면 사용 가능한 리소스를 헤더에 담아 응답합니다.
OSI7계층과 그 존재 이유, TCP/IP 4계층에 대해 설명해보세요.
OSI7계층은 네트워크 통신을 구성하는 요소들 7개의 계층으로 표준화 한 것입니다. 이렇게 표준화하는 것의 장점은 통신이 일어나는 과정을 단계별로 파악할 수 있어, 문제가 발생하면 해당 문제를 해결하기 용이해집니다.
실제로 우리가 대부분 사용하는 네트워크는 TCP/IP 4계층입니다. 통신에 실제로 사용되는 계층이고 1,2 계층이 1계층, 5, 6, 7계층이 4계층으로 운영됩니다.
운영체제는 제가 공부가 부족해서 틀리거나 다른 내용이 있을 수 있습니다.
검색을 통해서 학습하시고, 간단한 자신만의 답을 만들어보세요.
보통 중요하다곤 하나 지엽적인 지식은 잘 안물어보기도 합니다.(비전공자의 경우 더더욱 물어보지 않을 가능성이 큽니다.)
프로세스와 스레드의 차이를 설명해보세요.
프로세스는 실행중인 프로그램을 의미합니다. 스레드는 실행 제어만 분리한 것을 의미합니다.
프로세스는 운영체제로부터 자원을 할당받지만, 스레드는 프로세스로부터 자원을 할당받고, 프로세스의 코드/데이터/힙영역을 공유하기 때문에 좀 더 효율적으로 통신할 수 있습니다. 또한 컨텍스트 스위칭도 캐시 메모리를 비우지 않아도 되는 스레드쪽이 빠릅니다. 그리고, 스레드는 자원 공유로 인해 문제가 발생할 수 있으니 이를 염두에 둔 프로그래밍을 해야합니다.
한 프로세스 안에 여러개의 스레드가 생성될 수 있습니다.
컨텍스트 스위칭에 대해 설명해보세요.
컨텍스트 스위칭은 한 Task가 끝날 때까지 기다리는 것이 아니라 여러 작업을 번갈아가며 실행해서 동시에 처리될 수 있도록 하는 방법입니다.
인터럽트가 발생하면 현재 프로세스의 상태를 PCB에 저장하고 새로운 프로세스의 상태를 레지스터에 저장하는 방식으로 동작합니다. 이 때, CPU는 아무런 일을 하지 않으므로 잦은 컨텍스트 스위칭은 성능저하를 일으킬 수 있습니다.
스레드와 프로세스의 동작방식이 약간 상이한데, 스레드는 캐시메모리나 PCB에 저장해야하는 내용이 적고, 비워야 하는 내용도 적기때문에 상대적으로 더 빠른 컨텍스트 스위칭이 일어날 수 있습니다.
동기와 비동기의 차이(블로킹, 넌블로킹) / 장단점에 대해 설명해보세요.
동기/비동기는 두 개 이상의 무엇인가가 시간을 맞춘다/안맞춘다로 구분할 수 있습니다. 메서드 리턴과 결과를 전달받는 시간이 일치하면 동기입니다. 또, A가 끝나는 시간과 B가 시작하는 시간이 같으면 동기입니다.
블로킹/논블로킹은 동기,비동기와는 관점입니다. 내가 직접 제어할 수 없는 대상(IO/멀티스레드)을 상대하는 방법입니다.
보통 비동기 방식은 여러 개의 처리가 함께 일어나기 때문에, CPU 리소스를 많이 사용하는 작업을 비동기로 처리하게 되면 과부하가 걸릴 수 있습니다.
블로킹 방식은 대상의 작업이 끝날 때 까지 제어권을 대상이 가지고 있는 것을 의미합니다. 그리고 논블로킹은 해당 작업 완료여부와 상관없이 자신의 작업을 그대로 수행합니다.
동기 논블로킹은 계속해서 polling을 수행하기 때문에 컨텍스트 스위칭이 지속적으로 발생해 지연이 발생합니다.
https://youtu.be/HKlUvCv9hvA 를 참고합시다.
멀티스레드 프로그래밍에 대해 설명해보세요.
멀티스레드 프로그래밍은 하나의 프로세스에서 여러개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것을 멀티스레드 프로그래밍이라고 합니다.
장점
- 멀티 프로세스에 비해 메모리 자원소모가 줄어듭니다.
- 힙 영역을 통해서 스레드간 통신이 가능해서 프로세스간 통신보다 간단합니다.
- 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 빠릅니다.
단점
- 힙 영역에 있는 자원을 사용할 때는 동기화를 해야합니다.
- 동기화를 위해서 락을 과도하게 사용하면 성능이 저하될 수 있습니다.
- 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 종료될 수 있습니다.
Thread-safe 하다는 의미와 설계하는 법을 설명해보세요.
두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미합니다.
- java.util.concurrent 패키지 하위의 클래스를 사용합니다.
- 인스턴스 변수를 두지 않습니다.
- Singleton 패턴을 사용합니다.(이 때, 일반적으로 구현하는 Singleton Pattern은 Thread-safe 하지 않습니다.)[참고](https://github.com/ksundong/TIL/blob/master/DesignPattern/singleton-pattern.md)
- 동기화(syncronized) 블럭에서 연산을 수행합니다.
프로세스 동기화에 대해 설명해보세요.
알아야 하는 부분이 조금 많습니다. 면접때에는 적절히 짧게 끊어서 대답합시다. 너무 깊게 들어가면 말을 번복할 가능성도 있고, 잘 모른다는 인상을 주기 쉽습니다.
다중 프로세스 환경에서 자원등에 한 프로세스만이 접근가능하도록 하는 것입니다.
프로세스 동기화를 하지 않으면 데이터의 일관성이 깨지기 때문에 연산결과가 잘못 반환될 가능성이 존재하기 때문에 주의해야 합니다.
Race Condition(경쟁 상태): 여러 프로세스나 스레드가 동기화 메커니즘 없이 자원에 접근하려는 상황을 가리킵니다. 공유된 자원에 대한 접근 순서에 따라 실행 결과가 달라질 수 있는 상황을 의미합니다.
Critical Section(임계 구역): 여러 스레드가 동시에 접근해서는 안되는 공유자원에 접근하는 코드 블럭을 얘기합니다. 한 임계구역에 하나의 스레드 혹은 프로세스만 접근이 가능합니다. 임계 구역에 접근하는 것을 제어하기 위해 세마포어, 뮤텍스와 같은 매커니즘을 사용합니다.
임계 구역 문제를 해결하기 위한 조건(모두 충족해야함)
- 상호 배제(Mutual Exclusion): 한 프로세스가 임계구역에서 동작중이면 다른 프로세스는 접근할 수 없다.
- 진행(Progress): 임계구역에서 작업중인 프로세스가 없다면 입계구역으로 진입하려는 프로세스를 적절히 선택해서 진입할 수 있도록 합니다.
- 유한 대기(Bounded Waiting): 한 프로세스가 임계영역으로 진입을 요청한 후 다른 프로세스는 진입이 유한한 횟수로 제한되어야 합니다. (기아상태 방지)
교착상태와 기아상태의 해결방법에 대해 설명해보세요.
교착상태(Deadlock)가 무엇인지 알고 있어야 합니다. 서로 다른 프로세스가 서로 점유하고 있는 자원의 반납을 대기하고 있는 상태를 의미합니다.
발생조건
- 상호 배제: 한 번에 한 프로세스만 해당 자원을 사용할 수 있어야 합니다.
- 점유 대기: 할당된 자원을 가진 상태에서 다른 자원을 기다립니다.
- 비선점: 다른 프로세스가 자원의 사용을 끝낼 때 까지 자원을 뺏을 수 없습니다.
- 순환대기: 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있습니다.
해결방법
- 예방: 4가지 조건 중 하나라도 만족되지 않도록 합니다.
- 회피: 알고리즘을 데드락이 발생하지 않도록 합니다.
- 회복: 교착상태가 발생할 때, 해결합니다.
- 무시: 회복과정의 성능저하가 심하다면 그냥 무시합니다.
기아상태(Starvation): 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스가 영원히 자원 할당이 되지 않는 경우입니다.
우선순위를 변경합니다.(우선순위를 수시로 변경하거나, 오래 기다린 프로세스의 우선순위를 높여주거나, Queue를 사용합니다.)
세마포어와 뮤텍스의 차이에 대해 설명해보세요.
세마포어는 여러개의 프로세스가 접근 가능한 공유자원을 관리하는 방식이고, 뮤텍스가 될 수 있지만, 뮤텍스는 한 번에 한 개의 프로세스만 접근 가능하도록 관리하는 방식입니다. 따라서 뮤텍스는 세마포어가 될 수 없습니다.
또, 세마포어는 다른 프로세스가 세마포어를 해제할 수 있지만, 뮤텍스는 락을 획득한 프로세스만 락을 반환할 수 있습니다.
가상 메모리에 대해 설명해보세요.
캐시의 지역성에 대해 설명해보세요.
프로세스 관련 용어를 설명해보세요. (알아만 둡시다.)
데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명해주세요.
트랜잭션에 대해서 설명해주세요.
트랜잭션 격리 수준(Transaction Isolation Levels)에 대해서 설명해주세요.
정규화에 대해서 설명해주세요.
JOIN에 대해서 설명해주세요.
RDBMS vs NOSQL에 대해서 설명해주세요.
Redis에 대해서 간단히 설명해주세요.
Redis와 Memcached의 차이에 대해서 설명해주세요.
Elastic Search에 대해서 간단히 설명해주세요.
Elastic Search의 인덱스구조와 RDBMS의 인덱스 구조의 차이에 대해 설명해주세요.
Elastic Search의 키워드 검색과 RDBMS의 LIKE 검색의 차이에 대해 설명해주세요.
MongoDB에 대해서 간단히 설명해주세요.
CAP 이론과, Eventual Consistency에 대해서 설명해주세요.
보통의 자료구조/알고리즘적 지식은 코딩테스트로 검증합니다.
하지만 아래의 개념을 적어도 이해는 한다고 생각하니, 혹시 모르는 부분이 있을 경우 학습을 권장합니다.
시간 복잡도를 계산해주세요.
배열과 링크드 리스트의 차이를 설명해주세요.
Hash Function, HashTable에 대해서 설명해주세요.
Stack, Queue에 대해서 설명해주세요.
Heap, Priority Queue에 대해서 설명해주세요.
Tree, Binary Tree, BST, AVL Tree에 대해서 설명해주세요.
BST의 최악의 경우의 예와 시간복잡도에 대해서 설명해주세요.
피보나치 수열을 코드로 구현하는 방법에 대해서 설명해주세요.
DFS, BFS에 대해서 설명해주세요.
정렬, 탐색에 대해 설명해주세요.
비대칭키 암호화, 대칭키 암호화에 대해 간단히 설명해주세요.
단방향 암호화에 대해서 간단히 설명해주세요.
JWT에 대해서 간단히 설명해주세요.
OAuth에 대해서 간단히 설명해주세요.
SQL Injection에 대해서 간단히 설명해주세요.
XSS에 대해서 간단히 설명해주세요.
CSRF에 대해서 간단히 설명해주세요.
스크립트 언어와 컴파일 언어를 나열하고 차이점을 설명해주세요.
JVM의 구조와 Java의 실행방식을 설명해주세요.
GC가 무엇인지, 필요한 이유는 무엇인지, 동작방식에 대해 설명해주세요.
컬렉션 프레임워크에 대해서 설명해주세요.
제네릭에 대해서 설명해주세요.
애노테이션에 대해서 설명해주세요.
오버라이딩과 오버로딩이 무엇이며 어떤 차이가 있을까요?
인터페이스와 추상클래스의 차이점에 대해 설명해주세요.
클래스는 무엇이고 객체는 무엇인가요?
자바의 원시타입들은 무엇이 있으며 각각 몇 바이트를 차지하나요?
접근 제어자의 종류와 이에 대해 설명해주세요.
객체지향에 대해서 설명해주세요.
SOLID(객체지향 5대원칙)에 대해서 설명해주세요.
동일성(identity)와 동등성(equality)에 대해 설명해주세요. (equals(), ==)
원시타입과 참조타입의 차이에 대해 설명해주세요.
String, StringBuilder, StringBuffer 각각의 차이에 대해 설명해주세요.
Checked Exception과 Unchecked Exception에 대해 설명해주세요. JPA에서 rollback 대상은 무엇일까요?
Java8에서 추가된 Feature에 대해서 설명해주세요.
try-with-resource에 대해서 설명해주세요.
강결합과 느슨한 결합이 무엇인지 설명해주세요.
직렬화와 역직렬화에 대해서 설명해주세요.
자바의 동시성 이슈(공유자원 접근)에 대해 설명해주세요.
Mutable 객체와 Immutable 객체의 차이점에 대해 설명해주세요.
Spring DI/IoC는 어떻게 동작하나요?
Spring Bean이란 무엇인가요?
스프링 Bean의 생성 과정을 설명해주세요.
스프링 Bean의 Scope에 대해서 설명해주세요.
IoC 컨테이너의 역할은 무엇이 있을까요?
DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요?
Autowiring 과정에 대해서 설명해주세요.
Spring Web MVC의 Dispatcher Servlet의 동작 원리에 대해서 간단히 설명해주세요.
프론트 컨트롤러 패턴이란 무엇인가요?
Servlet Filter와 Spring Interceptor의 차이는 무엇인가요?
Spring에서 CORS 에러를 해결하기 위한 방법을 설명해주세요.
Bean/Component 애노테이션에 대해서 설명해주시고, 둘의 차이점에 대해 설명해주세요.
POJO란 무엇인가요? Spring Framework에서 POJO는 무엇이 될 수 있을까요?
Spring Web MVC에서 요청 마다 Thread가 생성되어 Controller를 통해 요청을 수행할텐데, 어떻게 1개의 Controller만 생성될 수 있을까요?
JPA 영속성 컨텍스트의 이점(5가지)을 설명해주세요.
JPA를 쓴다면 그 이유에 대해서 설명해주세요.
N + 1 문제가 발생하는 이유와 이를 해결하는 방법을 설명해주세요.
싱글톤 패턴에 대해서 설명해주세요.(생각보다 어려움)
빌더 패턴에 대해서 설명해주세요.
팩토리 메서드 패턴에 대해서 설명해주세요.
퍼사드 패턴에 대한 예를 들어주세요.
테스트 코드에 대해서 어떻게 생각하고, 작성하나요?
TDD를 알고 있나요? TDD에 대해서 어떻게 생각하나요?
테스트 커버리지에 대해서 어떻게 생각하나요?
AWS 인프라를 구축해보았다면 설명해주세요.
로드 밸런서에 대해서 설명해주세요.
리버스 프록시에 대해서 설명해주세요.
제가 아직 도커, 쿠버네티스에 익숙하지 않아 공부가 좀 더 필요합니다.
관련해서 질문을 받아본적은 없으나, 일반적인 질문을 담아보았습니다.
Docker란 무엇이고 컨테이너 가상화를 왜 사용할까요?
DevOps는 어쩌면 신입에겐 물어보지 않을 수도 있습니다. 하지만 DevOps가 무엇인지 정도는 알아두는게 좋을 것 같습니다.
CI/CD가 무엇인가요? 왜 CI/CD가 장점이 될까요?
DevOps가 무엇인지 설명해주세요.
정답이 없는 질문입니다. 면접관마다 의도하는 답이 다 다를테니 자신만의 방법을 한 번 쯤 생각해보고 답변에 막힘이 없도록 준비합시다.
어떤 기술이나 방법론이 좋아보일 때, 이를 어떻게 설득할 것인가요?
일정이 예상보다 지연될 것 같습니다. 어떻게 해결하실 것인가요?
최신기술에 관심이 있는지 정도를 확인하고자 함입니다. 너무 정확하게 말하지 않아도 관심이 있다는 인상정도를 줄 수 있다면 좋겠습니다.
그 회사의 기술 스택을 찾아보고 관심을 가져봤다 정도의 느낌을 줄 수 있어야합니다.
사용까지 해보면 더더욱 좋을 것 같습니다.
protobuf에 대해서 알고계신가요? 이것은 왜 사용할까요?
gRPC는 무엇이며, RPC는 무엇인가요? 왜 쓸까요?
쿠버네티스가 무엇인가요? 왜 쿠버네티스를 쓸까요?
회사의 기술스택에 관심을 가져보세요. 학습능력이 좋음을 어떤식으로 보여줄 수 있을까요?