• DDD에서 aggregate란?
    • Aggregate는 도메인 주도 설계에서 핵심적인 개념 중 하나로, 연관된 도메인 객체들을 하나의 단위로 묶는 일관성 경계를 의미합니다.
    • (예를 들어 ‘주문’ 도메인을 모델링할 때 주문 자체와 그에 속한 주문 항목들을 함께 다루는 경우가 많습니다. 이럴 때 ‘주문’이 Aggregate Root가 되고, ‘주문 항목들’은 그 내부의 구성요소가 됩니다.
    • 중요한 점은 외부에서는 반드시 Aggregate Root를 통해서만 내부 객체에 접근하거나 조작해야 한다는 것입니다. 이렇게 함으로써 도메인의 불변 조건을 보장하고, 트랜잭션의 범위를 Aggregate 단위로 제한할 수 있어 시스템의 일관성을 유지할 수 있습니다.)
    • 즉, 복잡한 도메인 모델을 관리 가능하게 만들고, 도메인의 무결성을 보장하는 데 중요한 역할을 합니다.
  • msa랑 모놀리식 설명
    • 모놀리식은 모든 기능이 하나의 통합된 애플리케이션으로 구성된 구조입니다.
    • 장점은 초기 개발과 배포가 단순하고 컴포넌트 간 호출이 내부 메서드 호출로 빠르다는 점입니다. 그러나 규모가 커질수록 코드가 복잡해지고, 일부 기능 수정이나 배포가 전체 시스템에 영향을 주는 문제가 있습니다.
    • MSA는 시스템을 작고 독립적인 서비스들로 나누어 개발하는 방식입니다. 각 서비스는 독립적으로 배포되고 확장 가능하며, 자체 DB와 로직을 가집니다.
    • 장점은 서비스 단위의 빠른 배포, 장애 격리, 기술 스택의 다양성 등 여러 장점이 있지만, 반대로 서비스 간 통신 비용이 증가하고, 분산 환경에서 데이터 정합성이나 트랜잭션 관리가 어려워질 수 있습니다.
  • msa서비스 구분 어떤식으로 했나요?
    • 서비스 구분 기준을 ‘도메인’ 기반으로 했고, 구체적으로는 사용자에게 제공되는 핵심 기능 단위로 나눴습니다.
    • 구체적으로는 멀티 게임 보드, 싱글 게임 모드, 회원 관리, 랭킹 관리 등 사용자가 실제로 접하는 핵심 기능 단위로 서비스를 나눴습니다.
    • 장점은 각 기능의 요구사항이 명확하게 구분되기 때문에, 서비스 간 책임이 모호해지지 않고, 각각의 서비스가 독립적으로 개발 및 배포될 수 있다는 점입니다.
    • 각 서비스는 자체 DB를 가지며, 통신은 RESTful API 기반으로 이뤄졌습니다.
  • 데이터 정합성 어떻게 관리했나요?
    • (MSA 도입 처음이었고, 일정상 기능 구현과 MVP 완성이 우선 과제였기에 체계적으로 대응하지는 못했다.)
    • 서비스 간 데이터 중복이나 비동기 처리 시점에서 발생할 수 있는 정합성 문제는 인지하고 있었으나, 기능 단위 완성과 배포에 집중했습니다.
    • (이후에 이 부분 개선을 위해 CQRS 패턴과 이벤트 기반 아키텍처에 대해 찾아보았다.
    • 예를 들어, 사용자 점수 변경이나 랭킹 갱신의 경우 이벤트 발행과 소비를 통해 eventual consistency를 확보하는 방안을 고려해볼 수 있었음.)
  • 왜 kafka를 선택했나요? rabbitmq나 redis pub/sub도 있는데
    • Kafka를 선택한 이유는 사용자의 데이터 안정성 확보가 가장 중요한 고려사항이었기 때문입니다.
    • RabbitMQ는 기본적으로 온메모리 방식으로 동작하기에 장애나 재시작 시 메시지 휘발 가능성이 존재합니다. (durable 옵션을 설정하면 디스크 기반으로도 사용가능하지만, 처리량과 지연 측면에서 불리한 부분도 있음.)
    • Kafka는 기본적으로 디스크 기반 구조로 동작하며, 메시지를 일정 기간 동안 보존할 수 있고, 컨슈머 그룹 기반 메시지 처리 모델을 통해 대용량 처리나 재처리에도 유리합니다.
    • (실제로 게임 결과 데이터를 안정적으로 수집하고, 이를 기반으로 랭킹 업데이트나 사용자 기록 저장을 하기 위해 Kafka 기반의 비동기 이벤트 처리 아키텍처로 전환하게 되었습니다.)
  • 다형성이란?
    • 객체지향의 핵심 개념 중 하나로, 같은 메시지를 서로 다른 객체가 다르게 응답할 수 있는 특징을 말합니다.
    • Animal이라는 부모 클래스에 speak() 라는 케서드가 있을 때, Dog, Cat 같은 자식 클래스들이 이를 각각 ‘멍멍’, ‘야옹’으로 구현하면, 동일한 speak() 호출이 객체 타입에 따라 다르게 동작합니다.
    • 코드의 확장성과 유연성이 높아져서, 새로운 동물 클래스가 추가되더라도 기존 코드를 수정하지 않고 사용할 수 있습니다.
  • 응집도, 결합도 → 스프링 개발시 어떤 상황에 적용되는 거 같은지 편하게 설명해보세요.
    • 응집도는 하나의 클래스나 모듈이 얼마나 하나의 책임에 집중하고 있는지를 나타내는 지표
    • 결합도는 다른 클래스나 모듈에 얼마나 강하게 의존하는지를 나타내는 지표
    • 응집도는 기능 단위로 책임을 분리하고 각 모듈이 자신의 역할만 명확히 하도록 구성, 결합도는 di나 인터페이스 추상화를 통해 낮추는 방향으로 구조를 설계.
    • 유지보수성과 테스트 효율이 높아지고 기능 변경 시 영향 범위를 최소화할 수 있다는 장점이 있습니다.
  • nginx왜 썼나요? apache도 있는데?
    • (Nginx는 비동기 이벤트 구조를 가지고 있어, 동시에 많은 요청을 처리하는 데 Apache보다 효율적입니다. Apache는 쓰레드 기반이라 연결 수가 많아질 수록 리소스 사용이 급증하는 반면, Nginx는 가벼운 구조 덕분에 고성능, 고병렬 처리에 유리했습니다.
    • 트래픽 처리 효율이 중요했기 때문에, 보다 나은 성능과 낮은 리소스 소비, 그리고 설정의 유연성 측면에서 Nginx를 선택했습니다.)
  • nginx로 어떤 역할을 처리했나요?
    • 단순한 웹서버가 아닌 여러 기능을 통합 처리하는 게이트웨이 레벨을 역할로 활용
    • 리버스 프록시 → 클라이언트 요청을 내부 API 서버로 전달
    • 서버 분산을 위해 로드밸런싱 기능도 적용
    • 정적 리소스는 Nginx가 직접 서빙하면서 캐싱 처리를 통해 응답 속도 개선
    • 로그인 이후 특정 API 접근 제어를 위해 Lua 스크립트로 인증, 인가 로직을 구현.
  • GC란?
    • JVM에서 더 이상 사용되지 않는 객체를 자동으로 탐지하고 메모리를 관리하는 것.
    • Java는 명시적으로 메모리를 해제하지 않아도 되는데, 그 이유가 바로 GC 덕분입니다. GC는 힙 메모리 영역에서 참조되지 않는 객체들을 찾아 제거함으로써, 메모리 누수나 OutOfMemoryError를 방지하는 역할을 합니다.
  • http vs https ?
    • HTTP와 HTTPS의 가장 큰 차이는 보안 계층 (SSL/TLS)의 적용 여부입니다.
    • HTTP는 데이터를 암호화하지 않고 평문으로 전송하기 때문에, 중간에 네트워크를 가로채면 요청 내용이 그대로 노출될 수 있습니다.
    • 반면 HTTPS는 TLS(Transport Layer Security)를 통해 클라이언트와 서버 간 데이터를 암호화하여 전송하기 때문에, 도청, 위조, 변조에 강합니다.
    • 또한 HTTPS는 서버의 디지털 인증서 (SSL 인증서)를 통해 사용자가 접속한 서버가 신뢰할 수 있는지 검증하는 과정도 포함되어 있어, 피싱 사이트 예방에도 효과적입니다.
  • https://www.naver.com접속하면 일어나는 일
    • 크게 네 단계로 나누어 설명
    • DNS 조회
      • 사용자가 https://www.naver.com을 입력하면, 브라우저는 먼저 로컬 캐시를 확인하고, 없다면 순차적으로 Root → TLD → Authoritative DNS 서버를 통해 IP 주소를 얻습니다.
    • TCP 연결 및 TLS/SSL Handshake
      • IP를 확보한 뒤 서버와 TCP 3-way Handshake로 연결을 맺고, 이어 TLS Handshake를 통해 서버 인증서 검증 및 세션 키 교환을 통해 보안 채널을 생성합니다.
    • HTTP 요청 및 응답
      • 통신 채널이 만들어지면 브라우저는 서버에 HTTP GET 요청을 보냅니다.
      • 이 요청에는 브라우저 정보, 쿠키, 그리고 원하는 리소스 정보 등이 담겨 있습니다. 서버는 요청을 받아 처리한 후, 200 OK와 같은 상태 코드를 포함한 HTTP 응답으로 HTML, CSS, JavaScript 파일 등을 클라이언트에게 전송합니다.
    • 브라우저 랜더링
      • 받은 HTML은 DOM 트리로, CSS는 CSSOM 트리로 파싱되며, 이를 통해 렌더 트리를 만든 뒤 실제 픽셀을 화면에 그려서 화면에 그려집니다.
    • (OSI 7계층 위주의 설명으로도 정리해두기)
  • gc안쓰는 프로그래밍 적용 산업은 왜 그런 언어를 굳이 사용하는지? 왜 그렇게 생각하는지? (방산이나 뭐 로켓 등 산업에서)
    • (GC 없는 언어(C/C++)를 사용하는 산업은 실시간성, 예측 가능한 메모리 제어, 성능 보장이 중요한 분야입니다.
    • 예를 들어 방산, 항공, 로켓 산업처럼 한 치의 지연이나 오작동도 허용되지 않는 시스템에서는 GC에 의한 예기치 않은 성능 저하조차 위험 요소가 될 수 있습니다.
    • 그래서 수동으로 메모리를 제어할 수 있는 언어를 선택하는 것이고, 안정성과 신뢰성이 최우선인 분야 특성에 부합한다고 생각합니다.)

(etc)

  • WS, WAS
    • Web Server, Web Application Server
    • WS는 정적 리소스, 예를 들면 HTML, CSS, 이미지 등을 클라이언트에 전달하는 역할을 하고
    • WAS는 동적인 처리가 필요한 요청, 예를 들어 DB 조회, 로직 실행과 같은 서버 사이드 처리를 담당합니다.
    • 보통 Nginx나 Apache 같은 WS가 클라이언트 요청을 먼저 받고, 내부적으로 WAS로 요청을 전달해 처리한 뒤 응답을 반환하는 구조로 함게 사용합니다.
  • 객체지향 5원칙 중 2개 설명
    • SOLID
    • 단일 책임 원칙(SRP) : 하나의 클래스는 하나의 책임만 가져야한다는 원칙입니다. 즉, 클래스가 하나의 변경 이유만 가져야 한다는 뜻으로, 유지보수성과 응집도를 높이는 데 기여합니다.
    • 개방-폐쇄 원칙(OCP): 소프트웨어 구성 요소는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다는 원칙입니다. 기능을 추가할 땐 기존 코드를 수정하지 않고, 새로운 클래스를 추가하거나 기존 인터페이스를 구현해서 유연하게 확장할 수 있어야 한다는 의미입니다.
  • abstract vs interface
    • 공통적으로 추상화를 위해 사용된다.
    • abstract 클래스는 공통된 상태와 기본 구현을 함께 제공할 수 있다. 일부 메서드는 구현하고 일부는 추상 메서드로 넘겨 하위 클래스가 구현하게 할 수 있다.
    • interface는 행위 중심의 계약을 정의할 때 사용하며 원래는 메서드 선언만 가능했지만, (java 8 이후로는 default 메서드나 static 메서드도 정의할 수 있게 되었다.)
    • 가장 큰 차이는 상속 구조입니다. 자바는 클래스는 단일 상속만 가능하지만, 인터페이스는 다중 구현이 가능하기 때문에, 여러 역할을 조합해야 할 때는 인터페이스가 더 유리합니다.
    • (인터페이스는 기능에 대한 계약만 정의하고, 실제 구현은 전적으로 구현 클래스에서 맡는 구조입니다. 반면 추상 클래스는 공통된 로직과 상태를 구현해두고, 하위 클래스는 필요한 부분만 오버라이딩해서 쓰는 방식입니다.)

 

지난주부터 갑자기 폭풍전야 같은 시간을 보내서 블로그 글 쓸 시간도 없었고 프로젝트 개발도 멈춰있었는데 ...
이제 좀 숨 돌릴틈이 생겨서 바로 복기 !!!!

 

각 회사가 도메인이나 성격이 너무 다르기도 했지만 .. 일단 !
경험 기반으로 질문 들어왔던 회사 제외, 기술 질문 복기 기록만 올려봅니다.

 

진짜 언제 어디서 기회가 생길지 모른다 .. 부족한 건 인지하고 꾸준히 준비하자 🚀

'CS 및 면접복기' 카테고리의 다른 글

[OS] JVM부터 동시성까지  (2) 2025.09.12
20250820 - 디자인패턴(2)  (2) 2025.08.20
20250818 - 디자인 패턴  (2) 2025.08.18
20250811 - Network  (2) 2025.08.11
20250808  (3) 2025.08.08

+ Recent posts