소프트웨어 공학 & 아키텍처 면접 대비
구성: 기본 면접 Q&A → 심화 면접 Q&A → 추가 예상 질문 Q&A → 개념 요약 노트
📋 기본 면접 Q&A 펼치기
Q1. 소프트웨어 개발 생명주기(SDLC)의 단계와 각 단계의 목적을 설명해주세요.
SDLC는 소프트웨어를 계획, 개발, 배포, 유지보수하는 전체 과정을 체계화한 것입니다. 요구사항 분석 단계에서는 사용자와 비즈니스 요구사항을 수집하고 문서화합니다. 설계 단계에서는 시스템 아키텍처와 상세 설계를 수행하여 개발 가이드라인을 제시합니다. 구현 단계에서는 실제 코딩과 단위 테스트를 진행하고, 테스트 단계에서는 통합 테스트와 시스템 테스트를 통해 품질을 검증합니다. 배포 단계에서는 운영 환경에 시스템을 설치하고, 유지보수 단계에서는 버그 수정과 기능 개선을 지속적으로 수행합니다. 각 단계는 명확한 결과물과 검토 과정을 가지며, 다음 단계로 진행하기 전에 품질 기준을 만족해야 합니다.
💡 SDLC
Q2. 애자일 방법론과 폭포수 모델의 차이점과 각각의 장단점을 설명해주세요.
폭포수 모델은 순차적으로 각 단계를 완료한 후 다음 단계로 진행하는 전통적인 방법론입니다. 명확한 단계별 산출물과 일정 예측이 가능하지만, 요구사항 변경에 대한 대응이 어렵고 초기 단계의 오류가 후반에 큰 비용을 발생시킵니다. 애자일 방법론은 짧은 주기의 반복 개발을 통해 점진적으로 소프트웨어를 완성하는 방식입니다. 고객 협업과 변화 대응을 중시하며, 스프린트 단위로 동작하는 소프트웨어를 지속적으로 전달합니다. 애자일의 장점은 빠른 피드백과 요구사항 변경에 대한 유연성이지만, 문서화 부족과 일정 예측의 어려움이 단점입니다. 프로젝트 특성과 조직 문화에 따라 적절한 방법론을 선택해야 합니다.
💡 SDLC
💡 스프린트(Sprint)
애자일(스크럼)에서 짧은 개발 주기를 말한다. 보통 1~4주 동안 팀이 달성 목표(스프린트 목표) 를 정하고, 우선순위 높은 항목을 개발해 동작하는 소프트웨어(인크리먼트) 를 만들어낸다.
- 주요 흐름 👉 스프린트 계획 → 개발/테스트 → 데일리 스탠드업 → 리뷰(데모) → 회고.
Q3. 요구사항 분석의 중요성과 요구사항의 종류를 설명해주세요.
요구사항 분석은 프로젝트 성공의 핵심 요소로, 잘못된 요구사항은 전체 프로젝트의 실패로 이어질 수 있습니다. 요구사항은 기능 요구사항과 비기능 요구사항으로 구분됩니다. 기능 요구사항은 시스템이 제공해야 하는 구체적인 기능과 서비스를 정의하며, "사용자는 로그인할 수 있어야 한다"와 같은 형태입니다. 비기능 요구사항은 성능, 보안, 사용성, 확장성, 호환성 등 시스템의 품질 속성을 정의합니다. 예를 들어 "응답시간은 3초 이내여야 한다"나 "동시 사용자 1000명을 지원해야 한다"는 비기능 요구사항입니다. 요구사항은 명확하고, 완전하고, 일관성 있고, 검증 가능해야 하며, 우선순위가 부여되어야 합니다. 이해관계자와의 지속적인 소통을 통해 요구사항을 정제하고 문서화하는 것이 중요합니다.
💡 이해관계자
이해관계자는 특정 조직, 프로젝트 또는 사업에 직접적 또는 간접적으로 영향을 미치거나 영향을 받는 모든 개인 또는 집단을 뜻합니다. '이해(利害)'는 이익과 손해를 의미하며, 조직의 결정이나 활동으로 인해 이익을 얻거나 손해를 입는 모든 대상을 포괄합니다.
Q4. 객체지향 설계의 SOLID 원칙을 각각 설명하고 적용 예시를 들어주세요.
SOLID는 객체지향 설계의 5가지 기본 원칙입니다. 단일 책임 원칙(SRP)은 클래스가 하나의 책임만 가져야 한다는 원칙으로, 사용자 관리 클래스는 사용자 정보 관리만 담당해야 하고 이메일 전송은 별도 클래스가 담당해야 합니다. 개방-폐쇄 원칙(OCP)은 확장에는 열려있고 수정에는 닫혀있어야 한다는 원칙으로, 새로운 기능 추가 시 기존 코드를 수정하지 않고 확장할 수 있어야 합니다. 리스코프 치환 원칙(LSP)은 하위 타입이 상위 타입을 완전히 대체할 수 있어야 한다는 원칙입니다. 인터페이스 분리 원칙(ISP)은 클라이언트가 사용하지 않는 인터페이스에 의존하지 않아야 한다는 원칙으로, 큰 인터페이스를 여러 작은 인터페이스로 분리해야 합니다. 의존성 역전 원칙(DIP)은 고수준 모듈이 저수준 모듈에 의존하지 않고, 추상화에 의존해야 한다는 원칙입니다.
💡 고수준 모듈(High-level module)과 저수준 모듈(Low-level module)
- 고수준 모듈(High-level module): 비즈니스 규칙·도메인 로직처럼 문제의 본질을 다루는 상위 개념.
- 예: “주문 승인” 규칙을 담은 OrderService, “결제 처리” 유스케이스.
- 저수준 모듈(Low-level module): 구체적인 입·출력, 프레임워크, 라이브러리 같은 세부 구현.
- 예: DB 리포지토리, 이메일/SMS 발송기, 외부 결제 API 클라이언트, 파일/HTTP 어댑터.
Q5. 디자인 패턴이란 무엇이며, 자주 사용되는 패턴들을 설명해주세요.
디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제들에 대한 재사용 가능한 해결책입니다. 생성 패턴인 싱글톤은 클래스의 인스턴스가 하나만 생성되도록 보장하며, 데이터베이스 연결이나 로거에 주로 사용됩니다. 팩토리 패턴은 객체 생성 로직을 캡슐화하여 클라이언트 코드와 구체적인 클래스 간의 결합도를 낮춥니다. 구조 패턴인 어댑터 패턴은 호환되지 않는 인터페이스를 연결하고, 데코레이터 패턴은 객체에 동적으로 새로운 기능을 추가합니다. 행위 패턴인 옵저버 패턴은 객체 간의 일대다 의존성을 정의하여 한 객체의 상태 변화를 여러 객체에 알립니다. 전략 패턴은 알고리즘을 캡슐화하여 런타임에 선택할 수 있게 하고, MVC 패턴은 모델, 뷰, 컨트롤러로 관심사를 분리합니다.
💡 무엇을 재사용하는가?
구체 코드가 아니라 설계 아이디어/구조(패턴) 를 재사용한다. 문제-해결 템플릿이라고 보면 된다.
💡 클래스의 인스턴스
클래스로부터 실제로 메모리에 만들어진 객체 한 개. (new로 만든 결과물)
💡 로거(Logger)
프로그램 동작 정보를 기록(로그) 하는 객체/모듈. 파일, 콘솔, 원격 수집 등으로 남깁니다.
💡 클라이언트 코드
어떤 기능(객체/라이브러리)을 사용하는 쪽의 코드. 반대는 그 기능을 제공하는 구현 코드.
💡 생성 패턴 / 구조 패턴 / 행위 패턴
- 생성 패턴: 객체 생성 방식을 다루는 패턴 (예: 싱글톤, 팩토리, 추상 팩토리, 빌더, 프로토타입)
- 구조 패턴: 클래스/객체의 구성·연결 방식을 다루는 패턴 (예: 어댑터, 데코레이터, 퍼사드, 프록시, 컴포지트, 브리지, 플라이웨이트)
- 행위 패턴: 객체들 협력·책임 분배(행동 규칙) 를 다루는 패턴 (예: 옵저버, 전략, 커맨드, 상태, 템플릿 메서드, 미디에이터, 방문자, 반복자)
Q6. 소프트웨어 테스팅의 종류와 각각의 목적을 설명해주세요.
소프트웨어 테스팅은 품질 보증의 핵심 활동입니다. 테스트 레벨별로는 단위 테스트가 개별 컴포넌트의 기능을 검증하고, 통합 테스트가 컴포넌트 간의 인터페이스를 확인하며, 시스템 테스트가 전체 시스템의 요구사항 충족을 검증합니다. 인수 테스트는 사용자의 관점에서 비즈니스 요구사항을 확인합니다. 테스트 방법별로는 블랙박스 테스트가 내부 구조를 모르는 상태에서 입출력만 확인하고, 화이트박스 테스트가 코드 구조를 알고 모든 경로를 테스트합니다. 회귀 테스트는 수정 후에도 기존 기능이 정상 동작하는지 확인하고, 성능 테스트는 부하 상황에서의 시스템 동작을 검증합니다. 자동화 테스트는 반복적인 테스트를 효율적으로 수행하며, CI/CD 파이프라인의 핵심 요소입니다.
Q7. 코드 품질 관리 방법과 코드 리뷰의 중요성을 설명해주세요.
코드 품질은 소프트웨어의 유지보수성과 확장성에 직접적인 영향을 미칩니다. 정적 분석 도구를 통해 코딩 표준 준수, 잠재적 버그, 복잡도를 자동으로 검사할 수 있습니다. 코드 커버리지 측정으로 테스트의 완전성을 평가하고, 순환 복잡도와 응집도/결합도를 통해 코드의 구조적 품질을 측정합니다. 코드 리뷰는 품질 향상의 가장 효과적인 방법 중 하나로, 버그 조기 발견, 지식 공유, 코딩 표준 준수를 달성할 수 있습니다. 효과적인 코드 리뷰를 위해서는 명확한 가이드라인 설정, 적절한 크기의 변경 단위, 건설적인 피드백 문화가 필요합니다. 또한 리팩토링을 통해 코드 구조를 지속적으로 개선하고, 기술 부채를 관리해야 합니다.
💡 정적 분석 도구
코드를 실행하지 않고 소스만 검사해 규칙 위반, 잠재 버그, 취약점, 스타일 문제를 찾아주는 도구.
💡 코드 커버리지
테스트가 코드 몇 %를 실행했는지를 나타내는 지표. (라인/브랜치/함수 커버리지 등)
👉 높을수록 좋지만, 높은 커버리지 = 좋은 테스트는 아님(품질도 중요).
💡 순환 복잡도(Cyclomatic Complexity)
코드의 분기 수(경로 수)를 수치화한 것. if/for/switch가 많을수록 값↑ → 이해·테스트 난도↑.
👉 값이 높으면 분리/리팩토링 고려.
💡 응집도/결합도(Cohesion/Coupling)
- 응집도: 모듈 내부 기능이 서로 얼마나 밀접하게 관련됐는가(높을수록 좋음).
- 결합도: 모듈 간 의존 정도(낮을수록 좋음).
목표: 응집도↑, 결합도↓로 변경 용이·재사용성 향상.
Q8. 버전 관리 시스템의 중요성과 Git의 주요 개념을 설명해주세요.
버전 관리 시스템은 소스 코드의 변경 이력을 추적하고 관리하는 필수 도구입니다. 여러 개발자의 동시 작업을 지원하고, 변경 사항의 추적과 롤백을 가능하게 하며, 브랜치를 통한 병렬 개발을 지원합니다. Git은 분산형 버전 관리 시스템으로, 각 개발자가 전체 이력을 가진 로컬 저장소를 보유합니다. 주요 개념으로는 커밋(변경 사항의 스냅샷), 브랜치(독립적인 작업 라인), 머지(브랜치 통합), 풀 리퀘스트(코드 검토 및 통합 과정)가 있습니다. Git Flow나 GitHub Flow 같은 브랜치 전략을 통해 효율적인 협업을 수행할 수 있으며, feature 브랜치에서 개발하고 main 브랜치로 통합하는 방식이 일반적입니다. 의미 있는 커밋 메시지와 적절한 커밋 단위는 프로젝트 이력 관리에 중요합니다.
Q9. CI/CD(지속적 통합/지속적 배포)의 개념과 장점을 설명해주세요.
CI/CD는 소프트웨어 개발과 배포를 자동화하는 DevOps 핵심 실천 방법입니다. 지속적 통합(CI)은 개발자들이 작성한 코드를 자동으로 빌드하고 테스트하여 메인 브랜치에 통합하는 과정입니다. 코드 변경 시마다 자동화된 빌드와 테스트가 실행되어 통합 문제를 조기에 발견할 수 있습니다. 지속적 배포(CD)는 검증된 코드를 자동으로 운영 환경에 배포하는 과정으로, 지속적 전달(Continuous Delivery)과 지속적 배포(Continuous Deployment)로 구분됩니다. 주요 장점으로는 빠른 피드백, 배포 위험 감소, 개발 생산성 향상, 수동 작업 오류 방지가 있습니다. Jenkins, GitHub Actions, GitLab CI 등의 도구를 활용하여 파이프라인을 구성하며, 환경별 배포 전략과 롤백 메커니즘을 포함해야 합니다.
💡 통합 문제
여러 개발자의 변경이 합쳐질 때 생기는 충돌·호환성·빌드/테스트 실패 같은 이슈를 말한다.
- 예: 의존 버전 불일치, 인터페이스 변경으로 컴파일 에러, 테스트 깨짐 등.
💡 지속적 전달(Continuous Delivery) vs 지속적 배포(Continuous Deployment)
- 지속적 전달: 코드가 자동으로 빌드/테스트/스테이징까지 올라가고, 운영 배포는 사람의 승인으로 진행.
- 지속적 배포: 승인 없이 검증되면 자동으로 운영에 배포까지 진행.
Q10. 소프트웨어 아키텍처 패턴의 종류와 특징을 설명해주세요.
소프트웨어 아키텍처 패턴은 시스템의 전체 구조를 정의하는 템플릿입니다. 레이어드 아키텍처는 시스템을 계층으로 나누어 각 계층이 하위 계층만 사용하도록 하여 관심사를 분리합니다. MVC 패턴은 모델, 뷰, 컨트롤러로 분리하여 사용자 인터페이스와 비즈니스 로직을 독립적으로 관리합니다. 마이크로서비스 아키텍처는 작은 독립적인 서비스들로 시스템을 구성하여 확장성과 유연성을 제공하지만 복잡성이 증가합니다. 이벤트 주도 아키텍처는 이벤트 생성, 전달, 처리를 통해 느슨한 결합을 달성합니다. 파이프라인 아키텍처는 데이터 변환 과정을 단계별로 처리하며, 클라이언트-서버 아키텍처는 요청자와 제공자를 분리합니다. 각 패턴은 고유한 장단점이 있어 요구사항에 맞는 선택이 중요합니다.
💡 관심사(Concern)
시스템에서 각 영역이 맡는 책임/목표를 말해요.
- 예: UI 표시, 비즈니스 규칙, 데이터 접근, 로깅, 보안 등.
👉 관심사 분리는 이 책임들을 서로 다른 계층/모듈로 나눠 엉키지 않게 만드는 것.
💡 느슨한 결합(Loose Coupling)
모듈들이 구현 세부에 덜 의존하고, 인터페이스/이벤트 같은 추상화로만 연결된 상태.
- 효과: 한 모듈을 바꿔도 파급 영향↓, 테스트/교체/확장이 쉬움.
- 예: 이벤트 주도 아키텍처에서 발행-구독으로 서비스들이 서로를 직접 몰라도 협력.
Q11. 마이크로서비스 아키텍처의 장단점과 모놀리식 아키텍처와의 차이점을 설명해주세요.
마이크로서비스 아키텍처는 애플리케이션을 작은 독립적인 서비스들로 분해하는 아키텍처 스타일입니다. 각 서비스는 특정 비즈니스 기능을 담당하고, 독립적으로 개발, 배포, 확장할 수 있습니다. 주요 장점으로는 기술 스택의 다양성, 독립적 배포, 장애 격리, 팀 자율성 향상이 있습니다. 하지만 네트워크 통신 오버헤드, 분산 시스템의 복잡성, 데이터 일관성 관리, 운영 복잡성 증가라는 단점도 있습니다. 모놀리식 아키텍처는 모든 기능이 하나의 배포 단위로 구성되어 개발과 배포가 단순하지만, 확장성과 기술 선택에 제약이 있습니다. 마이크로서비스로 전환할 때는 조직 구조, 팀 역량, 비즈니스 복잡도를 고려해야 하며, 단계적 분해를 통해 점진적으로 전환하는 것이 일반적입니다.
💡 비즈니스 기능
사용자가 가치로 느끼는 업무 단위의 기능/역량으로, 기술(DB, 캐시)이 아니라 도메인 업무 기준으로 나눈다.
- 예: 주문 관리, 결제, 재고, 배송, 회원/인증, 알림 등
👉 각각이 마이크로서비스 하나가 되어 독립 개발·배포·확장한다.
Q12. RESTful API 설계 원칙과 모범 사례를 설명해주세요.
REST(Representational State Transfer)는 분산 하이퍼미디어 시스템을 위한 아키텍처 스타일입니다. RESTful API 설계의 핵심 원칙으로는 무상태성(각 요청이 독립적), 균등한 인터페이스(HTTP 메서드 활용), 계층화된 시스템, 캐시 가능성이 있습니다. URL은 리소스를 나타내야 하며, HTTP 메서드(GET, POST, PUT, DELETE)로 행위를 표현합니다. 예를 들어 'GET /users/123'은 사용자 조회, 'POST /users'는 사용자 생성을 의미합니다. 명사를 사용하고 동사는 피하며, 복수형을 사용하는 것이 일반적입니다. 적절한 HTTP 상태 코드(200 성공, 404 찾을 수 없음, 500 서버 오류)를 반환하고, API 버전 관리와 문서화를 제공해야 합니다. 페이징, 필터링, 정렬 기능을 지원하고, 보안을 위해 인증과 권한 부여를 구현해야 합니다.
💡 분산 하이퍼미디어 시스템
여러 서버(분산)에서 링크·미디어(하이퍼미디어)로 연결된 자원을 주고받는 시스템. 웹 전체가 대표 예시.
💡 캐시 가능성(Cacheability)
응답을 캐시에 저장해 재사용할 수 있게 설계(적절한 Cache-Control, ETag, Last-Modified 등). → 성능↑, 부하↓.
💡 명사/동사/복수형(URI 작성 규칙)
- 명사 사용: /users, /orders/123/items (자원=명사)
- 동사 지양: /getUser 대신 GET /users/123
- 복수형 권장: 컬렉션은 보통 복수형(/users, /orders)
💡 페이징·필터링·정렬(쿼리 파라미터 예)
- 페이징: GET /users?page=2&size=20
- 필터링: GET /orders?status=PAID&from=2025-09-01
- 정렬: GET /products?sort=price,desc
👉 응답엔 total, page, size, links(next/prev) 같은 메타데이터를 함께 제공하면 좋음.
Q13. 데이터베이스 설계와 관련된 아키텍처 결정 사항들을 설명해주세요.
데이터베이스 설계는 시스템 아키텍처의 핵심 구성 요소입니다. 먼저 관계형 데이터베이스와 NoSQL 데이터베이스 중 선택해야 하는데, 트랜잭션의 ACID 속성이 중요하면 관계형을, 확장성과 유연성이 중요하면 NoSQL을 고려합니다. 데이터 모델링에서는 정규화를 통해 중복을 제거하지만, 성능을 위해 적절한 반정규화도 필요합니다. 대용량 데이터 처리를 위해서는 파티셔닝이나 샤딩을 고려하고, 읽기 성능 향상을 위해 읽기 전용 복제본을 활용할 수 있습니다. CQRS(Command Query Responsibility Segregation) 패턴으로 읽기와 쓰기를 분리하거나, 이벤트 소싱으로 모든 변경 사항을 이벤트로 저장하는 방법도 있습니다. 캐싱 전략과 백업/복구 계획도 중요한 고려사항입니다.
💡 CQRS (Command Query Responsibility Segregation)
쓰기(Command)와 읽기(Query)를 논리적으로 분리하는 패턴.
- 쓰기 모델: 도메인 규칙 검증·상태 변경에 최적화
- 읽기 모델: 조회 성능/형태에 최적화(뷰/캐시 전용 스키마 가능)
장점 👉 확장성↑, 복잡한 읽기 최적화 용이. 단점: 모델 이원화로 복잡도↑, 일관성(최종 일관성) 고려 필요.
💡 이벤트 소싱(Event Sourcing)
현재 상태를 직접 저장하지 않고, 상태 변화를 일으킨 ‘이벤트’들의 로그를 순서대로 저장.
- 현재 상태 = 이벤트를 재생(replay) 해서 복원
- 감사/이력 추적 쉬움, 타 시스템으로 이벤트 발행 용이
- 단점: 재생·스냅샷 관리 필요, 쿼리 난도↑(보통 CQRS와 함께 사용).
Q14. 보안을 고려한 소프트웨어 설계 원칙을 설명해주세요.
보안은 소프트웨어 설계 단계부터 고려되어야 하는 핵심 요소입니다. 최소 권한 원칙에 따라 사용자와 시스템 컴포넌트에 필요한 최소한의 권한만 부여해야 합니다. 심층 방어 전략으로 여러 보안 계층을 구성하여 단일 장애점을 방지합니다. 입력 검증을 통해 SQL 인젝션, XSS 등의 공격을 방지하고, 모든 외부 입력을 신뢰하지 않는 원칙을 적용합니다. 민감한 데이터는 저장 시와 전송 시 모두 암호화하고, 적절한 키 관리 시스템을 구축해야 합니다. 인증과 권한 부여를 명확히 분리하고, 세션 관리를 안전하게 구현합니다. 로깅과 모니터링을 통해 보안 이벤트를 추적하고, 정기적인 보안 감사와 침투 테스트를 수행해야 합니다. 라이브러리와 프레임워크의 보안 업데이트도 지속적으로 관리해야 합니다.
💡 최소한의 권한만 부여하는 이유? (Least Privilege)
침해가 발생해도 피해 범위를 최소화하고, 오남용·실수로 인한 파급 효과를 줄이기 위해서예요. 권한이 적을수록 공격 표면도 작아집니다.
💡 심층 방어(Defense in Depth)
하나가 뚫려도 다른 층이 막도록 여러 겹의 보안 통제를 쌓는 전략.
- 예: WAF → 인증/인가 → 입력 검증 → DB 권한 분리 → 네트워크 분리 → 로그/모니터링.
💡 침투 테스트(Penetration Test, Pentest)
공격자 관점으로 실제 침투 시도를 해보는 모의 해킹.
- 목표: 취약점을 발견·재현·우선순위화해 개선 조치까지 연결. (사전 범위·승인 필수)
Q15. 성능 최적화를 위한 아키텍처 설계 고려사항을 설명해주세요.
성능 최적화는 시스템 요구사항과 사용자 경험에 직접적인 영향을 미칩니다. 수직적 확장(Scale Up)은 더 강력한 하드웨어로 업그레이드하는 방식이고, 수평적 확장(Scale Out)은 더 많은 서버를 추가하는 방식입니다. 로드 밸런싱을 통해 트래픽을 여러 서버에 분산하고, 캐싱 전략을 활용하여 자주 사용되는 데이터를 메모리에 저장합니다. 데이터베이스 최적화에서는 적절한 인덱싱, 쿼리 최적화, 커넥션 풀 관리가 중요합니다. 비동기 처리와 메시지 큐를 활용하여 시스템 응답성을 향상시키고, CDN을 통해 정적 콘텐츠의 전송 속도를 높일 수 있습니다. 코드 레벨에서는 알고리즘 최적화와 메모리 관리에 신경 써야 하며, 프로파일링 도구를 활용하여 병목 지점을 식별해야 합니다.
💡 캐싱 전략
자주 쓰는 데이터를 더 가까운 곳(메모리/엣지/브라우저) 에 저장해 재사용하는 방법.
- 예: 애플리케이션 캐시(메모리/Redis), DB 쿼리 결과 캐시, HTTP 캐시(Cache-Control, ETag), 캐시 무효화 정책(TTL·키 기반 삭제).
💡 커넥션 풀 관리
DB 연결을 미리 만들어 풀에 보관하고 재사용.
- 핵심 튜닝값: 최소/최대 연결 수, 대기 시간, 유휴 연결 타임아웃, 헬스 체크/검증 쿼리.
- 목표: 대기 없이 충분히 빌려주되(DB 부담은 넘지 않게) → 모니터링으로 지속 조정.
💡 프로파일링 도구
코드 실행을 측정해 병목(시간·CPU·메모리·GC·I/O) 을 찾아내는 도구.
- 예: Java: JFR/JMC, VisualVM, YourKit / JS: Lighthouse, Chrome DevTools / DB: EXPLAIN(ANALYZE).
- 활용: 느린 함수·쿼리 찾기 → 최적화 대상 정확히 지정.
Q16. 도메인 주도 설계(DDD)의 핵심 개념과 적용 방법을 설명해주세요.
도메인 주도 설계는 복잡한 비즈니스 로직을 가진 소프트웨어를 설계하는 방법론입니다. 도메인 전문가와 개발자가 협력하여 공통의 언어(Ubiquitous Language)를 만들고, 이를 코드에 반영합니다. 바운디드 컨텍스트는 모델이 적용되는 경계를 정의하여 각 컨텍스트 내에서 일관된 모델을 유지합니다. 엔티티는 고유한 식별자를 가진 객체이고, 값 객체는 식별자 없이 속성으로만 구분되는 객체입니다. 애그리거트는 관련된 객체들을 하나의 일관성 경계로 묶는 단위이며, 애그리거트 루트를 통해서만 접근할 수 있습니다. 도메인 서비스는 특정 엔티티에 속하지 않는 비즈니스 로직을 담당하고, 리포지토리는 애그리거트의 영속성을 추상화합니다. 이벤트 스토밍을 통해 도메인 이벤트를 식별하고, 마이크로서비스의 경계를 결정하는 데 활용할 수 있습니다.
💡 공통의 언어(Ubiquitous Language)
도메인 전문가와 개발자가 같이 쓰는 동일한 용어 체계. 회의·문서·코드(클래스/메서드 이름)까지 같은 말을 써서 오해를 줄이고 모델을 정확히 반영한다.
💡 바운디드 컨텍스트(Bounded Context)
공통 언어와 모델이 유효하게 적용되는 경계. 경계 안에서는 용어·규칙이 일관되게 통하지만, 다른 컨텍스트와는 의미/모델이 달라질 수 있음 → 컨텍스트 간에는 명시적 통합(번역/매핑) 을 사용한다.
Q17. 캐싱 전략과 분산 캐시 시스템을 설명해주세요.
캐싱은 자주 사용되는 데이터를 빠른 저장소에 임시 저장하여 성능을 향상시키는 기법입니다. 브라우저 캐시는 클라이언트 측에서 정적 리소스를 저장하고, CDN은 지리적으로 분산된 서버에 콘텐츠를 캐시합니다. 애플리케이션 레벨 캐시는 메모리나 로컬 저장소를 활용하며, 데이터베이스 캐시는 쿼리 결과를 저장합니다. Cache-Aside 패턴은 애플리케이션이 캐시를 직접 관리하고, Write-Through는 데이터 쓰기 시 캐시와 저장소에 동시에 쓰는 방식입니다. Write-Behind는 캐시에 먼저 쓰고 나중에 저장소에 쓰는 방식으로 성능이 좋지만 데이터 손실 위험이 있습니다. Redis나 Memcached 같은 분산 캐시 시스템은 여러 서버에서 캐시를 공유할 수 있게 하며, 캐시 무효화 전략과 TTL 설정이 중요한 고려사항입니다.
💡 캐시 무효화 전략(Cache Invalidation)
- 갱신 시 삭제(Invalidate on write): DB에 쓰기/수정/삭제가 일어나면 해당 키를 캐시에서 즉시 삭제. 다음 조회 때 DB에서 읽고 캐시에 다시 적재.
- 쓰기-스루/쓰기-비하인드 일관화: Write-Through는 DB와 캐시에 동시에 갱신(무효화 불필요), Write-Behind는 지연 쓰기라서 만료/버전 관리로 불일치 최소화.
- 버전/태그 기반: 데이터 버전(또는 태그)을 키에 포함해 버전 변경 시 자동 미스 유도.
- 시간 기반 만료: TTL로 일정 시간이 지나면 자동 만료.
- 배치 재빌드/정책적 무효화: 배포/정산 시점에 관련 키 범위를 일괄 삭제.
💡 TTL 설정(Time To Live)
캐시 항목이 살아있는 최대 시간. TTL이 지나면 항목은 만료되어 다음 요청에서 DB 재조회 → 캐시에 재적재.
- 짧게: 최신성이 중요할 때(자주 바뀌는 데이터).
- 길게: 변경이 드문 정적/준정적 데이터.
- 팁: 변경 이벤트 + TTL을 함께 쓰고, 인기 키에 대해 분산 만료(랜덤 지터) 를 줘서 동시에 만료되어 몰리는 현상(캐시 스탬피드) 를 줄이자.
Q18. 메시지 큐와 이벤트 기반 아키텍처를 설명해주세요.
메시지 큐는 시스템 간의 비동기 통신을 지원하는 미들웨어입니다. 생산자가 메시지를 큐에 보내면 소비자가 나중에 처리하는 방식으로, 시스템 간의 결합도를 낮추고 확장성을 향상시킵니다. 포인트-투-포인트 모델은 하나의 소비자가 메시지를 처리하고, 퍼블리시-구독 모델은 여러 구독자가 메시지를 받을 수 있습니다. 이벤트 기반 아키텍처는 이벤트의 생성, 감지, 소비, 반응을 중심으로 시스템을 설계하는 방식입니다. 도메인 이벤트는 비즈니스적으로 의미 있는 사건을 나타내며, 이벤트 스토어는 모든 이벤트를 순서대로 저장합니다. Apache Kafka, RabbitMQ, Amazon SQS 등이 대표적인 메시지 큐 시스템이며, 메시지 순서 보장, 중복 처리, 실패 처리 전략이 중요한 고려사항입니다. 이벤트 소싱과 CQRS 패턴과 함께 사용되어 복잡한 분산 시스템을 구축할 수 있습니다.
Q19. 컨테이너 기술과 오케스트레이션의 개념을 설명해주세요.
컨테이너는 애플리케이션과 실행 환경을 하나의 패키지로 묶어 일관된 실행 환경을 제공하는 가상화 기술입니다. Docker가 대표적인 컨테이너 플랫폼으로, 이미지를 통해 애플리케이션을 패키징하고 컨테이너로 실행합니다. 가상 머신보다 가볍고 빠르며, 환경 일관성과 이식성을 제공합니다. 컨테이너 오케스트레이션은 여러 컨테이너의 배포, 관리, 확장을 자동화하는 기술입니다. Kubernetes는 가장 널리 사용되는 오케스트레이션 플랫폼으로, 파드 단위로 컨테이너를 관리하고 서비스 디스커버리, 로드 밸런싱, 자동 확장, 롤링 업데이트를 지원합니다. 마이크로서비스 아키텍처와 결합하여 각 서비스를 독립적으로 배포하고 관리할 수 있으며, 클라우드 네이티브 애플리케이션의 핵심 기술입니다. 모니터링, 로깅, 보안 정책도 컨테이너 환경에 맞게 구성해야 합니다.
Q20. 프로젝트 관리 방법론과 개발팀 협업 도구를 설명해주세요.
효과적인 프로젝트 관리는 소프트웨어 개발의 성공을 위한 핵심 요소입니다. 스크럼은 2-4주의 스프린트로 개발을 진행하며, 일일 스탠드업, 스프린트 계획, 리뷰, 회고 미팅을 통해 팀의 투명성과 적응성을 높입니다. 칸반은 작업의 시각적 관리에 중점을 두어 WIP(Work In Progress) 제한을 통해 흐름을 최적화합니다. 이슈 추적 시스템(Jira, GitHub Issues)으로 버그와 기능 요청을 관리하고, 위키나 문서화 도구로 지식을 공유합니다. 코드 리뷰 도구(GitHub PR, GitLab MR)로 코드 품질을 향상시키고, 슬랙이나 마이크로소프트 팀즈로 실시간 커뮤니케이션을 수행합니다. 번다운 차트나 속도 차트로 진행 상황을 추적하고, 회고를 통해 프로세스를 지속적으로 개선해야 합니다. 원격 근무 환경에서는 도구 활용과 비동기 커뮤니케이션이 더욱 중요해집니다.
🚀 심화 면접 Q&A 펼치기
Q21. 분산 시스템 설계에서 CAP 정리와 일관성 모델을 설명해주세요.
CAP 정리는 분산 시스템에서 일관성(Consistency), 가용성(Availability), 분할 내성(Partition tolerance) 중 최대 두 가지만 동시에 보장할 수 있다는 이론입니다. 네트워크 분할은 분산 시스템에서 필연적으로 발생하므로, 실제로는 CP(일관성과 분할 내성) 또는 AP(가용성과 분할 내성) 시스템 중 선택해야 합니다. 강한 일관성은 모든 노드가 동시에 같은 데이터를 보장하지만 가용성과 성능에 영향을 미칩니다. 결과적 일관성은 일정 시간 후 모든 노드가 같은 상태가 되는 것을 보장하며, NoSQL 시스템에서 많이 사용됩니다. 순차 일관성은 모든 프로세스가 같은 순서로 연산을 보는 것이고, 인과 일관성은 인과 관계가 있는 연산들의 순서만 보장합니다. BASE(Basically Available, Soft state, Eventual consistency) 모델은 ACID의 대안으로 제시되며, 가용성과 성능을 우선시합니다.
Q22. 서버리스 아키텍처의 특징과 활용 사례, 제약사항을 설명해주세요.
서버리스 아키텍처는 서버 관리 없이 코드 실행에만 집중할 수 있는 클라우드 컴퓨팅 모델입니다. FaaS(Function as a Service)는 이벤트에 반응하여 함수를 실행하며, AWS Lambda, Azure Functions, Google Cloud Functions가 대표적입니다. BaaS(Backend as a Service)는 인증, 데이터베이스, 스토리지 등의 백엔드 서비스를 제공합니다. 주요 장점으로는 자동 확장성, 사용한 만큼만 과금, 서버 관리 부담 제거, 빠른 개발 속도가 있습니다. API 게이트웨이, 실시간 데이터 처리, 이미지 처리, 웹훅 처리 등에 적합합니다. 하지만 콜드 스타트 지연시간, 실행 시간 제한, 상태 관리의 어려움, 벤더 종속성, 디버깅의 복잡성 등의 제약사항이 있습니다. 이벤트 주도 아키텍처와 잘 결합되며, 마이크로서비스 패턴의 극단적인 형태로 볼 수 있습니다.
Q23. 클라우드 네이티브 아키텍처의 핵심 원칙과 12-Factor App을 설명해주세요.
클라우드 네이티브 아키텍처는 클라우드의 장점을 최대한 활용하도록 설계된 아키텍처입니다. 핵심 원칙으로는 마이크로서비스 기반 구성, 컨테이너화된 배포, DevOps 문화, 자동화된 CI/CD가 있습니다. 12-Factor App은 클라우드 네이티브 애플리케이션의 설계 원칙입니다. 코드베이스는 버전 관리되며 여러 배포에서 공유하고, 의존성은 명시적으로 선언하고 격리합니다. 설정은 환경 변수로 관리하고, 백업 서비스는 연결된 리소스로 취급합니다. 빌드, 릴리스, 실행 단계를 엄격히 분리하고, 애플리케이션은 무상태 프로세스로 실행합니다. 서비스는 포트 바인딩으로 노출하고, 프로세스 수를 늘려 확장합니다. 빠른 시작과 우아한 종료를 지원하고, 개발과 프로덕션 환경을 최대한 비슷하게 유지합니다. 로그는 이벤트 스트림으로 취급하고, 관리 작업은 일회성 프로세스로 실행합니다.
Q24. 시스템 모니터링과 관측성(Observability)을 위한 설계 전략을 설명해주세요.
관측성은 시스템의 내부 상태를 외부에서 추론할 수 있는 능력으로, 분산 시스템에서 특히 중요합니다. 관측성의 세 기둥은 메트릭, 로그, 트레이스입니다. 메트릭은 시계열 데이터로 시스템의 성능과 상태를 수치화하며, Prometheus와 Grafana로 수집과 시각화를 수행합니다. 로그는 이벤트의 상세한 기록으로 구조화된 로그(JSON)와 중앙 집중식 로그 관리(ELK Stack)가 중요합니다. 분산 트레이싱은 요청이 여러 서비스를 거치는 과정을 추적하며, OpenTelemetry, Jaeger, Zipkin 등의 도구를 사용합니다. SLI(Service Level Indicator), SLO(Service Level Objective), SLA(Service Level Agreement)를 정의하여 서비스 품질을 측정하고 관리합니다. 알림은 증상 기반으로 설정하여 노이즈를 줄이고, 대시보드는 비즈니스 메트릭과 기술 메트릭을 모두 포함해야 합니다.
Q25. 데이터 파이프라인과 실시간 스트림 처리 아키텍처를 설명해주세요.
데이터 파이프라인은 데이터를 수집, 변환, 저장하는 일련의 과정을 자동화한 시스템입니다. 배치 처리는 정해진 시간에 대량의 데이터를 처리하며, Hadoop과 Spark가 대표적입니다. 실시간 스트림 처리는 데이터가 생성되는 즉시 처리하며, Apache Kafka, Apache Flink, Apache Storm을 사용합니다. Lambda 아키텍처는 배치와 스트림 처리를 병행하여 완전성과 실시간성을 모두 확보하고, Kappa 아키텍처는 스트림 처리만으로 모든 데이터를 처리합니다. ETL(Extract, Transform, Load)은 전통적인 데이터 처리 방식이고, ELT(Extract, Load, Transform)는 클라우드 환경에서 널리 사용됩니다. Change Data Capture(CDC)로 데이터베이스 변경사항을 실시간으로 캡처하고, 이벤트 소싱으로 모든 변경을 이벤트로 기록할 수 있습니다. 데이터 품질 관리와 스키마 진화도 중요한 고려사항입니다.
Q26. 보안 아키텍처 설계 원칙과 제로 트러스트 모델을 설명해주세요.
보안 아키텍처는 시스템의 모든 계층에서 보안을 고려하는 전체적인 접근 방식입니다. 심층 방어(Defense in Depth) 전략으로 여러 보안 계층을 구성하고, 최소 권한 원칙으로 필요한 최소한의 권한만 부여합니다. 제로 트러스트 모델은 "믿지 말고 검증하라"는 원칙하에 모든 접근을 의심하고 지속적으로 검증하는 보안 모델입니다. 네트워크 위치에 관계없이 모든 사용자와 디바이스를 인증하고, 마이크로 세그멘테이션으로 네트워크를 세분화합니다. 정체성 중심 보안으로 사용자, 디바이스, 애플리케이션의 정체성을 지속적으로 검증하고, 조건부 접근 제어로 컨텍스트에 따라 접근 권한을 조정합니다. API 보안에서는 OAuth 2.0과 JWT를 활용한 인증과 권한 부여, 속도 제한, 입력 검증이 중요합니다. 컨테이너 보안에서는 이미지 스캐닝, 런타임 보안, 네트워크 정책을 적용해야 합니다.
Q27. 대용량 트래픽 처리를 위한 아키텍처 설계 전략을 설명해주세요.
대용량 트래픽 처리는 확장성, 가용성, 성능을 모두 고려한 아키텍처 설계가 필요합니다. 수평적 확장을 기본으로 하여 로드 밸런서를 통해 트래픽을 분산하고, 오토 스케일링으로 트래픽 변화에 자동 대응합니다. CDN을 통해 정적 콘텐츠를 지리적으로 분산하여 전송하고, 다단계 캐싱 전략으로 데이터베이스 부하를 줄입니다. 데이터베이스는 읽기 복제본을 활용하여 읽기 성능을 향상시키고, 샤딩을 통해 쓰기 성능도 확장합니다. 비동기 처리와 메시지 큐를 활용하여 시스템 응답성을 유지하고, 서킷 브레이커 패턴으로 장애 전파를 방지합니다. 모니터링과 알람 시스템을 구축하여 문제를 조기에 발견하고, 카나리 배포나 블루-그린 배포로 안전한 배포를 수행합니다. 성능 테스트와 부하 테스트를 정기적으로 수행하여 시스템의 한계를 파악하고 개선점을 도출해야 합니다.
Q28. 멀티테넌트 아키텍처의 설계 방식과 고려사항을 설명해주세요.
멀티테넌트 아키텍처는 하나의 애플리케이션 인스턴스가 여러 고객(테넌트)을 서비스하는 구조입니다. 데이터 격리 방식에 따라 세 가지 모델로 구분됩니다. 데이터베이스 분리 모델은 각 테넌트가 독립된 데이터베이스를 사용하여 완전한 격리를 제공하지만 관리 복잡성이 높습니다. 스키마 분리 모델은 같은 데이터베이스 내에서 스키마로 분리하여 비용과 격리의 균형을 맞춥니다. 행 수준 분리 모델은 테넌트 ID로 데이터를 구분하여 가장 효율적이지만 보안 위험이 있습니다. 테넌트별 리소스 할당과 성능 격리를 위해 QoS(Quality of Service) 관리가 필요하고, 스케일링 전략은 테넌트 증가에 따른 리소스 확장을 고려해야 합니다. 커스터마이제이션을 위해 설정 기반 또는 플러그인 아키텍처를 구현하고, 백업과 복구는 테넌트별로 독립적으로 수행할 수 있어야 합니다. 컴플라이언스와 데이터 거버넌스도 테넌트별로 관리해야 하는 중요한 고려사항입니다.
💡 추가 예상 질문 Q&A 펼치기
Q29. 이벤트 스토밍과 도메인 모델링 기법을 설명해주세요.
이벤트 스토밍은 도메인 전문가와 개발자가 협력하여 비즈니스 프로세스를 이해하고 모델링하는 워크샵 기법입니다. 오렌지 스티커로 도메인 이벤트를 시간 순서대로 배치하고, 파란색 스티커로 커맨드를, 노란색 스티커로 애그리거트를 표현합니다. 핫스팟(빨간색)으로 문제점을 표시하고, 외부 시스템과 정책도 함께 모델링합니다. 이를 통해 복잡한 도메인을 시각화하고 팀의 공통 이해를 도출할 수 있습니다. 결과물로 바운디드 컨텍스트 맵을 작성하여 마이크로서비스의 경계를 결정하고, 이벤트 기반 아키텍처 설계의 기초 자료로 활용합니다. C4 모델은 시스템을 컨텍스트, 컨테이너, 컴포넌트, 코드의 4단계로 표현하여 아키텍처 문서화에 효과적입니다. UML 다이어그램과 달리 비개발자도 이해하기 쉬운 표기법을 사용하며, 아키텍처 결정 기록(ADR)과 함께 활용하여 설계 의도를 문서화합니다.
Q30. API 게이트웨이 패턴과 백엔드 포 프론트엔드(BFF) 패턴을 설명해주세요.
API 게이트웨이는 클라이언트와 백엔드 서비스 사이의 단일 진입점 역할을 하는 패턴입니다. 인증과 권한 부여, 요청 라우팅, 속도 제한, 로깅과 모니터링, 응답 변환 등의 횡단 관심사를 처리합니다. 마이크로서비스 아키텍처에서 클라이언트가 여러 서비스와 직접 통신하는 복잡성을 줄이고, 보안과 정책을 중앙에서 관리할 수 있습니다. 하지만 단일 장애점이 될 수 있고, 성능 병목이 발생할 가능성이 있어 고가용성 설계가 중요합니다. BFF 패턴은 특정 프론트엔드나 클라이언트 타입을 위한 전용 백엔드를 만드는 패턴입니다. 모바일 앱, 웹 애플리케이션, 써드파티 API마다 다른 데이터 요구사항과 성능 특성에 맞춰 최적화된 API를 제공합니다. GraphQL은 클라이언트가 필요한 데이터만 요청할 수 있게 하여 오버페칭과 언더페칭 문제를 해결하는 대안적 접근 방식입니다.
Q31. 사가(Saga) 패턴과 분산 트랜잭션 관리를 설명해주세요.
사가 패턴은 분산 시스템에서 여러 서비스에 걸친 긴 비즈니스 트랜잭션을 관리하는 패턴입니다. ACID 트랜잭션의 원자성을 포기하고 대신 결과적 일관성을 추구합니다. 각 서비스의 로컬 트랜잭션들이 순차적으로 실행되며, 실패 시 보상 트랜잭션을 통해 이전 상태로 되돌립니다. Choreography 방식은 각 서비스가 이벤트를 발행하고 다른 서비스가 반응하는 분산 조정 방식이고, Orchestration 방식은 중앙 오케스트레이터가 전체 플로우를 관리하는 방식입니다. 2PC(Two-Phase Commit)는 분산 트랜잭션의 전통적인 방법이지만 블로킹 문제와 성능 이슈가 있어 마이크로서비스에서는 적합하지 않습니다. 이벤트 소싱과 CQRS 패턴을 함께 사용하면 복잡한 비즈니스 트랜잭션을 더 효과적으로 관리할 수 있으며, 아웃박스 패턴으로 이벤트 발행의 신뢰성을 보장할 수 있습니다.
Q32. 헥사고날 아키텍처(포트 앤 어댑터)와 클린 아키텍처를 설명해주세요.
헥사고날 아키텍처는 애플리케이션 코어를 외부 의존성으로부터 격리하는 아키텍처 패턴입니다. 도메인 로직은 중앙의 헥사곤 내부에 위치하고, 포트는 애플리케이션이 외부와 상호작용하는 인터페이스를, 어댑터는 포트의 구체적인 구현을 담당합니다. 주도하는 어댑터(Driving Adapter)는 애플리케이션을 호출하는 것이고, 주도당하는 어댑터(Driven Adapter)는 애플리케이션이 호출하는 것입니다. 이를 통해 비즈니스 로직을 기술적 세부사항으로부터 분리하고, 테스트 가능성을 높일 수 있습니다. 클린 아키텍처는 로버트 마틴이 제안한 아키텍처로, 엔티티, 유스케이스, 인터페이스 어댑터, 프레임워크/드라이버의 4개 계층으로 구성됩니다. 의존성 규칙에 따라 안쪽 계층은 바깥쪽 계층을 알지 못하게 하여 안정적이고 테스트 가능한 아키텍처를 만듭니다. 두 아키텍처 모두 의존성 역전 원칙을 활용하여 비즈니스 로직의 독립성을 보장합니다.
Q33. 프론트엔드 아키텍처 패턴과 마이크로프론트엔드를 설명해주세요.
프론트엔드 아키텍처는 사용자 인터페이스의 복잡성 증가와 함께 중요해졌습니다. MVC, MVP, MVVM 패턴으로 프레젠테이션 로직을 분리하고, 컴포넌트 기반 아키텍처로 재사용성을 높입니다. Flux/Redux 패턴은 단방향 데이터 플로우로 상태 관리를 예측 가능하게 만들고, 상태 관리 라이브러리(Redux, MobX, Zustand)로 복잡한 상태를 관리합니다. 마이크로프론트엔드는 백엔드 마이크로서비스와 유사하게 프론트엔드를 작은 독립적인 애플리케이션으로 분해하는 아키텍처입니다. 팀별로 기술 스택을 선택할 수 있고, 독립적인 배포가 가능하지만, 런타임 통합의 복잡성과 중복 코드 문제가 있습니다. Module Federation, Single-SPA, iframe 등의 기술로 구현할 수 있으며, 공통 디자인 시스템과 통신 메커니즘이 중요한 고려사항입니다. JAMstack(JavaScript, APIs, Markup) 아키텍처는 정적 사이트 생성과 API 기반 동적 기능을 결합하여 성능과 보안을 향상시킵니다.
Q34. DevSecOps와 시프트 레프트 보안 접근법을 설명해주세요.
DevSecOps는 개발, 보안, 운영을 통합하여 소프트웨어 개발 생명주기 전반에 보안을 내재화하는 문화와 실천 방법입니다. 시프트 레프트 접근법은 보안을 개발 초기 단계로 이동시켜 보안 문제를 조기에 발견하고 해결하는 것입니다. 정적 애플리케이션 보안 테스트(SAST)는 소스 코드를 분석하여 보안 취약점을 찾고, 동적 애플리케이션 보안 테스트(DAST)는 실행 중인 애플리케이션을 테스트합니다. 인터랙티브 애플리케이션 보안 테스트(IAST)는 두 방식을 결합하여 더 정확한 분석을 제공합니다. CI/CD 파이프라인에 보안 게이트를 설치하여 취약점이 있는 코드의 배포를 방지하고, 컨테이너 이미지 스캐닝과 의존성 검사를 자동화합니다. Infrastructure as Code(IaC) 스캐닝으로 인프라 설정의 보안 문제를 사전에 발견하고, 런타임 보안 모니터링으로 실시간 위협을 탐지합니다. 보안 교육과 문화 변화도 중요한 요소입니다.
Q35. 데이터 메시와 데이터 패브릭 아키텍처를 설명해주세요.
데이터 메시는 도메인 중심의 분산 데이터 아키텍처로, 각 도메인 팀이 자신의 데이터를 제품으로 관리하는 접근법입니다. 네 가지 핵심 원칙은 도메인 소유권, 데이터를 제품으로 취급, 셀프서브 데이터 인프라, 연합 컴퓨팅 거버넌스입니다. 중앙화된 데이터 플랫폼의 병목과 확장성 문제를 해결하고, 데이터 소유권을 도메인 전문가에게 부여합니다. 데이터 패브릭은 모든 데이터 환경에서 일관된 기능을 제공하는 아키텍처로, 메타데이터 관리, 데이터 통합, 데이터 가상화를 통해 데이터를 단일 뷰로 제공합니다. AI/ML 기반 자동화로 데이터 발견, 분류, 거버넌스를 지원하고, 하이브리드 클라우드 환경에서 데이터 이동성을 보장합니다. 두 접근법 모두 전통적인 데이터 웨어하우스의 한계를 극복하려는 시도이며, 조직의 성숙도와 요구사항에 따라 선택하거나 결합할 수 있습니다. 데이터 카탈로그, 데이터 리니지, 데이터 품질 관리는 두 아키텍처 모두에서 중요한 구성 요소입니다.
Q36. 엣지 컴퓨팅과 분산 시스템의 일관성 패턴을 설명해주세요.
엣지 컴퓨팅은 데이터 소스에 가까운 곳에서 처리를 수행하여 지연시간을 줄이고 대역폭을 절약하는 분산 컴퓨팅 패러다임입니다. IoT 기기, 자율주행차, AR/VR 애플리케이션에서 실시간 처리가 중요한 경우에 활용됩니다. 클라우드, 엣지, 디바이스 간의 계층적 아키텍처를 구성하여 각 계층의 장점을 활용합니다. 분산 시스템에서 일관성 패턴은 데이터 일관성을 보장하는 다양한 방법을 제공합니다. Read-your-writes 일관성은 사용자가 자신이 쓴 데이터를 즉시 읽을 수 있게 보장하고, Monotonic read 일관성은 시간이 지날수록 더 새로운 데이터를 읽게 보장합니다. Session 일관성은 세션 내에서만 일관성을 보장하여 성능과 일관성의 균형을 맞춥니다. Vector clocks와 Lamport timestamps로 분산 환경에서 이벤트 순서를 추적하고, CRDT(Conflict-free Replicated Data Types)로 충돌 없는 동시 업데이트를 지원합니다. 엣지 환경에서는 네트워크 불안정성과 리소스 제약을 고려한 설계가 필요합니다.
Q37. 플랫폼 엔지니어링과 개발자 경험(DX) 향상 전략을 설명해주세요.
플랫폼 엔지니어링은 개발팀이 효율적으로 애플리케이션을 구축하고 배포할 수 있는 내부 플랫폼을 만드는 분야입니다. 셀프서비스 기능을 제공하여 개발자가 인프라나 운영에 대한 깊은 지식 없이도 필요한 리소스를 사용할 수 있게 합니다. 골든 패스(Golden Path)를 제공하여 모범 사례를 템플릿화하고, 개발자가 쉽게 따라할 수 있는 가이드라인을 제시합니다. 개발자 경험 향상을 위해서는 빠른 피드백 루프, 직관적인 도구, 명확한 문서화가 중요합니다. 로컬 개발 환경을 프로덕션과 유사하게 구성하고, 개발 환경 설정을 자동화합니다. 인너 소스(Inner Source) 문화를 통해 조직 내 오픈소스 협업을 촉진하고, API 퍼스트 설계로 서비스 간 통합을 용이하게 합니다. 개발자 포털을 구축하여 API 문서, 서비스 카탈로그, 모니터링 대시보드를 통합 제공하고, ChatOps와 자동화를 통해 운영 부담을 줄입니다. 개발자 만족도 조사와 DORA 메트릭(배포 빈도, 변경 리드타임, 복구 시간, 변경 실패율)을 통해 지속적으로 개선해야 합니다.
📚 소프트웨어 공학 & 아키텍처 개념 요약 노트 펼치기
🏗️ 소프트웨어 공학 기초
SDLC 모델 비교
- 폭포수: 단계 명확·예측 용이 / 변경 대응 어려움·피드백 늦음
- 애자일: 빠른 피드백·변화 대응 / 문서화 부족·예측 어려움
- DevOps: 개발·운영 통합, CI/CD 자동화, 지속적 개선 문화
요구사항 분석
- 기능 요구사항 / 비기능 요구사항(성능, 보안, 사용성 등)
- 사용자 스토리: As a / I want / So that
- 인수 기준: Given / When / Then
🎨 설계 원칙
SOLID 원칙
- SRP · OCP · LSP · ISP · DIP
디자인 패턴 분류
유형 | 패턴 | 목적 |
---|---|---|
생성 | Singleton, Factory | 객체 생성 |
구조 | Adapter, Decorator | 객체 조합 |
행위 | Observer, Strategy | 객체 협력 |
🧪 테스팅 전략
테스트 피라미드
- Unit: 다수·빠름·격리
- Integration: 적당
- E2E: 소수
테스트 유형
- 단위 / 통합 / 시스템 / 인수 테스트
🏛️ 아키텍처 패턴
계층형 아키텍처
- Presentation → Business → Data Access
마이크로서비스 vs 모놀리식
특징 | 모놀리식 | 마이크로서비스 |
---|---|---|
배포 | 전체 배포 | 독립 배포 |
확장 | 전체 확장 | 서비스별 확장 |
기술 | 단일 스택 | 다양한 스택 |
복잡성 | 낮음 | 높음 |
장애 격리 | 어려움 | 용이 |
🔄 분산 시스템
CAP 정리
- 일관성(C) · 가용성(A) · 분할 내성(P) 중 최대 2개
일관성 모델
- 강한 / 결과적 / 순차 / 인과 일관성
🚀 DevOps & CI/CD
CI/CD 파이프라인
Code → Build → Test → Deploy → Monitor → Feedback
배포 전략
- 블루-그린 · 카나리 · 롤링 · A/B 테스트
🛡️ 보안 설계
보안 원칙
- 최소 권한 · 심층 방어 · 저장/전송 암호화 · 입력 검증
인증 vs 권한 부여
- 인증: 누구인가? / 권한 부여: 무엇을 할 수 있는가?
- JWT(무상태 토큰), OAuth 2.0(권한 위임)
⚡ 성능 최적화
확장성 전략
- 수직/수평 확장, 로드 밸런싱, 캐싱
성능 메트릭
- 응답시간 · 처리량 · 동시 사용자 · 가용성
📊 데이터 아키텍처
데이터 처리 패턴
- 배치 / 스트림 / 람다 / 카파
데이터 일관성
- ACID · BASE · CQRS · 이벤트 소싱
🌐 클라우드 네이티브
12-Factor App 핵심
- 코드베이스(버전관리), 의존성 명시, 설정=환경변수, 백업서비스=리소스
- 빌드·릴리스·실행 분리, 무상태 프로세스, 포트 바인딩
- 동시성(프로세스), 빠른 시작·우아한 종료, 개발/운영 동등성
- 로그=이벤트 스트림, 관리 작업=일회성
🔍 모니터링 & 관측성
관측성 3요소
- 메트릭 · 로그 · 트레이스
SLI/SLO/SLA
- SLI(지표) · SLO(목표) · SLA(협약)
🎯 아키텍처 의사결정
트레이드오프
- 성능↔확장성 · 일관성↔가용성 · 복잡성↔유연성 · 비용↔품질 · 보안↔사용성
ADR(아키텍처 결정 기록)
- 제목, 상태, 컨텍스트, 결정, 결과
💡 면접 팁
- 비즈니스 가치와 연결해 설명
- 트레이드오프 분석 강조
- 실무 사례 구체화
- 확장성·유지보수성 관점 제시
- 팀워크·협업 경험
- 지속 학습·최신 동향 관심
🔧 문제 해결 접근법
시스템 설계 과정
- 요구사항 명확화
- 용량 추정(사용자, 데이터, QPS)
- 시스템 인터페이스 정의
- 고수준 설계
- 상세 설계
- 확장성 고려
- 모니터링·알람
성능 문제 해결
- 문제 정의·측정
- 병목 식별
- 가설 수립
- 개선안 적용
- 효과 측정
- 지속 모니터링