전 직원이 7명인 스타트업에서 유일한 서버 개발자로 근무하다, 토스로 이직하기까지의 준비 과정을 정리했습니다.
여러 분야의 기본 개념들과 예상 면접 질문들로 이루어져 있으니, 아래 나열한 조건에 해당되시는 분들께 도움이 되셨으면 합니다.
- 첫 커리어를 시작하는 신입 & 이직을 준비하는 주니어 서버 개발자
- 서버 직군이 아니여도, 컬쳐핏 면접을 앞두고 있는 개발자
모두 행복하세요.
아래에 나올 CS 항목들은 필자가 "스스로 개념을 정리할 필요가 있는 항목들을 수집한 내용"입니다.
보시는 분들도 자신이 어느 파트가 공부해야 할 지 찾아보고, 필요한 항목들을 수집하여 면접을 준비하시면 좋을 것 같습니다.
- 평소 기술 습득이나, 학습은 어떻게 하고 계신가요?
- 최근에 관심있게 읽으신 기술서적이나 학습한 내용은 무엇인가요?
- 기술블로그에 작성하신 내용 중, 가장 자신있는 내용을 저희에게 설명해주세요.
- 모든 개발자가 알아야 할 SOLID 원칙
- Spring boot에서의 싱글톤 패턴과 이외 디자인 패턴
- REST API vs gRPC
- REST vs GraphQL
- Layered Architecture & Hexagonal Architecture
- Monolithic & MSA
- 트랜잭션 관리가 어려운 분산 환경에서 일관성을 보장하기 위한 방법은 무엇인가요?
- 알아두면 좋을 JVM Option
- JVM 옵션에서 Xmx, Xms를 동일하게 설정하는 이유
- Java의 Object 클래스의 Equals() 메서드와 HashCode() 메서드가 무슨 목적인지 설명해주세요.
- 자료구조 및 Java 컬렉션. with 동적 크기 조정
- 추상클래스와 인터페이스의 차이
- volatile 키워드는 무엇이고 언제 사용하나요?
- synchronized 와 ReentrantLock
- Synchronized는 어떤 내부 원리로 락을 동작시키는지 설명해주세요.(뮤텍스락)
- ConcurrentHashMap과 Atomic 클래스들은 내부적으로 어떻게 동시성 이슈를 해결했는지 아시나요?(CAS)
- ThreadLocal 이란?
- GC 별 특징 및 구조, 동작 과정
- 비동기 처리 및 스레드 관리
- 스레드 상태에 대해 설명해주세요. 혹시 TIMED_WATING이랑 WAITING의 차이를 아시나요?
- JDK 8과 JDK 17, JDK 21의 주요 차이
- Virtual Threads
- OutOfMemoryError의 원인을 분석할 수 있나요?
- JVM Cold Start 최적화를 위해 어떤 접근 방식을 사용했나요?
- Spring MVC와 디스패처 서블릿에 대해 설명해주세요.
- Spring Bean과 생명주기
- 의존성 주입 방식 비교
- Spring DI, IoC, AOP의 개념, AOP의 내부 구현
- Spring Boot 2.x와 3.x의 주요 차이점
- **OpenFeign 외에 다른 HTTP Client를 사용해보았는지? 다른 것들과 비교했을 때 불편한 점은 무엇이 있을까요? **
- 마이크로서비스 간 통신에서 Feign Client를 사용시 주의점
- 분산락(Distributed Lock) 개념 및 적용 방법
- Spring Cloud Config Server의 장단점
- Circuit Breaker 패턴이 필요한 이유 & Spring Cloud Resilience4j 주요 기능
- Spring Cloud MSA 관련 모든것
- JPA는 무엇이며 어떤 특징/장점이 있는가?
- Transaction이란 무엇인가? @Transaction 애너테이션의 주요 옵션에 대해 설명
- 영속성 컨텍스트란 무엇인가?
- N+1 문제와 해결책
- 패치조인과 조인의 차이점을 알고 계신가요?
- JPA OSIV(Open Session In View) 설정
- SQL vs NoSQL , 하이브리드 아키텍처 설계
- 인메모리 DB가 더 빠른 이유
- 정규화/반정규화
- 인덱스란?
- MySQL InnoDB의 기본 격리 수준이 어떻게 될까요?
- Dirty Read, Non-Repeatable Read, Phantom Read, Gap Lock
- MySQL MVCC 방식과 Undo Log에 대해 설명해주세요.
- 비관적 락과 낙관적 락에 대해 설명해주세요.
- Redis는 메모리가 가득 찼을 때 어떻게 동작하나요?
- Redis를 스케일아웃 한다면 어떤 점들을 고려해야 하나요?
- TCP, UDP, HTTP, HTTPS
- 쿠키(Cookie)와 세션(Session), JWT
- HTTP 1.1, HTTP/2, HTTP/3
- REST(Representational State Transfer)
- CORS(Cross-Origin Resource Sharing)
- 특정 요청의 응답 속도가 느려지는 원인은?
- Linux 운영 명령어
- 온프레미스와 클라우드 비교
- 모니터링 및 Alert 구축 시 고려사항
- 쿼리 성능 개선: 인덱싱 및 실행 계획 분석
- 부하 테스트 및 TPS 분석 시 고려사항
- APM 활용 방안
- 배포 전략: 카나리, 블루-그린, 롤링 배포 비교
개인 프로젝트 경험 관련 내용은 첨부한 이력서 를 기반으로 키워드를 추출하여 작성했습니다.
개인적인 경험이다보니 겹치는 내용은 없겠지만, 문제를 어떻게 파악하고 어떤 고민을 통해 어떻게 해결했는지 등을 참고하시는 데에 도움이 되었으면 합니다.
- 답변을 아래와 같은 순서로 진행하면 좋습니다.
a. 진행 배경 → 기술 선택 및 이유 → 해결 방법 및 고민 내용 → 성과 혹은 아쉬운 점- 어떤 역량을 평가하는 질문인지를 구분하여 역량별 답변을 준비하는 것도 좋은 방법이라고 생각합니다.
a. 의사결정 과정 / 문제 해결 능력 / 협업 경험
- 신기능 개발 시에 개발 프로세스와 각 단계별 역할을 설명해주세요.
- Retry 정책을 설계할 때 고려사항
- 여러 부하 테스트 툴(nGrinder, JMeter, k6, Locust) 중에서 nGrinder를 선택한 이유
- 여러 APM 툴(Pinpoint, Datadog, Jaeger, New Relic, Zipkin) 중 Pinpoint을 선택한 이유
- 컴파일러를 모르는 사람이라고 가정하고, 저에게 JIT 컴파일러에 대해 설명해주세요. (상세 레벨 조절에 따른 성능 향상 이유)
- 프로젝트 경험 중, 가장 해결하기 어려웠거나 실패한 경험을 말해주세요. 그리고 어떻게 해결했으며, 해결하지 못했다면 어떤 대처를 해야할 지 말해주세요.
- 근무하시는 동안 다양한 기술적 한계들을 맞이하실 수도 있을 것 같은데, 최선을 다해 어려움 & 기술적 한계를 극복한 사례가 있으신가요?
- 프로젝트 중 실패 경험이 있으시다면 어떤게 있을까요? 만약 다시 돌아간다면 어떤 선택을 하실건가요?
- (성공적으로 마무리한 특정 프로젝트를 지정) 다시 돌아간다면, 어떤 점들을 더 개선할 수 있을까요?
- 만약에 알림 서버를 구축한다고 하면, 컴포넌트별로 어떻게 아키텍처를 설계하실지 궁금한데, 그림으로 설명해주시겠어요?
- DB Agent 방식 vs API 방식 비교
- OpenFeign과 Reactive Feign 비교. 비동기 전송이 목적일 때, WebClient를 제외한 이유는? 그리고 Reactive Feign의 단점.
- 문자 전송 성능이 200ms → 9ms로 개선된 과정은 어떻게 이루어졌나요?
- 동기랑 비동기. 그리고 블로킹이랑 논블로킹에 대해 설명해주세요.
- SSE, WebSocket, MQTT의 동작 방식을 설명해주세요.
- 실시간 알림임에도 REST 방식을 선택한 이유는 무엇인가요?
- JPA OSIV 옵션을 비활성화하지 않은 이유를 설명해주세요.
- 서비스 복구/백업 프로세스 설립시 고려사항
- AWS EC2 시작 템플릿 백업 시 기존 설정(인스턴스 사양, 네트워크, 보안그룹, EBS 사양) 유지 이유
- AWS CLI 기술 선택 이유(AWS 생명주기관리자, Terraform을 사용하지 않은 이유)
- n8n을 선택하여 추가적인 헬스체크를 구축한 이유
- AMI 버저닝 관리를 통해 얻은 이점은 무엇인가요?
- EC2 인스턴스 장애 상황에서 복구를 자동화한 방법은 무엇인가요?
- mysqldump를 활용한 백업 자동화는 어떻게 구성했나요?
- Nginx Brotli 압축 방식을 적용한 이유가 무엇인가요?
- 프로젝트별 JDK 버전 상이 문제를 해결하기 위해 Docker 컨테이너 환경을 어떻게 구축/운영했나요?
- AWS RDS 모니터링 구축 시, AWS CloudWatch 대신 Percona rds_exporter를 선택한 이유
- AWS RDS 모니터링 시스템 구축 과정에서 문제점과 해결방법
- 모니터링할 때 관리 대상으로 여겨지는 주요 지표와 그 이유에 대해 설명해주세요.
- 이미지 처리 서버 구축시, Thumbor를 택한 이유
- 리사이징이 일어나는 전체적인 동작 프로세스를 설명해주세요.
- AWS CloudFront나 S3 Presigned URL을 사용하지 않은 이유가 있나요?
- 모놀리식 아키텍처 구조의 프로젝트를 마이크로서비스로 전환한 이유
- MSA로 전환하며 겪었던 어려움과 해결 방안에 대해 설명해주세요.
- 대용량 데이터(약 60만 건) 조회 성능을 개선한 방법은 무엇인가요?
- API 서버들 간, 혹은 외부 API 통신이 작용하고 있을 때, 서킷 브레이커는 어떻게 설정되어 있나요?
- 만약, 서버가 스케일업 방식으로 이중화되어 있을 때, 외부 API에 문제가 생긴 상황에서 모든 서버들의 서킷브레이커 상태를 동기화하려면 어떻게 해야 할까요?
- DB도 개별 DB로 분리를 하셨나요? 단일 DB와 개별 DB의 운영 방식에 대한 차이를 알고 계신가요?
- 아키텍처는 어떤 것을 사용하고 계신가요? 비즈니스 로직은 (서비스, 도메인) 중 어디에 작성하고 계신가요? 해당 방법의 장단점과 연관지어 이유를 설명해주세요.
위에서 나온 키워드 질문들을 평가 역량별로 그룹핑한 예시입니다.
의사결정 과정
- API 서버를 모놀리식에서 MSA로 전환할 때, 공통 라이브러리를 만들기로 결정한 이유와 과정은?
- JDK 21, Spring Boot 3.4, Spring Cloud 2024.0으로 마이그레이션을 준비하면서 가장 중요하게 고려한 요소는?
- APM 도구를 비교/분석할 때 최종적으로 선택한 기준과 그 과정에서 팀과 어떻게 합의했는가?
- EC2의 Launch Template 업데이트를 자동화할 때, 어떤 전략을 선택했으며 그 선택이 가져온 장점과 단점은?
- Google Play 및 Apple App Store의 구독 결제 상태를 통합 정의할 때, 기존 방식과의 차별점 및 최종 모델을 선택한 기준은?
문제 해결 능력(겪은 어려움과 해결 방법)
- Pinpoint APM을 JDK 8 → JDK 17 환경으로 업그레이드할 때 가장 큰 기술적 문제는 무엇이었고, 이를 어떻게 해결했는가?
- Prometheus 기반 모니터링을 설정할 때 예상치 못한 장애나 데이터 수집 문제를 경험한 적이 있는가? 어떻게 해결했는가?
- Spring Boot 기반 GraphQL을 도입할 때 발생했던 주요 문제는 무엇이었고, 이를 어떻게 극복했는가?
- 대규모 성능 테스트를 진행할 때 JMeter, Gatling, k6, Locust 중 특정 도구를 선택해야 했을 때 어떤 문제가 있었고, 어떻게 해결했는가?
- AWS RDS(MySQL 8.0) 모니터링을 rds_exporter로 구축할 때 성능 최적화와 관련된 어려움이 있었나? 어떻게 해결했는가?
협업 경험
- 모놀리식 API 서버를 MSA로 전환하면서 프론트엔드, 데이터 엔지니어 팀과의 협업은 어떻게 진행했는가?
- APM 시스템(Pinpoint) 도입 후, 개발팀/운영팀과 데이터를 공유하거나 활용할 때 어떤 협업이 필요했으며, 어떻게 조율했는가?
- 구독 결제 시스템 개발 시, Google/Apple 정책 변경과 관련하여 비즈니스 팀과 협업한 경험이 있는가? 어떻게 소통했는가?
- 대규모 성능 테스트를 진행할 때 다른 개발자나 QA 팀과 어떻게 협업하여 효율성을 높였는가?
- 내부 기술 발표를 15회 진행하면서, 발표 주제 선정과 피드백 반영 과정에서 팀원들과 어떻게 협력했는가?
- 구체적인 경험을 포함하면 설득력이 높아집니다.
- STAR 기법(상황, 과제, 행동, 결과)을 활용하면 논리적인 답변 구성이 가능합니다.
- 면접을 보러 가는 회사 혹은 팀에서 운영하는 서비스에 대해서 알아가는 것도 중요합니다. 관심도가 영향을 미칠 수 있다고 생각해요.
관심이 있어야, 이 회사에 입사하여 어떤 기여를 할 수 있을 지 기대하는 바를 말할 수 있음.
- 지원하는 회사 홈페이지에서 지향하는 인재상 파악하기
- 해당 기업의 일하는 방식/원칙 찾아보기
- e.g. 토스의 경우 : "자율"과 "책임"을 중요시.
- 채용 공고 검토하기(맡게될 업무, 지원자격, 우대사항 등)
- 해당 기업의 뉴스 기사를 통해 사업 현황 파악하기
- 해당 기업의 최근 투자 현황과 경쟁 업체들의 현황 파악하기
- 링크드인 > 해당 기업 검색 > 사람들 프로필을 통해 어떤 기술스택으로, 어떤 프로젝트를 진행했는지 파악하기
- 파악한 프로젝트의 소개/기술 중 주요 키워드를 추출하여 관련 기술블로그 아티클 읽기
- 가치관을 통해 지금까지 일할 때(혹은 살아올 때) 어떤 기준을 가지고 판단을 내리고, 행위를 하는지 설명이 가능
- 자신이 우선시하는 특정 가치를 정하여 면접 캐릭터를 준비하면 좋음.
- 일관성, 속도, 완벽함, 고객지향, 장기성장, 안정성 등등
- 그리고 자신의 가치관을 증명하기 위한 사례를 반드시 함께 말하기
- 이전에 경험했던 조직문화 중 가장 잘 맞았던 조직문화 & 잘 맞지 않았던 조직 문화는 무엇인가요?
- 잘 맞았던 조직 문화 : 지원하는 회사의 문화와 유사한 경험을 강조
- 잘 맞지 않았던 조직 문화 : 지원하는 회사의 문화와 반대되는 경험을 말하고, 이를 성장 기회로 삼았다는 점을 강조
- 우리 회사에 입사한다면 조직문화와 일하는 방식 측면에서 가장 기대되는 점은 무엇인가요?
- 지원하는 회사의 문화와 연결 & 기존 경험과 비교하여 차별점을 부각
- 단순한 기대가 아니라, 구체적인 성장 기회와 연결
- 주어진 업무 범위와 가이드를 넘어서 공동의 목표를 위해 스스로 주도적으로 기획하고 실행해 본 사례를 말씀해주세요.
- 주어진 역할을 넘어서 자율적으로 기획하고 실행한 사례를 나열
- 단순히 기술적인 기여 뿐만 아니라, 비즈니스 성과로 연결되는지 검토
- 팀 내/외부의 사람들로부터 협업을 원활하게 이끌어내서, 성과를 창출한 사례를 말씀해주세요.
- 근본적인 공동의 목표(문제)를 파악하고, 이를 해결한 사례를 제시
- 어떤 분들과 함께할 때 가장 즐겁고 헌신적으로 일할 수 있나요?
- 같이 일하고 싶은 & 일하기 싫은 개발자는 어떤 유형인가요?
- 단순한 호불호가 아니라, "어떤 동료와 함께할 때 최고의 성과를 낼 수 있는지" 설명하도록 연결
- 자신의 성격 장점과 단점은 무엇이고, 이를 보완하기 위해 어떻게 노력하고 계신가요?
- 강점은 어떻게 업무에 도움이 되는지
- 단점을 개선하기 위해 노력에서 나온 결과나 경험을 함께 설명
- 자기 인식이 높은 점이 포인트. 이로 인해 평소 삶의나 일의 방식으로 연결되기 때문.
- 회사/인생에서의 실패/성공 경험에 대해 말씀해주세요.
- "실패와 성공을 통해 무엇을 배웠는가"를 강조
- 특히 개인의 성장과 태도 변화를 보여주어도 좋음.
- 실패를 남 탓하지 않고, 본인의 판단 실수를 인정하는 태도 등..
- 실패했던 프로젝트를 다시 하게 된다면 어떻게 성공하도록 시도할 것인가요?
- 업무를 진행하는데 있어서 동료들과 소통은 어떤방식으로 하시나요?
문제가 있다면 바로 직접적으로 말하시는 편인가요?
- 피드백 문화에 대한 개인적인 견해를 노출
- 래디컬 캔도어 (Radical Candor) 검색해보기
- 주변 사람들에게 받았던 긍정적 혹은 부정적인 피드백은 무엇인가요?
- 본인이 주요하게 생각하는 가치를 강조할 수 있도록 긍정적 피드백을 어필(e.g. 자기주도적인 성장 태도)
- 부정적인 피드백을 받고, 수용할 줄 아며 개선하려는 노력을 함께 말할 것
- 평소 스트레스를 받는 요인이 있다면, 어떤 것들인가요?
- 스트레스 관리 능력과 휴식의 중요성을 강조 → 더 나은 업무 성과로 이어지도록
- 짧은 자기소개
- 지원 동기
- 저희 회사에 대해 알고 계신 것이 있으실까요? (자사 서비스 이용)
- 현재 회사(혹은 이전 직장)를 이직하려는 이유는 무엇인가요?
- 우리 회사에서 어떤 기여를 할 수 있을 것 같나요?
- 성격이 외향적인지 내향적인지?
- 주변 사람들은 나를 어떤 사람으로 생각하는지?
- 본인의 강점과 약점은 무엇이라고 생각하나요?
- 본인이 주도적으로 진행한 프로젝트가 있다면 소개해주세요.
- 예상보다 성과가 좋지 않았던 경험이 있다면? 어떻게 대처했나요?
- 가장 최근에 배운 새로운 기술이나 개념은 무엇인가요?
- 자신이 성장했다고 느낀 순간은 언제인가요?
- 이상적으로 생각하는 조직/개발 문화
- 조직 문화에 적응하는 나만의 방법이 있는지
- 팀 내에서 커뮤니케이션할 때 가장 중요하게 생각하는 것은?
- 코드 리뷰나 피드백을 받을 때, 또는 줄 때 중요하게 여기는 점은?
- 같이 일하고 싶은 동료 유형과 같이 일하기 싫은 동료 유형
- 원하는 동료 = "어떤 환경에서 잘 협업하는지"에 중점을 두기
- e.g. "서로 피드백을 주고받으며 개선해 나가며 성장할 수 있는 동료들과 일하고 싶습니다."
- 협업 중 의견 충돌이 발생했을 때 어떻게 해결하는 편인가요?
- 개발자로서 성장하기 위해 동료에게 기대하는 것이 있나요?
- 스스로 어떤 동료가 되고 싶으신가요?
- 자신의 개발자로써의 성장 방향을 녹이기
- e.g. 제가 가진 경험을 공유하고, 저도 동료들에게 배우면서 함께 성장할 수 있는 환경을 만드는 개발자.
- e.g. 단순히 주어진 개발만 하는 것이 아니라, 개발 과정에서 문제를 미리 발견하고, 해결 방안을 함께 고민하는 동료
- "이 API 호출이 많아질 경우 성능 이슈가 발생할 가능성은 없을까?"
- "이 데이터 구조가 향후 확장성을 고려했을 때 적절할까?"
- 팀원들에게 본인을 소개해달라고 하면, 어떤 동료라고 설명이 될 것 같으신가요?
- 다른 사람을 설득할 때, 주로 사용하는 접근 방식이 어떻게 되시나요? (e.g. 경험 기반, 데이터 기반, ...)
- 협업할 때 중요하게 생각하시는 것은 무엇인가요?
- 조직에서는 리더형이신가요? 아니면 팔로우형이신가요?
- Top-down 형식으로 일이 진행된 것 같은데, Bottom-up 형식으로 일하신 경험이 있으실까요? 혹은 Top-down 형식으로 일하면서 마주한 불편함이 있으실까요?
- 주기적으로 회고를 진행하는지? 그렇다면 가장 기억에 남는 회고는?
- 장기적인 목표나 커리어 플랜이 있다면?
- 스트레스 해소 방법(취미, 주말)
- 삶에서 가장 중요하게 생각하는 가치
- 개발자로서 지속적으로 성장하기 위해 어떤 노력을 하고 있나요?
- 최근 가장 관심있게 접한 기술은 무엇인가요?
- 코드를 작성할 때, 어떤 부분을 가장 중요시 여기시나요? (e.g. 가독성, 성능 ..) 그리고 그 이유는 무엇인가요?
- 어떤 개발자가 되고 싶으신가요?
- 회사생활에서 ‘동료와의 화합, 나의 성장, 회사의 성장’ 중 어느 것이 가장 먼저인가요?
- 회사에서 받았던 피드백은 어떤게 기억에 남나요? 그리고 개선하셨나요?
- 신규 기능 개발 시, 업무 프로세스가 어떻게 되나요?
- e.g.) Top-down / Bottom-up 인지, 일정 산출은 어떻게 진행되는지
- 배포 및 운영 프로세스는 어떻게 진행되나요?
- CI/CD 및 배포 환경, 인프라 환경 유무 등
- 장애 대응(백업 및 복구) 체계는 어떻게 구성되어 있나요?
- 팀 구성이 어떻게 되어 있나요?
- 팀에서 사용하는 기술 스택이 어떻게 되나요?
- 팀원들(특히 서버측)의 평균 연차 및 근속 연수가 어떻게 되나요?
- 회사/팀 내 개발문화가 존재하나요? (코드리뷰, 1 on 1, 테크니컬 도큐먼트 작성, 장애 회고 등..)
- 평소 팀 분위기는 어떤가요? (잡담.. 회식.. 동아리.. 등등 유무)
- 신입/경력 개발자의 온보딩 프로세스는 어떻게 진행되나요?
- 입사를 하게 되면 담당하게 될 업무는 무엇인가요?
- 개인의 성장과 역량 개발을 위한 피드백/평가 방식이 있나요?
- 레퍼런스 체크는 어떤 방식으로 진행되나요?
- 지원한 회사에 스페시픽한 질문 추가하기
주변 선배나 혹은 커피챗을 통해 작성한 이력서를 피드백 받아보세요. 쑥스러워도 반드시 필요한 과정입니다.