백엔드 시스템을 끝까지 그려볼 수 있나요

 ・ 6

photo by Daniel Leone(https://unsplash.com/@danielleone?utm_source=templater_proxy&utm_medium=referral) on Unsplash

백엔드 면접 질문을 하나하나 보면 별 연결이 없어 보여요. 시스템 구성, MySQL 엔진, 리눅스 패키지 관리자, SSH 터널링, ERD, Redis, 배포, WAS 최적화, PayPal 연동, 시큐어 코딩까지. 영역이 너무 넓죠.

그런데 면접을 몇 번 받아보면 보여요. 질문은 다르지만 가려내려는 건 거의 하나예요.

자기가 만든 시스템을 한 장으로 그릴 수 있는가, 그리고 그 안의 박스 하나를 깊게 열어볼 수 있는가.

이 글은 그 관점에서 자주 나오는 13가지 영역의 핵심을 정리한 거예요. 모범 답안이 아니라, 자기 경험을 한 번 더 짚어보는 체크리스트로 봐주시면 좋아요.

시스템 전체를 한 장에 그려본다#

면접의 첫 질문은 보통 비슷해요.

"지난 프로젝트의 시스템 구성을 설명해보세요."

이 질문이 가려내는 건 단순해요. 자기가 만진 시스템을 한 장으로 그릴 수 있는지요. 그릴 수 있으면 그다음 질문이 의미를 갖고, 못 그리면 뒤 질문이 다 막혀요.

좋은 구성도에는 세 가지가 들어가요.

  1. 컴포넌트와 책임 — 클라이언트, 로드밸런서, WAS, DB, 캐시, 외부 API 각각이 무엇을 하는지
  2. 컴포넌트 간 통신 — HTTP/HTTPS, gRPC, JDBC, 큐, 어떤 프로토콜로 무엇이 오가는지
  3. 실패 경로 — 한 컴포넌트가 죽으면 어디로 폴백되는지, 어떤 데이터가 유실되는지

배포도 사실 이 그림의 연장선이에요. "어디에 올리는가"(EC2, ECS, EKS, Lambda 등), "어떻게 무중단으로 바꾸는가"(블루-그린, 카나리, 롤링), "롤백은 어떻게 하는가" — 이 세 가지가 배포 질문의 본질이에요.

WAS 셋팅과 최적화는 이 그림의 한 박스를 깊이 들여다보는 거예요. 톰캣이든 Spring Boot 내장이든, 핵심은 같아요.

  • 스레드 풀 사이즈 — 동시 처리 가능한 요청 수, CPU와 I/O 특성에 맞춰 조정
  • 커넥션 풀 사이즈 — DB가 받을 수 있는 커넥션 수와 맞춰야 함 (WAS × 인스턴스 수 ≤ DB max_connections)
  • 타임아웃 — 응답, DB, 외부 호출 각각 다른 값으로 명시
  • JVM 옵션 — 힙 사이즈, GC 알고리즘 (보통 G1이 기본, 큰 힙에서는 JDK 21+의 Generational ZGC가 사실상 기본 권장)

데이터를 어떻게 다루는가#

데이터 영역은 세 가지가 묶여요. DB 선택, 스키마 설계, 캐시 전략.

MySQL을 썼다면 어떤 엔진을 썼는가#

"MySQL 써봤어요"만으로는 부족해요. 어떤 스토리지 엔진을 썼는지가 핵심이에요.

엔진 특징 언제
InnoDB 트랜잭션, 외래키, 행 단위 락, 클러스터드 인덱스 거의 모든 일반 케이스
MyISAM 트랜잭션 없음, 테이블 락, 빠른 카운트 거의 안 씀 (legacy)
Memory RAM 저장, 영속성 없음 임시 테이블

요즘 현장은 사실상 InnoDB가 기본이에요. 그래서 더 깊은 질문은 "격리 수준은 뭘로 두셨어요?"로 이어져요. REPEATABLE READ(기본)와 READ COMMITTED의 차이, 그리고 갭 락이 데드락에 어떻게 영향을 주는지 정도는 답할 수 있어야 해요.

ERD를 그릴 때 무엇을 보는가#

ERD를 그리는 사람과 받아쓰는 사람이 갈리는 지점은 여기예요.

  • 정규화의 의도와 비정규화의 의도 — 1NF/2NF/3NF를 외우는 게 중요한 게 아니라, 어디까지 정규화하고 어디부터 의도적으로 비정규화할지 결정할 수 있는가
  • 인덱스를 염두에 둔 키 선택 — 자주 조회되는 컬럼이 PK/UK/인덱스에 들어가 있는가, 복합 인덱스 순서는 카디널리티 큰 컬럼이 앞에 있는가
  • 외래키 정책ON DELETECASCADE로 둘 건지 RESTRICT로 둘 건지, 애플리케이션이 책임질 건지
  • 변경에 강한 설계 — 자주 바뀌는 속성은 별도 테이블로 분리해두면 마이그레이션이 쉬워져요

Redis(또는 Valkey)는 구축인가 매니지드인가#

2024년 Redis의 라이선스 변경(SSPL/RSALv2) 이후 Linux Foundation 주도의 Valkey 포크가 주류 OSS 대안으로 자리 잡았어요. AWS ElastiCache/MemoryDB도 Valkey를 기본 옵션으로 제공해요. 어느 쪽을 썼든 질문의 결은 같아요.

"직접 구성하셨어요, 아니면 매니지드 쓰셨어요?"

이게 중요한 이유는 운영 깊이를 가른다는 거예요.

  • 직접 구성 — 마스터-슬레이브 복제, Sentinel(고가용성), Cluster(샤딩) 중 어떤 모드인지, 메모리 정책(maxmemory-policy)은 어떻게 잡았는지
  • 매니지드 (ElastiCache, MemoryDB 등) — 운영 부담은 적지만 비용 구조와 제약(파라미터 그룹 제한, 클러스터 모드 차이)을 이해해야 함

캐시 자체에 대해서도 정리해두면 좋아요. 무엇을 캐싱하는가(읽기 많고 변경 적은 데이터), 만료 정책(TTL, LRU), 캐시 미스가 났을 때 일어나는 일(thundering herd 방지). 답이 깊어져요.


인프라를 직접 만져본다#

리눅스, 패키지 관리, SSH는 보통 묶여서 나와요. 결국 "터미널에서 일할 수 있는가"를 보는 거예요.

어떤 리눅스를 썼는가 = 어떤 패키지 관리자에 익숙한가#

배포판 패키지 관리자
Ubuntu / Debian apt, dpkg
RHEL / CentOS / Amazon Linux yum, dnf, rpm
Alpine apk (도커 이미지에서 자주 봐요)
Arch pacman

같은 패키지여도 배포판마다 이름이 다르고, 의존성 트리도 달라요. apt로는 nginx인데 Alpine에선 nginx와 함께 ca-certificates까지 명시해야 하는 식이죠.

"패키지를 올려봤다"는 의외로 가치가 커요#

사내 사설 저장소든 npm/PyPI/Maven Central이든, 패키지를 한 번이라도 배포해본 경험은 다음을 보여줘요.

  • 시맨틱 버저닝(SemVer)의 의미를 안다 — major.minor.patch의 변경 기준
  • 의존성을 명시적으로 관리할 줄 안다 — peer/dev/optional 의존성의 차이
  • 메타데이터(README, license, keywords)가 발견성에 어떤 영향을 주는지 안다

라이브러리 하나를 만들어서 사내에라도 올려보면, 라이브러리를 쓰는 관점만 갖고 있을 때는 안 보이던 게 보여요.

SSH 키와 터널링#

  • 키 생성은 ssh-keygen -t ed25519 -C "email" — RSA보다 짧고 빨라요
  • 공개키 등록은 서버의 ~/.ssh/authorized_keys에 한 줄로 추가
  • 권한 중요: ~/.ssh는 700, authorized_keys는 600

터널링은 외부에서 막혀 있는 내부 자원에 안전하게 접근하는 표준 방법이에요.

# 로컬 13306 → bastion 경유 → RDS 3306
ssh -L 13306:rds.internal:3306 user@bastion.example.com

이렇게 열어두면 로컬 MySQL 클라이언트로 localhost:13306에 붙기만 하면 돼요. VPN 없이 운영 DB에 잠깐 붙어야 할 때 자주 써요.


보안을 코드 레벨에서 고민한다#

시큐어 코딩과 결제 연동은 사실 한 묶음이에요. 외부와 닿는 모든 지점에 대한 의심이거든요.

시큐어 코딩의 큰 4가지#

  1. 입력은 항상 검증한다 — SQL 인젝션은 파라미터 바인딩으로, XSS는 출력 시 이스케이프로
  2. 인증과 인가는 분리한다 — "누구냐"(authentication)와 "뭘 할 수 있냐"(authorization)는 다른 층
  3. 비밀은 코드에 두지 않는다 — 환경 변수, 시크릿 매니저(AWS Secrets Manager, Vault)로
  4. 로그에 민감 정보를 남기지 않는다 — 카드 번호, 토큰, 개인정보는 마스킹

PayPal 같은 외부 결제 연동에서 가장 중요한 것#

기능 동작보다 상태와 멱등성이에요.

  • 결제 상태 머신을 명확하게 정의PENDING → APPROVED → CAPTURED → REFUNDED 같은 흐름을 코드와 DB에 동일하게 새겨두기
  • 웹훅(IPN) 검증 — PayPal이 보낸 콜백인지 서명으로 확인, 그리고 같은 이벤트가 재전송돼도 한 번만 반영되도록 idempotency key 처리
  • 환불·취소의 트랜잭션 일관성 — 외부 API 호출과 우리 DB 업데이트 사이에 불일치가 생기지 않게 보상 트랜잭션이나 outbox 패턴 고려
  • 결제 정보는 직접 저장하지 않는다 — 카드 번호는 토큰으로만 보관 (PCI DSS 4.0 기준)

이 영역은 "되는 코드"와 "운영해도 안 무너지는 코드"의 차이가 가장 크게 나는 곳이에요.


결국 한 가지 질문으로 모인다#

13가지 영역을 다 짚었는데, 결론은 처음과 같아요.

자기가 만진 시스템을 한 장으로 그릴 수 있고, 각 박스 안을 한 단계 더 들여다볼 수 있는가.

면접 준비는 "MySQL 격리 수준 4가지 외우기" 같은 게 아니에요. 자기가 실제로 만진 시스템의 그림을 한 번 더 그려보고, 각 박스마다 "내가 이걸 왜 이렇게 골랐지?"를 자문해보는 거예요. 그러면 같은 질문이 와도 모범 답안이 아니라 자기 답이 나와요.

마지막에 따라붙는 비기술 질문도 사실 같은 결이에요. "앞으로 뭘 잘 하고 싶은지", "3년 뒤 어떤 모습이고 싶은지", "다른 면접 보는 곳 있는지" — 이건 자기 커리어의 시스템 구성도를 그려본 적이 있는지를 묻는 거예요. 자기가 어디로 가고 있는지 한 장에 그릴 수 있는 사람은 답이 빨라요.

기술이든 커리어든, 결국 같은 근육이에요. 한 장에 그려보고, 박스 하나를 열어보는 습관.


Spring is a time for rebirth and the fulfilment of new life.

— Byron Pulsifer


다른 글
AR 글래스는 차세대 스마트폰이 될까 커버 이미지
 ・ 15

AR 글래스는 차세대 스마트폰이 될까

백엔드 면접에서 자주 나오는 질문 38가지 정리 커버 이미지
 ・ 12

백엔드 면접에서 자주 나오는 질문 38가지 정리

백엔드 면접 질문 25개로 돌아보는 자바 서버 기초 커버 이미지
 ・ 11

백엔드 면접 질문 25개로 돌아보는 자바 서버 기초