안성윤 프로필 사진

안성윤

백엔드 개발자

동료와 함께 정답에 가까운 해법을 찾아가는 엔지니어”

기획 단계부터 배포, 운영까지 프로덕트의 전체 생명주기를 경험하며 '왜?'라는 질문이 더 안정적인 백엔드를 만든다는 것을 배웠습니다.

동료들과의 자유로운 토론속에서 끊임없이 문제의 본질에 대해 되묻고 '정답에 가까운 해법'을 만들어 나가는 방법에 관심이 많으며 궁극적으로 사용자에게 안정적인 환경 속에서 유의미한 가치를 전달하는 백엔드 개발자가 되고자 합니다.

AI가 코드를 쓰는 시대에도, 문제를 정의하고 팀을 움직이는 일은 여전히 사람의 몫이라 믿습니다. 그래서 지금도 계속 벼리고 있는 네 가지가 있습니다.

  1. 01

    문제를 쪼개는 힘

    모호한 요구사항을 그대로 구현하지 않습니다. 작게 나누고, 단계마다 '지금 풀어야 할 문제'가 무엇인지 다시 정의한 뒤 순서대로 풀어냅니다.

  2. 02

    일의 순서를 설계하는 감각

    마감에서 역산해 오늘 할 일을 정합니다. 계획이 어긋나면 숨기지 않고 가장 먼저 공유해, 팀이 예측 가능하게 움직이도록 합니다.

  3. 03

    같이 일하고 싶게 만드는 소통

    혼자 오래 붙들기보다 먼저 묻고, 결정의 배경은 기록으로 남깁니다. 동료와의 토론과 코드 리뷰가 저를 가장 빨리 성장시켰습니다.

  4. 04

    '이 정도면 됐다'를 의심하는 끈기

    돌아가는 코드에서 멈추지 않습니다. 원인이 설명될 때까지 파고들고, 그 끝에서 오픈소스 라이브러리의 버그를 찾아 PR로 직접 고치기도 했습니다.

Scroll Down
Career

젠스타파트너스

2026/03 ~ 현재

백엔드 엔지니어

국내 최대 규모 상업용 부동산 기업 (주)젠스타메이트의 IT 솔루션 전문 자회사로, 사내 다양한 부서의 업무 전반에 활용되는 백오피스 서비스를 개발 및 운영합니다.

리서치 백오피스 시스템
2026/03 ~ 현재
#전담 개발
프로젝트 소개 온프레미스 레거시(Windows 네이티브 앱 + Oracle 10g)를 클라우드 웹 서비스로 마이그레이션한 사내 백오피스 시스템 역할 백엔드 설계 및 구현 담당 사용 기술
TypeScript
NestJS
MikroORM
PostgreSQL
Zod
ExcelJS
S3
ECS
  • 도메인 정책 레이어로 비즈니스 규칙 산포 방지

    문제 역할·시점·필드마다 수정 권한이 달라서 조건 분기가 UseCase 곳곳에 흩어질 게 뻔했음.

    성과 권한 정책 변경 시 수정 지점을 Policy 클래스 1개로 한정, 인프라 의존 없는 순수 함수라 단위 테스트도 DI 없이 가능한 구조로 개선.

    • 도메인별 Policy 클래스 6종(Vacancy·Building·Snapshot·Memo·File 등) 으로 규칙을 모아 단일 파일 수정으로 변경 범위 한정
    • 클라이언트가 전체 필드를 재전송해도 저장값과 실제로 달라진 필드만 계산(changedKeys) 해 역할·마감상태별 필드 마스크를 적용 — 클라이언트 구현 방식과 무관하게 정책 일관성 보장
    • PolicyCtx 타입을 진입 시 1회 구성해 재사용함으로써 반복 DB 조회 제거
    • 인프라 의존 없는 순수 함수라 DI 없이 단위 테스트 가능
  • 스트리밍 기반 대용량 엑셀 Export로 메모리 리스크 차단

    문제 수천 건을 한꺼번에 메모리에 올려 Export하면 요청이 겹칠 때 메모리가 튈 수 있었음.

    성과 0.5GiB 메모리 제한 컨테이너에서 건수와 무관하게 메모리 점유가 일정 수준으로 수렴, 동시 Export가 몰려도 OOM(컨테이너 강제 종료) 없이 안정적으로 동작.

    • ExcelJS 스트리밍 Writer로 임시 파일에 즉시 기록 후 HTTP 스트림 응답 — 완료/오류/연결 끊김 모두에서 임시 파일 정리로 안전한 생명주기 관리
    • 청킹 조회 + ORM Identity Map 즉시 해제로 힙 점유를 청크 1개 분량으로 바운딩하고, 처리 루프에 setImmediate 삽입으로 이벤트 루프 블로킹 방지
    • 동시 Export 세마포어(2슬롯) 초과 요청은 대기 없이 429 fail-fast 응답해 서버 전체 OOM 리스크 원천 차단
  • 레거시 데이터 정제와 스키마 재설계로 DB 용량 및 조회 성능 동시 개선

    문제 약 135개 컬럼의 단일 테이블에 매월 전체 상태를 통째로 복제하고 인덱스를 남발하는 레거시 스키마가 그대로 올라오면, DB 용량도 조회 속도도 나쁠 수밖에 없는 상태였음.

    성과 공실 이력 원천 약 460만 행을 유효 데이터 12만여 행으로 정제 이관(16년 치 월별 이력 재구성), 레거시 대비 DB 용량 65% 이상 절감, 주요 조회 쿼리 평균 응답속도 70% 이상 개선.

    • 이관 전 레거시 Oracle 프로시저(PL/SQL) 전체를 역설계해 각 테이블의 업무적 의미와 이관 리스크를 문서로 확정한 뒤 스키마 재설계 착수
    • 신규 서비스 요구사항을 기준으로 불필요한 레거시 데이터를 폐기하고 필요한 데이터만 정제 및 이관, 정규화 수준을 높여 데이터 일관성 확보
    • 실제 조회 패턴을 분석해 불필요한 인덱스를 최소화함으로써 쓰기 비용과 저장 공간 절감
    • 시계열 데이터를 현재 상태(라이브) 테이블과 월별 스냅샷 테이블로 분리해 자주 조회되는 최신 데이터 접근 효율을 높이고 과거 이력은 별도 관리
  • 변경·조회·반출 전 과정을 추적하는 감사 로그 체계 구축

    문제 회사 핵심 자산인 리서치 데이터를 다루는 시스템이라, '누가 언제 무엇을 바꾸고, 조회하고, 반출했는가'를 사후에 증명할 수 있어야 했음.

    성과 데이터 변경·접근·반출 이력이 각각의 로그로 남아, 이슈 발생 시 원인 추적과 책임 소재 규명이 가능한 구조 확보.

    • 변경 로그: 수정 전/후 값을 JSON diff로 기록하고 Revision 버전과 연결해 어떤 변경 신호가 어떤 수정에서 발생했는지 추적 가능
    • 접근 로그: 커스텀 데코레이터 + Interceptor + Extractor 패턴의 AOP 설계로 비즈니스 로직 오염 없이 데이터 접근 기록
    • 반출 로그: 엑셀 Export 시 반출 사유와 범위를 기록해 데이터 유출 리스크에 대응
  • 재실행 안전성과 전수 추적으로 운영 데이터 이관의 신뢰성을 직접 책임

    문제 일회성 작업이 아닌 회사 핵심 자산(운영 데이터) 이관이었기 때문에, 중간 실패 시 재실행해도 데이터가 중복 및 유실되지 않아야 했고, 이관이 끝난 뒤에도 '정말 빠짐없이, 정확하게 옮겨졌는가'를 스스로 증명할 수 있어야 했음.

    성과 이관 완료 기준을 '스크립트가 에러 없이 끝났다'가 아니라 '원천의 모든 행이 적재 또는 사유 있는 폐기로 설명된다'로 정의하고, 이를 실행마다 수치로 증명.

    • 데이터가 '현재 상태' / '변경 이력' / '특정 시점 스냅샷' 중 무엇을 표현하는지에 따라 멱등 전략을 다르게 설계 — UPSERT(`xmax` 기반 삽입/갱신 판별), 전 컬럼 `IS DISTINCT FROM` 변경 감지, 스코프 한정 DELETE-before-INSERT로 몇 번을 재실행해도 동일한 결과 보장
    • 이상 데이터를 '변환 불가로 폐기한 것'(12종 사유 분류)과 '적재했지만 값이 비정상적이라 후속 검토가 필요한 것'(anomaly)으로 분리 추적해, 실행 성공 여부와 데이터 품질 이슈를 별개 축으로 관리
    • 원천 스캔 행수 ↔ 적재 건수 ↔ 사유별 폐기 건수가 완전히 맞아떨어지는 전수 회계 리포트를 실행마다 자동 산출해 모든 미적재 데이터가 '의도된 폐기'임을 증명
    • 수백만 행 처리 중 V8 문자열 한도로 실패하던 로딩·로깅을 AsyncGenerator·NDJSON 스트리밍으로 재설계해 메모리 사용량을 입력 크기와 분리
Projects
플랫폼 통합 개발 블로그 허브
2024/10 ~ 2026/02
#네이버 부스트캠프 팀 프로젝트
프로젝트 소개 RSS 기반 개발 기술 블로그 큐레이션 플랫폼. 누구나 자신의 RSS를 등록하고 여러개의 최신 피드 확인 가능. 역할 팀장(스크럼 마스터), 백엔드 엔지니어, 데브옵스 엔지니어 사용 기술
Typescript
NestJS
TypeORM
Redis
MySQL
Docker
NaverCloudPlatform
AWS
Terraform
Github https://github.com/boostcampwm-2024/web05-Denamu 배포 주소 https://denamu.dev/
  • RSS 기반 자동 피드 데이터 수집을 위한 크롤링 스케줄러 구현

    문제 사용자가 RSS를 등록하면 주기적으로 피드를 크롤링해 최신 글을 자동으로 가져와야 했음.

    성과 RSS 2.0·Atom 1.0 두 포맷을 단일 파이프라인으로 처리. 신규 스펙 추가 시 파서 클래스 구현만으로 확장 가능한 구조.

    • 배치 스케줄링을 별도 마이크로서비스로 분리해 API 서버와 관심사 및 책임 분리
    • 수집(fetch)→파싱(XML→DTO)→필터링(시간 기반)→저장(DB/Redis) 파이프라인으로 단계 분리해 독립적인 테스트 및 디버깅이 가능한 구조로 개선
    • DI Container(TSyringe) 적용으로 모듈 간 결합도를 낮추고 테스트 편의성 향상
    • 템플릿 메서드 패턴 적용으로 새로운 XML 스펙(RSS 2.0, Atom 1.0 등) 등장 시에도 파서 클래스 추가만으로 손쉽게 대응 가능하도록 개선
  • 경량 메시지 큐를 직접 설계해 크롤링 파이프라인 비동기 전환

    문제 RSS 승인 API가 요청 처리 중 전체 피드 크롤링을 동기로 수행해 응답이 크롤링 시간만큼 지연됐고, 단일 서버의 한정된 자원에서 별도 메시지 브로커를 운영하기엔 부담이 컸음.

    성과 크롤링 책임을 크롤러 서비스로 단일 귀속시키고 API는 큐 발행 후 즉시 응답. 신규 워커가 추가돼도 큐 폴링·에러 처리·계측을 재구현할 필요 없는 컨슈머 계층 확보.

    • WAS에 남아 있던 크롤링 로직을 제거하고 Redis 큐 기반 비동기 이벤트로 서비스 간 통신을 일원화
    • 컨슈머의 역할을 정의·격리해 제네릭 추상 워커(AbstractQueueWorker<T>) 로 계층화 — 큐 폴링·에러 격리·실행시간 계측을 공통화해 신규 워커를 추상 메서드 구현만으로 안전하게 추가 가능한 구조
    • 별도 브로커 없이 메시지 큐의 핵심 개념을 직접 설계 — 에러를 일시적/영구적으로 분류해 재시도 가능한 실패만 deathCount 기반 최대 3회 재적재하고, 영구 실패는 poison message로 격리해 파이프라인 정체 방지
  • Terraform IaC 도입과 컨테이너 기반 배포 전환으로 인프라 아키텍처 고도화

    문제 콘솔에서 수작업으로 구성한 인프라는 서버 이전 및 재구축 시 재현이 불가능했고, PM2로 소스를 직접 실행하는 배포 방식은 서버 환경이 바뀔 때마다 깨질 위험이 있었음.

    성과 인프라 전체를 Terraform 코드로 형상 관리하고 NCP → AWS 클라우드 마이그레이션을 IaC 기반으로 완료. 배포를 Docker 이미지 단위로 표준화해 서버가 바뀌어도 동일한 실행 환경 보장.

    • Terraform으로 VPC·방화벽·서버 등 인프라 전체를 코드화해 수작업 없이 재현 가능한 형상 관리 체계 확립
    • 비용 효율화를 위한 NCP → AWS(EC2 ARM) 클라우드 마이그레이션을 Terraform 기반으로 수행
    • PM2 직접 실행 배포를 Docker + GHCR(컨테이너 레지스트리) 이미지 배포로 전환하고, ARM 서버 대응을 위해 QEMU 멀티아키텍처 빌드 구성
    • 빌드(GitHub-hosted)와 실행(Self-Hosted Runner) 환경을 분리해 배포 시 서비스 서버 부하 최소화
  • CI/CD 파이프라인 및 테스트 환경 셋업 자동화

    문제 서버 자원이 빠듯한 상황에서 배포 안정성과 팀 개발 속도를 동시에 챙겨야 했음.

    • Github Actions 기반 CI/CD 파이프라인 구축과 LeftHook + commitlint로 커밋 컨벤션 강제
    • TestContainers 기반 통합테스트 환경을 자동 셋업해 테스트용 MySQL/Redis 컨테이너 자동 생성
    • 테스트 간 DB 클리어·Redis flush 기반 데이터 격리로 테스트 실행 순서와 무관한 안정성 확보
  • 유지보수 및 변경에 유연한 테스트 코드 관리

    문제 로직을 리팩터링할 때마다 테스트도 같이 손봐야 해서 변경 비용이 두 배가 됐음.

    • 공개 인터페이스 및 비즈니스 로직 중심 테스트로 내부 구현 변경에 영향받지 않는 구조를 만들어 유지보수 복잡도 감소
    • 복잡한 핵심 private 메서드TypeScript 인덱스 접근(브래킷 표기)으로 예외적으로만 직접 검증해 캡슐화 훼손 최소화
    • Fixture 패턴으로 재사용 가능한 테스트 데이터를 관리해 테스트 코드 유지보수성 향상
지출 내역 관리 SNS 플랫폼
2024/03 ~ 2024/10
#교내 졸업 프로젝트
프로젝트 소개 소비 습관 개선을 위한 소비 지출 내역 기록, 관리, 커뮤니케이션 플랫폼 역할 백엔드 엔지니어 사용 기술
Java
SpringBoot
JPA
MySQL
Redis
AWS
Docker
Github https://github.com/CollaBu/pennyway-was
  • 능동적 코드리뷰와 구조 도식화 전략으로 빠른 팀 합류

    문제 개발이 한창 진행 중인 팀에 중간 합류한 상황이라, 아키텍처와 협업 방식(애자일 스크럼, Jira + Confluence)을 빠르게 파악하면서 바로 기여해야 했음.

    • 코드리뷰 적극 참여와 비즈니스 로직 도식화를 스스로의 합류 전략으로 삼아 짧은 기간 안에 프로젝트 구조와 맥락 파악
    • 기존 디렉토리 구조, 의존성, 컨벤션을 숙지해 첫 기여부터 팀 컨벤션에 맞는 일관된 방식으로 기능 구현
    • 애자일 스크럼 방법론Jira + Confluence 기반 협업 프로세스(스프린트 계획, Smart Commit/Issue Linking 연동 등)를 빠르게 습득해 팀의 기존 워크플로우에 자연스럽게 합류
  • 비동기 처리를 활용한 응답속도 개선

    문제 문의 API에서 메일 발송이 끝날 때까지 응답이 블로킹되니, 사용자가 버튼을 누르고 몇 초씩 기다려야 했음.

    성과 API 응답속도 약 80% 개선.

    • @TransactionalEventListener 기반 이벤트 발행 방식으로 이메일 발송 로직을 분리해 추후 수평 확장에 유리한 구조 확보
    • 이벤트 핸들러만으로는 메일 발송 로직이 별도 스레드에서 실행되지 않고 블로킹됨을 확인
    • @Async 어노테이션으로 메일 발송을 별도 스레드에서 실행
  • 소비 내역 복수 조회 시 발생하는 N+1 문제 개선

    문제 소비 내역을 목록으로 뽑을 때마다 JPA가 카테고리를 건마다 따로 조회하고 있었음.

    성과 목록 조회 쿼리 N+1 → 1로 감소. Hibernate 쿼리 횟수 검증 테스트로 재발 방지.

    • QueryDSL fetchJoin 적용으로 쿼리 횟수 개선
    • Hibernate 실행 쿼리 횟수 검증 테스트 작성으로 N+1 문제 재발 방지 보장
Opensource Contribution

TypeORM

Typescript / Javascript 기반 ORM 라이브러리

  • fix: Migration시 collation 변경을 감지하지 못하는 문제 수정 Merged

    배경 로컬-프로덕션 환경 간 컬럼 Collation 차이로 비교 연산 오류가 발생해 Migration으로 고치려 했으나, TypeORM Migration이 Collation 변경을 감지하지 못함을 확인

    • Migration의 Collation 변경 미감지 문제가 이미 오래전 보고된 이슈임을 확인
    • Collation을 detection 범위에 추가하고 검증 테스트 작성
  • upsert 시 부분 업데이트를 제어하는 updateOnly 옵션 추가 Reviewing

    배경 TypeORM EntityManager가 upsert 충돌 처리 시 업데이트 대상을 세밀하게 제한하는 옵션을 제공하지 않음

    • UpsertOptions에 updateOnly 옵션을 추가해 업데이트 허용 컬럼을 화이트리스트로 지정하도록 설계 및 구현
    • Postgres 등 드라이버별 엣지 케이스 보정과 검증 테스트까지 포함해 PR 작성

NestJS

Node.js 기반 서버사이드 프레임워크

  • fix: 종료 라이프사이클 훅에서 일부 Provider 실패 시 나머지 정리 로직이 스킵되는 문제 수정 Merged

    배경 종료(shutdown) 시 라이프사이클 훅 중 하나라도 reject되면 Promise.all이 즉시 실패해, 나머지 Provider와 이후 모듈의 정리 로직이 조용히 스킵되는 문제 발견

    • 세 종료 훅의 Promise.all을 Promise.allSettled로 교체해 일부 실패와 무관하게 나머지 정리가 계속 진행되도록 수정하고, 실패한 훅은 Logger.error로 로깅
    • fail-fast가 의도된 시작 훅(onModuleInit 등)은 변경 범위에서 제외해 기존 동작 유지
Activities

삼성 청년 SW·AI 아카데미 (비영리 교육과정)

삼성 청년 SW·AI 아카데미 [2026/01 ~ 2026/03]

Java 전공반 연수생

  • Java 기반 객체지향 교육 및 알고리즘 과정 진행
  • 이수 도중 취업으로 인한 조기 퇴소

네이버 커넥트 재단 (비영리 교육과정)

부스트캠프 웹 모바일 9기 [2024/06 ~ 2024/12]

웹 풀스택 과정 연수생

  • Javascript 기반 문제 해결 역량 향상 및 CS 지식 학습 (HTTP, Socket, Async, EventHandler, FunctionalProgramming ...)
  • 다양한 동료들과 코드리뷰, 피어 세션, 페어프로그래밍 등을 통한 협업 및 커뮤니케이션 역량 강화
  • 백엔드 개발자에게 필요한 DB 구조 및 활용 능력 학습 (인덱스 설계, 실행 계획 분석, InnoDB 동작 원리 등...)
  • 개발자를 위한 블로그 허브 Denamu 프로젝트 팀장 및 백엔드 개발

멋쟁이 사자처럼 대학 (연합 동아리)

영남대학교 11기 ~ 12기 [2023/02 ~ 2024/12]

11기 : 백엔드 트랙 부원 / 12기 : 백엔드 트랙 운영진

  • [11기] Python django 기반 백엔드 개발 교육 이수
  • [11기] 청각 장애인을 위한 자막 공개 입찰 서비스 HSB 백엔드 개발 및 해커톤 참여
  • [12기] 백엔드 세션 Java / Spring Boot 기반 백엔드(Web, DB, JPA, 배포 자동화) 강의 자료 제작 및 오프라인 강의 진행
  • [12기] 멘티 프로젝트 진행간 멘토링 수행
  • [12기] 동아리 운영을 위한 여러가지 의사결정 진행
  • [12기] 최종 해커톤에 멘토로 참여하여 개발간 발생하는 여러가지 상황들 멘토링 수행

영남대학교 - 에스엘 주식회사 (산학협력 활동)

RPA 실무 교육 및 현업 과제 [2023/12 ~ 2024/02]

정보보안팀 / 과제 수행인

  • 에스엘 주식회사와 영남대학교 협력 프로젝트인 RPA 프로젝트에 참여
  • Microsoft PowerAutomate, Web Automation, Python, Javascript, VBScript 활용 사내 재무팀의 문서 작업 자동화 솔루션 과제를 담당하여 요구사항 이해, 설계, 제작, 운영 및 유지보수 수행
  • 사내 SAP, 고객사 ERP 솔루션 기반 조회 재무 데이터 다운로드 자동화 및 엑셀 문서 생성 자동화
  • 작성된 작업 문서 자동 메일 전송 프로세스 및 예외 시스템 오류 감지 알림 파이프라인 설계
  • 프로젝트 수행 결과, 기관 평가에서 최고 등급 달성 및 최우수 포상금 수여
Award & Certificate & Education

Award

대구광역시 공공데이터 활용 경진대회

2023년 / 아이디어 부문 - 최우수상

  • 공공데이터(선거 공약 데이터)를 활용하여 선거 공약을 그림으로 보여주는 AI 서비스 기획 및 프로토타입 출품
  • 공공데이터를 fetch하고, 데이터 기반 AI 이미지 생성 API 호출하여 결과값을 분류하여 저장하는 배치 프로세스 설계
  • 대구광역시 최우수상 수상 및 전국 대회 출전

Certificate

TOEIC Speaking

영어 회화 능력 시험 / Advanced Low (160)

정보처리기사

2025년 정기 기사 3회

Education

영남대학교 (졸업 / 23-03 ~ 26-02)

컴퓨터 공학과 / 학사 / 전공 평균 3.7 / 4.5

대구대학교 (중퇴 / 19-03 ~ 23-02)

컴퓨터 소프트웨어 학과 / 학사 / 전공 평균 4.3 / 4.5