CRUD 포트폴리오를 버려야 서류를 통과하는 이유
TuBrief 편집팀
2026년 7월 6일
0
컴퓨터/소프트웨어원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
커뮤니티의 다른 글
댓글 (0)
Log in to leave a comment
아직 작성된 글이 없습니다
원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
Log in to leave a comment
아직 작성된 글이 없습니다
단순히 HTML, CSS, JavaScript 문법을 떼고 화면에 게시판 하나 띄우는 토이 프로젝트를 나열하는 방식은 서류 전형 광속 탈락으로 이어집니다. 인공지능이 코드를 대신 짜주는 시대에 단순 구문 작성 능력은 경쟁력이 없습니다. 글로벌 보안 기업 베라코드(Veracode)의 생성형 AI 코드 보안 보고서에 따르면, AI 보급 이후 코드 작성 속도는 빨라졌으나 동시에 보안 취약점과 구조적 결함 발생 빈도가 급격하게 증가했습니다. 지금 기업이 원하는 개발자는 코드를 빨리 치는 사람이 아니라, 시스템의 결함을 찾아내고 데이터 흐름을 통제하는 엔지니어입니다. 포트폴리오 첫 장에서 뻔한 기술 스택 나열을 지우고 데이터 흐름과 결함 해결 과정 중심으로 전면 개편해야 면접 기회를 잡을 수 있습니다.
우선 Mermaid.js 같은 다이어그램 도구를 사용해 AI가 생성한 코드의 한계를 분석하고 이를 리팩토링한 3단계 아키텍처 다이어그램을 포트폴리오 최상단에 배치합니다. 1단계에는 비동기 병목과 XSS 위험에 노출된 초기 상태를 명시하고, 2단계에는 입력값 검증 및 DOMPurify 위생 처리 모듈을 격리한 과정을 보여줍니다. 마지막 3단계에는 React 클라이언트와 Service Layer가 분리된 Express.js 및 PostgreSQL 구조를 시각화합니다. 이어서 AI 코딩 도구가 놓친 보안 결함을 수동으로 검증한 내역을 전후 코드 비교 형태로 기록합니다. SQL 인젝션 위험이 있는 원시 쿼리 패턴을 매개변수화 쿼리 바인딩으로 바꾼 코드, 그리고 외부 입력값을 필터링 없이 화면에 노출한 패턴을 DOMPurify.sanitize() 라이브러리로 방어한 코드를 나란히 증명하면 설계 역량을 제대로 어필할 수 있습니다.
경력이 없는 신입이라도 Docker를 활용하면 비용 없이 개인 PC 내부에서 대규모 모의 트래픽을 재현하고 성능을 개선하는 경험을 할 수 있습니다. 로컬 테스트 인프라의 핵심은 가상 컨테이너 환경을 통해 웹 서버와 데이터베이스 레이어를 완전히 격리하는 구조를 만드는 것입니다.
대용량 데이터 처리 경험을 포트폴리오에 확보하는 구체적인 순서는 다음과 같습니다. 먼저 node:20-alpine과 postgres:15-alpine 이미지를 정의한 docker-compose.yml 파일을 작성하고 depends_on 옵션으로 의존성을 연결하여 컨테이너 환경을 빌드합니다. 브라우저 캐시 적중으로 인한 데이터 왜곡을 막기 위해 가상 식별자 파라미터 파일(users.csv)을 생성하고, Apache JMeter를 설치해 CSV Data Set Config로 연결합니다. 마지막으로 JMeter 스레드 그룹에서 가상 사용자를 100개, Ramp-Up Period를 60초로 지정하고 Constant Throughput Timer를 분당 30,000 RPM(초당 500 RPS)으로 설정한 뒤 CLI 명령어로 백그라운드 구동합니다. 이 방식을 쓰면 컴퓨터 리소스를 고갈시키지 않으면서 고부하 환경을 재현합니다.
jmeter -n -t product_search_plan.jmx -l performance_log.jtl
부하 상태에서 응답 시간이 2초 이상 지연되는 병목 지점을 찾았다면 PostgreSQL에서 EXPLAIN (ANALYZE, BUFFERS) 옵션으로 세부 실행 계획을 분석합니다. 카디널리티가 높은 필드인 category와 status를 맨 왼쪽에 배치하고 정렬 대상 속성인 created_at DESC를 마지막 인자로 묶어 복합 B-Tree 인덱스를 생성합니다. 50만 건의 레코드를 순차 스캔(Seq Scan)하던 이전 구조에서 인덱스 스캔(Index Scan)으로 리팩토링하면 불필요한 디스크 I/O가 사라집니다. 단일 쿼리 응답 시간을 2,420.51ms에서 0.41ms로 줄이고 에러율을 0%로 안정화한 정량적 수치를 포트폴리오에 채워 넣으면 동료 지원자들보다 유리한 조건으로 합격하는 발판이 됩니다.
AI 코딩 지원 도구는 통계적 패턴에 의거해 단일 흐름 관점의 코드를 제안할 뿐입니다. 대량의 분산 동시 호출 조건에서 발생하는 시간 지연 간섭 결함이나 데이터 정합성 파괴 위험은 예측하지 못합니다. 포인트 적립 및 차감 로직이 대표적입니다. AI는 동시성 방어 로직 없이 단순히 변수 상태를 읽어 조작하는 코드를 자주 내놓는데, 이는 데이터가 유실되는 오염을 유발합니다.
이 사각지대를 해결하기 위해 Jest 프레임워크 기반의 예외 핸들링 테스트 슈트를 직접 구축해야 합니다. 외부 DB 연결 쿼리 모듈을 수동으로 모킹(jest.mock) 처리해 독립적인 테스트 환경을 만듭니다. 결제 포인트가 음수로 들어오는 예외 조건에 대해 비즈니스 밸리데이터 계층에서 toThrow로 즉각 에러를 반환하고 DB 쿼리가 호출되지 않는지 검증하는 코드를 작성합니다. 데이터 정합성 충돌 시 재시도 루프가 도는지 확인하기 위해 mockResolvedValueOnce를 활용해 업데이트 행 수(rowCount)가 0인 경합 상황을 강제로 모사하고 예외를 잡아냅니다. 마이너스 인자 투입, 임계 경계값 조건, 페이로드 누락 등 5대 예외 시나리오를 자동화 테스트로 상시 검증하는 구조를 만듭니다.
이렇게 쌓은 테스트 통찰을 바탕으로 깃허브 오픈소스 생태계에 참여해 경력 공백기를 상쇄하는 기여 루틴을 실행합니다. 매일 아침 GitHub 검색창에 label:"good first issue" language:javascript stars:>500 검색어를 입력해 최근 등록된 가벼운 예외 처리 버그 태스크를 색출합니다. 메인테이너에게 작업 의사를 밝히고 로컬로 Fork한 뒤, AI 도구의 오답 반례를 분석해 Jest 단위 테스트와 예외 방어 로직을 반영한 Pull Request(PR)를 전송합니다. 오픈소스 코드베이스 변경 기록을 본인의 프로필에 누적하면 실무 수준의 협업 능력을 확실하게 입증합니다.
기술 면접에서 생성형 AI가 코드를 다 짜주는 시대에 본인의 경쟁력이 무엇이냐는 질문을 마주했을 때, 당황하지 않고 시스템의 트레이드오프를 이해하는 구조로 답변해야 합니다. 본인의 결정을 논리적으로 방어하기 위해 STAR(Situation, Task, Action, Result) 구조의 답변을 정립합니다. 토이 프로젝트 중 포인트 거래 폭증 시 잔액 유실 동시성 문제를 확인한 상황(Situation)과, AI 툴이 동시성 경쟁 상태를 인지하지 못해 데이터 보호 메커니즘을 직접 구축해야 했던 과제(Task)를 정의합니다. 이어 데이터 충돌 확률 수식에 입각해 시스템 성능을 분석한 후 낙관적 락 대신 데이터베이스 레벨에서 FOR UPDATE 구문을 활용한 비관적 락을 적용하고 JMeter로 부하 테스트를 병행한 행동(Action)을 설명합니다. 중복 트래픽 유입 환경에서도 잔액 불일치 에러율 0.00%를 달성해 비즈니스 무결성을 지켜낸 결과(Result)를 당당히 밝히면 됩니다.
프론트엔드와 백엔드 간의 소통 비용을 줄이고 병렬 개발을 주도하기 위해 API-First 디자인 원칙을 포트폴리오에 녹여내는 것도 좋은 방법입니다. 개발 초기 단계부터 계약 정의 문서 역할을 수행하는 OpenAPI(Swagger) 명세를 확립하고 유효성 검증 규칙을 구조화합니다.
openapi: 3.0.4
info:
title: High-Reliability Wallet Transaction API
version: 1.1.0
paths:
/api/v1/wallet/deduct:
post:
summary: "보안이 보장된 동시성 지갑 포인트 차감 처리 API"
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
userId:
type: string
format: uuid
amount:
type: integer
minimum: 1
required:
- userId
- amount
responses:
"200":
description: "트랜잭션 정합성 보호 상태로 차감 완료"
"409":
description: "데이터 경합 충돌 발생으로 인한 일시적인 트랜잭션 중단 및 롤백"
위와 같이 userId 포맷을 UUID로 한정하고 amount 속성의 최솟값을 1로 지정해 비정상 페이로드를 원천 차단하는 명세를 배포 단계 전에 팀원들에게 먼저 제공한 경험을 어필합니다. 비즈니스 정합성을 충돌 단계(409 Conflict) 오류 응답 체계로 명확히 분리해 설계한 이력을 명시하면 면접관에게 단순 구문 작성자가 아니라 협업 오버헤드를 줄이는 주니어 엔지니어로 각인될 수 있습니다.
인공지능의 등장으로 단순 코더의 고용 기반이 위태로워진 것은 사실입니다. 그러나 시스템의 구조적인 설계를 통제하고 실제 병목 지점을 정밀 분석할 줄 아는 엔지니어의 필요성은 오히려 커졌습니다. 로컬 인프라 모의 성능 튜닝과 예외 테스트 설계를 직접 경험하고 실천하는 것만이 시장 경쟁력을 확보하는 유일한 해법입니다. 당장 자신의 포트폴리오 최상단 기술 스택을 지우고, 데이터 흐름과 리팩토링 과정을 담은 아키텍처 다이어그램으로 개편하며, 로컬 부하 테스트를 통해 도출한 쿼리 플랜 개선 수치와 예외 상황을 방어하는 유닛 테스트 슈트를 추가해 진짜 엔지니어로서의 커리어를 시작하기 바랍니다.