취업 준비 필수 지식
개발자 취업/이직을 위한 핵심 지식을 체계적으로 정리한 문서다.
목차
1. 자료구조
데이터를 효율적으로 저장하고 관리하는 방법
1-1. 배열과 연결리스트
| 주제 | 세부 내용 |
|---|---|
| 배열의 메모리 구조 | 연속된 메모리 공간, 인덱스를 통한 O(1) 접근 |
| 정적 배열 vs 동적 배열 | 고정 크기 vs ArrayList/Vector의 자동 확장 |
| 단일 연결리스트 | 한 방향 탐색, 삽입/삭제 O(1), 탐색 O(n) |
| 이중 연결리스트 | 양방향 탐색, 이전 노드 접근 가능 |
| 시간복잡도 비교 | 삽입/삭제/탐색 연산별 비교 |
| 선택 기준 | 랜덤 접근 필요 → 배열, 빈번한 삽입/삭제 → 연결리스트 |
1-2. 스택과 큐
| 주제 | 세부 내용 |
|---|---|
| 스택 구현 | 배열 기반 vs 연결리스트 기반 |
| 콜스택과 재귀 | 함수 호출 스택, 스택 오버플로우 |
| 큐 구현 | 선형 큐의 문제점, 원형 큐로 해결 |
| 덱(Deque) | 양쪽에서 삽입/삭제 가능 |
| 실무 활용 | 실행취소(Undo), BFS 탐색, 작업 스케줄링 |
1-3. 해시테이블
| 주제 | 세부 내용 |
|---|---|
| 해시 함수 원리 | 키를 인덱스로 변환, 좋은 해시 함수의 조건 |
| 충돌 해결: 체이닝 | 같은 버킷에 연결리스트로 저장 |
| 충돌 해결: 개방 주소법 | 선형 탐사, 이차 탐사, 이중 해싱 |
| 로드 팩터와 리해싱 | 임계점 도달 시 테이블 확장 |
| Java HashMap 내부 | 버킷당 8개 초과 시 Red-Black Tree로 변환 |
| HashDoS 공격 | 의도적 충돌 유발, 랜덤 시드로 방어 |
1-4. 트리
| 주제 | 세부 내용 |
|---|---|
| 트리 용어 | 루트, 리프, 높이, 깊이, 차수 |
| 이진 트리 순회 | 전위(Pre), 중위(In), 후위(Post), 레벨(Level) |
| 이진 탐색 트리(BST) | 왼쪽 < 루트 < 오른쪽, 탐색/삽입/삭제 O(log n) |
| 균형 트리 | AVL Tree: 높이 차이 1 이하 유지 |
| Red-Black Tree | 색상 규칙으로 균형 유지, Java TreeMap |
| B-Tree & B+Tree | 디스크 기반, 다진 트리, DB 인덱스 |
| 트라이(Trie) | 문자열 검색 최적화, 자동완성 |
1-5. 힙
| 주제 | 세부 내용 |
|---|---|
| 완전 이진 트리 | 마지막 레벨 제외 모든 노드가 채워짐 |
| 힙 속성 | 최소힙: 부모 ≤ 자식, 최대힙: 부모 ≥ 자식 |
| heapify | 배열을 힙으로 변환, O(n) 시간복잡도 |
| 우선순위 큐 | 힙 기반 구현, 삽입/삭제 O(log n) |
| 활용 예시 | 힙 정렬, Top-K 문제, 다익스트라 알고리즘 |
1-6. 그래프
| 주제 | 세부 내용 |
|---|---|
| 인접 행렬 | 2차원 배열, 공간 O(V²), 간선 확인 O(1) |
| 인접 리스트 | 연결리스트 배열, 공간 O(V+E) |
| 방향/무방향 그래프 | 간선의 방향성 유무 |
| 가중치 그래프 | 간선에 비용/거리 정보 |
| 사이클 탐지 | DFS로 방문 중인 노드 재방문 체크 |
| Union-Find | 서로소 집합, 경로 압축, 랭크 기반 합치기 |
2. 알고리즘
문제를 해결하는 효율적인 절차
2-1. 시간/공간 복잡도
| 주제 | 세부 내용 |
|---|---|
| Big-O 표기법 | 최악의 경우 상한, O(1) < O(log n) < O(n) < O(n log n) < O(n²) |
| Big-Ω, Big-Θ | 하한, 평균 (면접에서는 주로 Big-O) |
| 시간복잡도 계산 | 반복문 중첩 횟수, 재귀 호출 횟수 |
| 공간복잡도 | 추가 메모리 사용량, 재귀 스택 포함 |
| 마스터 정리 | T(n) = aT(n/b) + f(n) 형태의 재귀 분석 |
| 상수 시간의 중요성 | 데이터 크기가 작을 때 상수 계수 영향 |
2-2. 정렬 알고리즘
| 주제 | 세부 내용 |
|---|---|
| O(n²) 정렬 | 버블, 선택, 삽입 정렬 |
| 퀵소트 | 피벗 선택, 파티션, 평균 O(n log n), 최악 O(n²) |
| 병합 정렬 | 분할 정복, 안정 정렬, 항상 O(n log n) |
| 힙 정렬 | 힙 구성 후 추출, 제자리 정렬 |
| 비교 기반 하한 | 비교 정렬은 O(n log n)이 하한 |
| 선형 시간 정렬 | 계수, 기수, 버킷 정렬 (특수 조건) |
| TimSort | Python/Java 내장, 삽입 + 병합 하이브리드 |
2-3. 탐색 알고리즘
| 주제 | 세부 내용 |
|---|---|
| 선형 탐색 | O(n), 정렬 불필요 |
| 이진 탐색 | O(log n), 정렬 필수, 반씩 제거 |
| Lower/Upper Bound | 경계값 찾기, C++ STL |
| 파라메트릭 서치 | 최적화 문제를 결정 문제로 변환 |
| DFS | 깊이 우선, 재귀/스택, 경로 탐색 |
| BFS | 너비 우선, 큐, 최단 거리 |
| 백트래킹 | 가지치기로 탐색 공간 축소 |
2-4. 동적 프로그래밍 (DP)
| 주제 | 세부 내용 |
|---|---|
| DP 조건 | 최적 부분 구조 + 중복 부분 문제 |
| Top-Down | 메모이제이션, 재귀 + 캐싱 |
| Bottom-Up | 타뷸레이션, 반복문으로 테이블 채우기 |
| 1차원 DP | 피보나치, 계단 오르기, 동전 교환 |
| 2차원 DP | LCS, 배낭 문제, 편집 거리 |
| 상태 정의 | dp[i]가 의미하는 것을 명확히 |
| 공간 최적화 | 이전 행만 필요하면 O(n) → O(1) 가능 |
2-5. 그리디 알고리즘
| 주제 | 세부 내용 |
|---|---|
| 그리디 vs DP | 그리디: 매 순간 최선, DP: 모든 경우 고려 |
| 탐욕적 선택 속성 | 지역 최적 → 전역 최적 증명 필요 |
| 활동 선택 문제 | 끝나는 시간 기준 정렬 |
| 크루스칼 알고리즘 | 간선 정렬, Union-Find로 MST |
| 프림 알고리즘 | 정점 기반, 우선순위 큐로 MST |
| 다익스트라 | 최단 경로, 음수 가중치 불가 |
2-6. 그래프 알고리즘
| 주제 | 세부 내용 |
|---|---|
| DFS/BFS 응용 | 연결 요소, 이분 그래프 판별 |
| 위상 정렬 | DAG에서 선후 관계 정렬, 진입 차수 |
| 다익스트라 | 단일 출발점 최단 경로, O(E log V) |
| 벨만-포드 | 음수 가중치 가능, 음수 사이클 탐지 |
| 플로이드-워셜 | 모든 쌍 최단 경로, O(V³) |
| MST | 최소 신장 트리, 크루스칼/프림 |
| SCC | 강한 연결 요소, 코사라주/타잔 |
2-7. 자주 쓰이는 패턴
| 주제 | 세부 내용 |
|---|---|
| 투 포인터 | 정렬된 배열에서 두 포인터 이동 |
| 슬라이딩 윈도우 | 고정/가변 크기 윈도우, 연속 부분 문제 |
| 구간 합 (Prefix Sum) | 누적 합 전처리, O(1) 구간 합 쿼리 |
| 비트마스킹 | 집합 표현, 부분집합 열거 |
| 분할 정복 | 문제를 작은 부분으로 나눠 해결 |
3. 운영체제
하드웨어와 소프트웨어를 관리하는 시스템
3-1. 프로세스와 스레드
| 주제 | 세부 내용 |
|---|---|
| 프로세스 정의 | 실행 중인 프로그램, 독립된 메모리 공간 |
| PCB | Process Control Block, 프로세스 메타데이터 |
| 프로세스 상태 | 생성 → 준비 → 실행 → 대기 → 종료 |
| 스레드 정의 | 프로세스 내 실행 단위, 스택만 독립 |
| 멀티프로세스 vs 멀티스레드 | 안정성 vs 자원 효율성 |
| 컨텍스트 스위칭 | CPU 상태 저장/복원, 오버헤드 발생 |
| 사용자/커널 스레드 | 1:1, N:1, M:N 매핑 모델 |
| 코루틴 | 협력적 멀티태스킹, 경량 스레드 |
3-2. 동기화
| 주제 | 세부 내용 |
|---|---|
| 경쟁 조건 | Race Condition, 공유 자원 동시 접근 |
| 임계 영역 | Critical Section, 한 번에 하나만 진입 |
| 뮤텍스 | 상호 배제, 락/언락 |
| 세마포어 | 카운팅 세마포어, P/V 연산 |
| 모니터 | 언어 수준 동기화, Java synchronized |
| 스핀락 vs 슬립락 | 바쁜 대기 vs 블로킹 |
| 데드락 조건 | 상호배제, 점유대기, 비선점, 순환대기 |
| 데드락 해결 | 예방, 회피(은행원), 탐지, 복구 |
| 라이브락 & 기아 | 진행은 하지만 해결 안됨, 영원히 대기 |
3-3. 메모리 관리
| 주제 | 세부 내용 |
|---|---|
| 메모리 계층 | 레지스터 → L1/L2/L3 캐시 → RAM → SSD/HDD |
| 논리 vs 물리 주소 | MMU를 통한 주소 변환 |
| 연속 할당 | 고정/가변 분할, 외부 단편화 |
| 페이징 | 고정 크기 페이지, 내부 단편화 |
| 페이지 테이블 | 가상 → 물리 주소 매핑 |
| TLB | 페이지 테이블 캐시, 변환 속도 향상 |
| 세그멘테이션 | 가변 크기, 논리적 단위 분할 |
| 가상 메모리 | 물리 메모리보다 큰 주소 공간 |
| 요구 페이징 | 필요할 때만 메모리에 적재 |
| 페이지 교체 | FIFO, LRU, LFU, Clock 알고리즘 |
| 스래싱 | 과도한 페이지 폴트로 성능 저하 |
3-4. CPU 스케줄링
| 주제 | 세부 내용 |
|---|---|
| 선점 vs 비선점 | 실행 중 CPU 뺏기 가능 여부 |
| FCFS | First Come First Serve, 호위 효과 |
| SJF | Shortest Job First, 최적이지만 기아 |
| SRTF | 선점형 SJF |
| Round Robin | 타임 퀀텀, 공정성 |
| 다단계 큐 | 우선순위별 큐 분리 |
| 다단계 피드백 큐 | 큐 간 이동 허용 |
| 우선순위 역전 | 높은 우선순위가 낮은 우선순위 대기 |
| CFS | Linux, 완전 공정 스케줄러 |
3-5. I/O 시스템
| 주제 | 세부 내용 |
|---|---|
| 블로킹 I/O | 요청 후 완료까지 대기 |
| 논블로킹 I/O | 즉시 반환, 상태 확인 필요 |
| 동기 vs 비동기 | 완료 통보 방식의 차이 |
| I/O 멀티플렉싱 | select, poll, epoll |
| Reactor 패턴 | 이벤트 기반 I/O 처리 |
| 인터럽트 | 하드웨어 신호로 CPU 작업 중단 |
3-6. 파일 시스템
| 주제 | 세부 내용 |
|---|---|
| 파일 시스템 구조 | 부트 블록, 슈퍼 블록, inode, 데이터 블록 |
| inode | 파일 메타데이터, 데이터 블록 포인터 |
| 파일 디스크립터 | 열린 파일 테이블 인덱스 |
| 하드 링크 vs 심볼릭 링크 | 같은 inode vs 경로 참조 |
| 저널링 | 트랜잭션 로그로 일관성 보장 |
| 디스크 스케줄링 | FCFS, SSTF, SCAN, C-SCAN |
4. 네트워크
컴퓨터 간 데이터 통신의 원리
4-1. OSI 7계층 & TCP/IP
| 주제 | 세부 내용 |
|---|---|
| OSI 7계층 | 물리-데이터링크-네트워크-전송-세션-표현-응용 |
| TCP/IP 4계층 | 네트워크 인터페이스-인터넷-전송-응용 |
| 캡슐화 | 각 계층에서 헤더 추가 |
| PDU | 세그먼트(L4), 패킷(L3), 프레임(L2) |
| 계층별 장비 | 허브(L1), 스위치(L2), 라우터(L3) |
| 계층별 프로토콜 | Ethernet, IP, TCP/UDP, HTTP |
4-2. TCP와 UDP
| 주제 | 세부 내용 |
|---|---|
| TCP 특징 | 연결 지향, 신뢰성, 순서 보장 |
| 3-way handshake | SYN → SYN-ACK → ACK |
| 4-way handshake | FIN → ACK → FIN → ACK |
| TIME_WAIT | 지연 패킷 대기, 2MSL |
| 흐름 제어 | 슬라이딩 윈도우, 수신자 버퍼 고려 |
| 혼잡 제어 | Slow Start, AIMD, Fast Retransmit |
| UDP 특징 | 비연결, 빠름, 신뢰성 없음 |
| UDP 활용 | DNS, 실시간 스트리밍, 게임 |
| QUIC | UDP 기반 신뢰성 프로토콜, HTTP/3 |
| Keep-Alive | 연결 유지, 재사용 |
4-3. HTTP/HTTPS
| 주제 | 세부 내용 |
|---|---|
| HTTP 메서드 | GET, POST, PUT, PATCH, DELETE |
| 멱등성 | 같은 요청 여러 번 = 같은 결과 |
| 상태 코드 | 2xx 성공, 3xx 리다이렉트, 4xx 클라이언트 에러, 5xx 서버 에러 |
| 주요 헤더 | Content-Type, Cache-Control, Cookie, Authorization |
| HTTP/1.1 | Keep-Alive, 파이프라이닝 |
| HTTP/2 | 멀티플렉싱, 헤더 압축, 서버 푸시 |
| HTTP/3 | QUIC 기반, 연결 수립 빠름 |
| HTTPS | TLS 암호화, 기밀성/무결성/인증 |
| TLS 핸드셰이크 | 인증서 교환, 세션 키 협상 |
| 대칭키/비대칭키 | 세션 키(대칭), 키 교환(비대칭) |
| REST API | 자원 중심 설계, 무상태성 |
4-4. DNS와 CDN
| 주제 | 세부 내용 |
|---|---|
| DNS 역할 | 도메인 → IP 주소 변환 |
| 재귀적 vs 반복적 질의 | 클라이언트 vs 서버 주도 |
| DNS 레코드 | A, AAAA, CNAME, MX, NS, TXT |
| DNS 캐싱 | 브라우저, OS, ISP 캐시 |
| TTL | Time To Live, 캐시 유효 시간 |
| CDN 역할 | 지리적으로 가까운 서버에서 응답 |
| 엣지 서버 | 사용자 근처 캐시 서버 |
| 오리진 서버 | 원본 콘텐츠 서버 |
| 캐시 무효화 | 버저닝, Purge API |
4-5. IP와 라우팅
| 주제 | 세부 내용 |
|---|---|
| IPv4 vs IPv6 | 32비트 vs 128비트, 주소 고갈 |
| 서브넷 마스크 | 네트워크/호스트 부분 구분 |
| CIDR | 클래스리스 주소 할당, /24 표기 |
| 공인 IP vs 사설 IP | 인터넷 vs 내부 네트워크 |
| NAT | 사설 → 공인 IP 변환, 포트 포워딩 |
| 라우팅 테이블 | 목적지별 다음 홉 정보 |
| ARP | IP → MAC 주소 변환 |
4-6. WebSocket과 실시간 통신
| 주제 | 세부 내용 |
|---|---|
| HTTP Polling | 주기적 요청, 비효율적 |
| Long Polling | 응답 지연, 연결 유지 |
| SSE | Server-Sent Events, 단방향 |
| WebSocket | 양방향, 지속 연결, 낮은 오버헤드 |
| WebSocket 핸드셰이크 | HTTP Upgrade 헤더 |
| Socket.IO | 폴백 지원, 룸/네임스페이스 |
| 실시간 채팅 구현 | 메시지 브로드캐스트, 접속 관리 |
4-7. 보안
| 주제 | 세부 내용 |
|---|---|
| Same-Origin Policy | 동일 출처만 접근 허용 |
| CORS | Cross-Origin 요청 허용 설정 |
| XSS | 스크립트 삽입 공격, 이스케이핑으로 방어 |
| CSRF | 사용자 권한 도용, 토큰으로 방어 |
| SQL Injection | 쿼리 조작, Prepared Statement |
| OAuth 2.0 | 권한 위임 프로토콜 |
| JWT | JSON Web Token, 서명된 토큰 |
| HTTPS 필요성 | 중간자 공격 방지 |
5. 데이터베이스
데이터 저장, 관리, 조회의 모든 것
5-1. SQL 기본
| 주제 | 세부 내용 |
|---|---|
| DDL | CREATE, ALTER, DROP, TRUNCATE |
| DML | SELECT, INSERT, UPDATE, DELETE |
| DCL | GRANT, REVOKE |
| TCL | COMMIT, ROLLBACK, SAVEPOINT |
| SELECT 실행 순서 | FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY |
| JOIN 종류 | INNER, LEFT, RIGHT, FULL OUTER, CROSS |
| 서브쿼리 | 스칼라, 인라인 뷰, 중첩 |
| 서브쿼리 vs JOIN | 성능 비교, 실행 계획 확인 |
| 집계 함수 | COUNT, SUM, AVG, MAX, MIN |
| GROUP BY / HAVING | 그룹화와 그룹 조건 |
| 윈도우 함수 | ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD |
| UNION vs UNION ALL | 중복 제거 여부 |
5-2. 정규화
| 주제 | 세부 내용 |
|---|---|
| 이상 현상 | 삽입, 갱신, 삭제 이상 |
| 함수적 종속성 | X → Y, X가 Y를 결정 |
| 1NF | 원자값, 반복 그룹 제거 |
| 2NF | 부분 함수 종속 제거 |
| 3NF | 이행 함수 종속 제거 |
| BCNF | 결정자가 모두 후보키 |
| 반정규화 | 성능을 위한 중복 허용 |
| 정규화 vs 성능 | 조인 비용 vs 갱신 이상 |
5-3. 인덱스와 최적화
| 주제 | 세부 내용 |
|---|---|
| 인덱스 필요성 | 테이블 풀 스캔 방지 |
| B+Tree 구조 | 리프 노드에 데이터, 범위 검색 효율 |
| 클러스터드 인덱스 | 테이블당 1개, 물리적 정렬 |
| 논클러스터드 인덱스 | 별도 구조, 포인터로 연결 |
| 복합 인덱스 | 컬럼 순서 중요, 왼쪽 우선 |
| 커버링 인덱스 | 인덱스만으로 쿼리 해결 |
| 인덱스 안 타는 경우 | 함수 적용, LIKE ’%…’, OR 조건 |
| EXPLAIN | 실행 계획 분석, type/key/rows |
| 쿼리 최적화 | 인덱스 활용, 조인 순서, 서브쿼리 제거 |
5-4. 트랜잭션
| 주제 | 세부 내용 |
|---|---|
| 트랜잭션 정의 | 논리적 작업 단위, All or Nothing |
| ACID | 원자성, 일관성, 격리성, 지속성 |
| Dirty Read | 커밋 안 된 데이터 읽음 |
| Non-Repeatable Read | 같은 쿼리, 다른 결과 |
| Phantom Read | 같은 조건, 다른 행 개수 |
| 격리 수준 | READ UNCOMMITTED → SERIALIZABLE |
| Shared Lock | 읽기 락, 여러 트랜잭션 공유 |
| Exclusive Lock | 쓰기 락, 독점 |
| 낙관적 락 | 버전 체크, 충돌 시 롤백 |
| 비관적 락 | 선점 락, 대기 |
| MVCC | 다중 버전으로 동시성 확보 |
| 2PC | Two-Phase Commit, 분산 트랜잭션 |
5-5. NoSQL
| 주제 | 세부 내용 |
|---|---|
| SQL vs NoSQL | 스키마, 확장성, 일관성 |
| CAP 이론 | Consistency, Availability, Partition Tolerance |
| Redis 자료구조 | String, List, Set, Hash, Sorted Set |
| Redis 영속성 | RDB 스냅샷, AOF 로그 |
| Redis 캐시 전략 | Cache-Aside, Write-Through |
| Redis 클러스터 | 샤딩, 복제, 센티넬 |
| MongoDB | 문서 지향, 스키마리스, 샤딩 |
| Elasticsearch | 역인덱스, 전문 검색, 분석 |
| 시계열 DB | InfluxDB, TimescaleDB, 시간 기반 최적화 |
5-6. 복제와 샤딩
| 주제 | 세부 내용 |
|---|---|
| 복제 목적 | 가용성, 읽기 분산 |
| Master-Slave | 쓰기는 Master, 읽기는 Slave |
| Master-Master | 양방향 쓰기, 충돌 해결 필요 |
| 동기 vs 비동기 복제 | 일관성 vs 성능 |
| 복제 지연 | 읽기 후 쓰기 문제 |
| 샤딩 목적 | 쓰기 분산, 대용량 처리 |
| 해시 샤딩 | 균등 분배, 범위 쿼리 불리 |
| 범위 샤딩 | 범위 쿼리 유리, 핫스팟 위험 |
| 리샤딩 | 샤드 추가 시 데이터 이동 |
| Vitess, ProxySQL | 샤딩 미들웨어 |
6. 시스템 설계
대규모 시스템을 설계하는 원칙과 패턴
6-1. 확장성
| 주제 | 세부 내용 |
|---|---|
| 수직 확장 | Scale Up, 더 좋은 하드웨어 |
| 수평 확장 | Scale Out, 서버 추가 |
| Stateless 설계 | 서버에 상태 저장 안 함 |
| 세션 관리 | Sticky Session, Redis Session Store |
| DB 확장 | Read Replica, 샤딩 |
| 마이크로서비스 | 서비스 분리, 독립 배포 |
| 모놀리식 | 단일 배포 단위, 간단함 |
6-2. 로드밸런싱
| 주제 | 세부 내용 |
|---|---|
| L4 로드밸런서 | TCP/UDP 레벨, 빠름 |
| L7 로드밸런서 | HTTP 레벨, 콘텐츠 기반 라우팅 |
| Round Robin | 순차 분배 |
| Least Connections | 연결 수 적은 서버 선택 |
| IP Hash | 같은 클라이언트 → 같은 서버 |
| 헬스 체크 | 서버 상태 확인, 장애 감지 |
| Nginx, HAProxy | 대표적인 로드밸런서 |
| DNS 로드밸런싱 | 여러 IP 반환 |
6-3. 캐싱
| 주제 | 세부 내용 |
|---|---|
| 캐시 필요성 | DB 부하 감소, 응답 속도 향상 |
| 캐시 히트/미스 | 적중률이 성능 좌우 |
| Cache-Aside | 애플리케이션이 캐시 관리 |
| Write-Through | 캐시와 DB 동시 쓰기 |
| Write-Behind | 캐시만 쓰고 나중에 DB |
| 캐시 무효화 | TTL, 이벤트 기반 삭제 |
| 로컬 vs 분산 캐시 | 단일 서버 vs Redis |
| 캐시 스탬피드 | 동시 미스로 DB 폭주, 락으로 방어 |
| CDN 캐싱 | 정적 자원 엣지 캐싱 |
6-4. 메시지 큐
| 주제 | 세부 내용 |
|---|---|
| 동기 vs 비동기 | 즉시 응답 vs 나중에 처리 |
| 메시지 큐 장점 | 디커플링, 버퍼링, 비동기 처리 |
| Kafka | 높은 처리량, 로그 기반, 파티션 |
| RabbitMQ | AMQP, 복잡한 라우팅 |
| Redis Pub/Sub | 간단한 메시징, 영속성 없음 |
| 순서 보장 | 파티션 키, 단일 컨슈머 |
| Exactly-Once | 멱등성 + 트랜잭션 |
| 데드 레터 큐 | 처리 실패 메시지 격리 |
| 이벤트 소싱 | 상태 대신 이벤트 저장 |
6-5. API 설계
| 주제 | 세부 내용 |
|---|---|
| REST 원칙 | 자원 중심, HTTP 메서드 활용 |
| API 버저닝 | URL, 헤더, 쿼리 파라미터 |
| Offset 페이지네이션 | 페이지 번호, 대량 데이터 시 느림 |
| Cursor 페이지네이션 | 마지막 ID 기준, 일관성 유지 |
| Rate Limiting | 요청 제한, 토큰 버킷/슬라이딩 윈도우 |
| GraphQL | 클라이언트가 필요한 데이터만 요청 |
| gRPC | Protocol Buffers, 바이너리, 빠름 |
6-6. 설계 사례
| 주제 | 핵심 고려사항 |
|---|---|
| URL 단축기 | 해시 함수, Base62 인코딩, 충돌 처리 |
| 실시간 채팅 | WebSocket, 메시지 브로커, 읽음 처리 |
| 뉴스피드 | 팬아웃(Push vs Pull), 랭킹 알고리즘 |
| 검색 자동완성 | 트라이, 인기도 가중치, 캐싱 |
| 파일 저장소 | 청킹, 메타데이터 분리, CDN |
| 예약 시스템 | 동시성 제어, 비관적 락, 멱등성 |
7. 언어 & 프레임워크
주요 언어와 프레임워크의 핵심 개념
7-1. Java & JVM
| 주제 | 세부 내용 |
|---|---|
| JVM 구조 | 클래스 로더, 런타임 데이터 영역, 실행 엔진 |
| 메모리 영역 | Heap, Stack, Method Area, PC Register, Native Stack |
| Heap 구조 | Young(Eden, Survivor), Old, Metaspace |
| GC 동작 | Mark-Sweep-Compact, Stop-The-World |
| GC 종류 | Serial, Parallel, CMS, G1, ZGC, Shenandoah |
| Minor vs Major GC | Young 영역 vs Old 영역 |
| String Pool | 문자열 리터럴 재사용, intern() |
| 불변 객체 | String, 스레드 안전, 캐싱 용이 |
| equals/hashCode | 동등성 비교, HashMap 키 조건 |
| Checked/Unchecked 예외 | 컴파일 시점 vs 런타임 |
| 제네릭 | 타입 안전성, 타입 소거 |
| 직렬화 | 객체 → 바이트 스트림, Serializable |
| 리플렉션 | 런타임 클래스 정보 조회/수정 |
7-2. Java 동시성
| 주제 | 세부 내용 |
|---|---|
| synchronized | 메서드/블록 동기화, 모니터 락 |
| volatile | 가시성 보장, 원자성 보장 안 함 |
| java.util.concurrent | 동시성 유틸리티 패키지 |
| ExecutorService | 스레드 풀, 작업 제출/관리 |
| Future | 비동기 결과 조회 |
| CompletableFuture | 비동기 체이닝, 조합 |
| ConcurrentHashMap | 세그먼트 락 → 노드 락 (Java 8+) |
| Atomic 클래스 | CAS 기반 원자 연산 |
| ThreadLocal | 스레드별 독립 변수 |
| Lock 인터페이스 | ReentrantLock, ReadWriteLock |
7-3. Spring
| 주제 | 세부 내용 |
|---|---|
| IoC | 제어의 역전, 객체 생성을 프레임워크에 위임 |
| DI | 의존성 주입, 생성자/세터/필드 주입 |
| Bean | 스프링 컨테이너가 관리하는 객체 |
| Bean 생명주기 | 생성 → 의존성 주입 → 초기화 → 사용 → 소멸 |
| Bean 스코프 | singleton, prototype, request, session |
| 싱글톤 주의점 | 상태 공유 금지, 스레드 안전 |
| AOP | 관점 지향, 횡단 관심사 분리 |
| 프록시 | JDK Dynamic Proxy, CGLIB |
| @Transactional | 선언적 트랜잭션, 프록시로 구현 |
| 트랜잭션 전파 | REQUIRED, REQUIRES_NEW, NESTED |
| Spring MVC 흐름 | DispatcherServlet → Handler → View |
| Filter vs Interceptor | 서블릿 레벨 vs 스프링 레벨 |
| Spring Security | 인증/인가, FilterChain |
| 자동 설정 | @EnableAutoConfiguration, 조건부 빈 등록 |
7-4. JavaScript/TypeScript
| 주제 | 세부 내용 |
|---|---|
| 이벤트 루프 | 콜 스택, 태스크 큐, 마이크로태스크 큐 |
| 마이크로 vs 매크로태스크 | Promise vs setTimeout |
| 클로저 | 함수와 렉시컬 환경의 조합 |
| this 바인딩 | 호출 방식에 따라 결정, bind/call/apply |
| 프로토타입 | 객체 간 상속, proto, prototype |
| Promise | 비동기 처리, then/catch/finally |
| async/await | Promise 문법적 설탕, try/catch |
| TypeScript 타입 | interface, type, generic, union |
| 타입 가드 | typeof, instanceof, in, is |
| Node.js 이벤트 루프 | libuv, 6단계 페이즈 |
7-5. OOP vs FP
| 주제 | 세부 내용 |
|---|---|
| OOP 4대 특성 | 캡슐화, 상속, 다형성, 추상화 |
| 캡슐화 | 정보 은닉, 접근 제어 |
| 상속 | 코드 재사용, is-a 관계 |
| 다형성 | 같은 인터페이스, 다른 동작 |
| SOLID | SRP, OCP, LSP, ISP, DIP |
| 디자인 패턴 | 싱글톤, 팩토리, 전략, 옵저버, 데코레이터 |
| FP 특징 | 함수가 일급 시민, 불변성 강조 |
| 순수 함수 | 같은 입력 → 같은 출력, 부수 효과 없음 |
| 불변성 | 상태 변경 대신 새 객체 생성 |
| 고차 함수 | map, filter, reduce |
| 참조 투명성 | 표현식을 값으로 대체 가능 |
8. 개발 방법론
효율적인 개발을 위한 도구와 프로세스
8-1. Git
| 주제 | 세부 내용 |
|---|---|
| Git 내부 구조 | blob, tree, commit 객체 |
| 3가지 상태 | Working Directory, Staging, Repository |
| merge vs rebase | 병합 커밋 vs 선형 히스토리 |
| Git Flow | feature, develop, release, hotfix, main |
| GitHub Flow | main + feature 브랜치, 단순 |
| Trunk Based | 짧은 브랜치, 잦은 통합 |
| 커밋 컨벤션 | feat, fix, docs, refactor, test |
| cherry-pick | 특정 커밋만 가져오기 |
| stash | 임시 저장 |
| reset vs revert | 히스토리 수정 vs 취소 커밋 |
| 충돌 해결 | 수동 머지, 도구 활용 |
8-2. 테스트
| 주제 | 세부 내용 |
|---|---|
| 테스트 피라미드 | 단위 > 통합 > E2E |
| 단위 테스트 | 함수/클래스 단위, 빠름, 격리 |
| 테스트 더블 | Mock, Stub, Spy, Fake, Dummy |
| Mock vs Stub | 행위 검증 vs 상태 검증 |
| 통합 테스트 | 모듈 간 상호작용 |
| TDD 사이클 | Red → Green → Refactor |
| 테스트 커버리지 | 코드 실행 비율, 100%가 목표 아님 |
| E2E 테스트 | 실제 사용자 시나리오 |
| 테스트 격리 | 독립 실행, 순서 무관 |
8-3. CI/CD
| 주제 | 세부 내용 |
|---|---|
| CI | Continuous Integration, 자동 빌드/테스트 |
| CD (Delivery) | 배포 준비 자동화 |
| CD (Deployment) | 프로덕션 배포 자동화 |
| Jenkins | 파이프라인, 플러그인 생태계 |
| GitHub Actions | YAML 기반, 이벤트 트리거 |
| Docker | 컨테이너화, 이미지, Dockerfile |
| Kubernetes | 컨테이너 오케스트레이션, Pod, Service |
| 블루-그린 배포 | 두 환경 전환, 빠른 롤백 |
| 카나리 배포 | 일부 트래픽만 새 버전 |
| 롤링 배포 | 점진적 교체 |
| 롤백 | 이전 버전 복구 전략 |
8-4. 클린 코드
| 주제 | 세부 내용 |
|---|---|
| 의미 있는 이름 | 의도 드러내기, 검색 가능한 이름 |
| 함수 설계 | 작게, 한 가지만, 추상화 수준 일관 |
| 주석 | 코드로 표현 우선, 필요시 Why 설명 |
| 에러 처리 | 예외 사용, null 반환 지양 |
| 경계 | 외부 코드 래핑, 변경 격리 |
| 클래스 설계 | SRP, 작은 클래스, 높은 응집도 |
| 코드 스멜 | 중복, 긴 메서드, 큰 클래스, 긴 파라미터 |
| 리팩토링 | 작은 단계, 테스트 보호, 지속적 개선 |
8-5. 모니터링
| 주제 | 세부 내용 |
|---|---|
| 로깅 레벨 | TRACE, DEBUG, INFO, WARN, ERROR |
| 구조화된 로그 | JSON 형식, 파싱 용이 |
| 분산 트레이싱 | 요청 추적, Trace ID, Span |
| 메트릭 | 수치 데이터, 시계열 |
| Prometheus | 메트릭 수집, PromQL |
| Grafana | 시각화 대시보드 |
| 알림 설정 | 임계치 기반, 알림 피로 방지 |
| APM | Application Performance Monitoring |
| Datadog, New Relic | 상용 APM 도구 |
9. 면접 대비
기술 외적인 면접 준비
9-1. 인성 면접 (Behavioral)
| 주제 | 세부 내용 |
|---|---|
| STAR 기법 | Situation, Task, Action, Result |
| 갈등 해결 | 의견 충돌 경험, 해결 과정 |
| 실패 경험 | 실패 인정, 배운 점 강조 |
| 협업 경험 | 팀 기여, 커뮤니케이션 |
| 리더십 | 주도적 역할, 팀 이끈 경험 |
| 지원 동기 | 회사 연구, 진정성 |
| 커리어 목표 | 성장 방향, 회사와의 연결 |
9-2. 프로젝트 발표
| 주제 | 세부 내용 |
|---|---|
| 프로젝트 선정 | 기술적 도전, 임팩트 있는 것 |
| 기술 선택 이유 | Why this tech, 대안 비교 |
| 문제 해결 스토리 | 상황 → 원인 분석 → 해결 → 결과 |
| 성능 개선 수치화 | Before/After, 측정 방법 |
| 트러블슈팅 | 디버깅 과정, 원인 파악 |
| 아키텍처 설명 | 전체 구조, 기술 스택 |
| 아쉬운 점 | 개선 방향, 배운 점 |
9-3. 빈출 질문
| 주제 | 준비 포인트 |
|---|---|
| 자기소개 | 30초, 1분, 3분 버전 준비 |
| 기술 스택 깊이 | 사용한 기술 Why, How, 내부 동작 |
| 왜 이 회사? | 회사 제품, 기술 블로그, 비전 연구 |
| 5년 후 계획 | 구체적 목표, 회사 내 성장 |
| 최근 관심 기술 | 트렌드 파악, 학습 중인 것 |
| 장단점 | 솔직하되 개선 노력 포함 |
| 질문 있으신가요? | 팀 문화, 기술 스택, 온보딩 과정 |
9-4. 코딩 면접
| 주제 | 세부 내용 |
|---|---|
| 문제 이해 | 요구사항 확인, 엣지 케이스 질문 |
| 시간 분배 | 이해 5분, 설계 10분, 구현 20분, 검증 5분 |
| 브루트포스 먼저 | 일단 동작하는 해법, 이후 최적화 |
| 면접관 소통 | 생각 과정 설명, 막히면 힌트 요청 |
| 테스트 케이스 | 정상, 엣지, 예외 케이스 |
| 시간/공간 복잡도 | 분석 후 설명 |
| 화이트보드 팁 | 큰 글씨, 구조적 배치 |
| 온라인 코딩 | IDE 없이 연습, 손코딩 |
학습 로드맵
Phase 1: 기초 다지기 (CS 필수)
- 자료구조 전체
- 알고리즘 (복잡도, 정렬, 탐색)
- 운영체제 (프로세스, 메모리, 동기화)
- 네트워크 (TCP/IP, HTTP)
Phase 2: 심화 학습
- 데이터베이스 (SQL, 인덱스, 트랜잭션)
- 알고리즘 (DP, 그래프)
- 언어/프레임워크 심화
Phase 3: 실무 역량
- 시스템 설계
- 개발 방법론
- 면접 대비
각 주제는 면접에서 자주 나오는 순서대로 정리했다. 우선순위가 높은 주제부터 깊이 있게 학습한다.