Skip to main content Link Search Menu Expand Document (external link) Copy Copied

사색하는 개발자, 양지수 입니다.

백엔드 개발자

Last updated: 2025.05.13

Contact


Skill.

Back-End
  • Java, Swift
  • Spring Boot, Spring MVC, Spring Security, Electron
  • Spring Cloud (Eureka, Gateway, OpenFeign, Config, Circuit Breaker)
  • Spring Data JPA, Querydsl, Hibernate, MyBatis
  • PostgreSQL, MySQL, MariaDB, Oracle, Redis
  • Apache Kafka
  • Gradle, Maven
DevOps
  • AWS Route53, S3, EC2, ECS, ECR, RDS
  • Docker Compose
  • GitHub Actions
Front-End
  • Javascript
  • SwiftUI, HTML/CSS

Introduce.

분석적 사고와 체계적인 업무 관리를 추구하는 개발자입니다.

  • 최근 부트캠프 팀 프로젝트에서는 짧은 개발 기간 내에 업무를 세분화하고, 기간별로 작업을 배분하여 목표를 효과적으로 달성했습니다.
  • 철저한 문서화를 통해 기억력의 약점을 보완함과 동시에 팀 내 불필요한 소통 오류의견 충돌을 줄여, 보다 유의미한 논의가 이루어질 수 있도록 기여했습니다.

  • 다양한 시각에서 문제에 접근하여 잠재적 리스크변수를 사전에 충분히 고려함으로써, 협업 과정에서 발생한 문제를 신속하게 진단하고 개선 방향을 제시할 수 있었습니다.


앞으로도 기술적 역량도메인 경험을 쌓아 사용자에게 실질적인 가치를 제공하는 서비스를 개발하며 꾸준히 발전해 나갈 것입니다.


더 자세한 소개

저는 이런 개발자입니다.

저는 겉으로 드러난 현상만 보지 않고, 그 이면에 무엇이 더 있는지를 끊임없이 관찰하고 분석하며 깊이 상상합니다. 단순히 문제를 해결하는 것이 아니라, 왜 그런 문제가 생겼고, 다시 발생하지 않으려면 무엇을 바꿔야 하는지를 고민합니다.

그런 점에서 개발은 제게 단순한 직무가 아니라, 일상 속 불편함을 해결하고, 아이디어를 현실로 구현하는 가장 현실적인 방법이라고 느꼈습니다. 관찰과 사색이 아이디어로 이어지고, 그것이 실체화되는 순간만큼 가슴 설레는 일은 없는 것 같습니다.

개발은 이렇게 시작했습니다.

유년기부터 컴퓨터와 가까이 지내며 자랐고, 디지털 변화의 한가운데에서 성장해왔습니다. 중학교 시절, 스티브 잡스가 아이폰을 처음 발표하던 프레젠테이션을 보고 강한 충격을 받았습니다. 상상도 못 한 무언가로 사람들의 삶을 바꾸는 모습을 보며, 언젠가는 나도 ‘그런 무언가를 만드는 사람’이 되고 싶다는 꿈을 품게 되었습니다.

처음에는 디자인으로 시작해 프리랜서로 활동하며 사용자 경험을 고민했고, 팀 프로젝트를 기획하면서 자연스럽게 커뮤니티와 웹 서비스를 만들고 싶다는 바람이 생겼습니다. 그 과정에서 팀의 개발자가 이탈하면서 직접 PHP와 JavaScript를 수정하게 됐고, 한 줄을 고치기 위해 10시간 넘게 밤을 새우기도 했지만, 결국 해결했을 때의 성취감은 아직도 잊히지 않습니다. 그 경험을 계기로 ‘만들고 싶은 걸 직접 구현할 수 있다면 더 많은 것을 발명할 수 있겠다’는 생각이 들었고, 결국 본격적으로 개발자의 길을 걷기로 마음먹게 되었습니다.

이후 Java와 백엔드 기술을 중심으로 공부를 시작했고, 실제로 개발을 진지하게 배우면서 철학적이고 논리적인 구조와 이론에 매료되기도 했습니다. 취업에서의 시행착오와 학력에 대한 편견을 마주하면서도 자발적으로 팀을 이끌고, 기록하고, 함께 성장해나갔습니다. 그래서 지금은 개발을 단순한 기술로 보지 않고, 문제를 이해하고 구조를 설계하며, 협업과 커뮤니케이션까지 포함해 하나의 ‘과정’으로 받아들이고 있습니다.

저는 여전히 “사람들에게 의미 있는 무언가를 만들고 싶다”는 그 마음을 가지고 있고, 합리적이고 논리적인 것을 좋아하는 제 성향이 개발이라는 일과도 잘 맞닿아 있다고 느낍니다. 그래서 저는 개발자가 꼭 되어야 한다고, 그리고 잘할 수 있다고 확신합니다.

이런 문제를 해결해봤습니다.

최근 맡았던 알림 도메인은 처음엔 단순히 Slack DM을 전송하는 수준이었지만, 서비스가 확장되며 다양한 구조적 문제가 드러나기 시작했습니다.

유사 API의 중복, 하드코딩된 메시지, 과도한 서비스 책임 분산 등은 유지보수성과 신뢰성을 떨어뜨리고 있었습니다.

저는 중복된 API를 단일 통합 API로 추상화하고, 메시지 템플릿은 DB 기반으로 분리하여 관리 효율을 높였습니다.

또한 전처리, 템플릿 바인딩, 히스토리 저장, 메시지 전송을 각기 독립된 서비스로 분리하고, Kafka 기반 이벤트 처리 구조를 도입해 흐름을 재구성했습니다.

중요한 알림 누락에 대비해 Fallback 이메일 발송 기능을 추가하고, 설정 서버를 통해 가용성과 유연성도 개선했습니다.

이 경험은 단순 기능 구현을 넘어, 시스템 전반을 개선하며 복잡한 문제의 본질을 파악하고 해결하는 역량을 키운 의미 있는 프로젝트였습니다.

이렇게 협업합니다.

같은 프로젝트에서 저는 Notion을 활용해 업무 분배와 문서 정리를 주도했습니다. 기획이나 설계 내용을 함께 논의한 후, 명세서·가이드·구조도 형태로 다듬어 GitHub Wiki에 올려 공식 기준처럼 활용했습니다.

기능 우선순위나 담당자, 데일리 스크럼 기록 같은 내용을 문서로 남긴 덕분에, 누구나 항상 현재 상황을 파악할 수 있었고, 작업 리마인드나 협업 진행이 훨씬 수월했습니다.

특히 Git 브랜치 전략, 커밋 컨벤션, 네이밍 룰, 테스트 환경 설정 같은 반복적으로 혼란을 주는 요소들은 문서로 정리해두고, 코드 리뷰나 QA에서도 쉽게 참조할 수 있도록 했습니다.

복잡한 설정이나 기술 흐름은 담당자가 직접 작성하고 공유하도록 했고, 각자 경험한 문제나 학습한 내용도 정리하며 자연스럽게 공유 문화가 생겼습니다.

작업 진행 중에도 정리한 내용을 기준 삼아 소통하는 일이 많았고, 명확한 기준과 구조를 공유하는 일이 생각보다 팀의 생산성에 큰 영향을 준다는 걸 느꼈습니다. 개발자에게 왜 소통을 중요하게 생각하는지를 실감할 수 있었던 계기가 된 것 같습니다.

저는 이렇게 일합니다.

문제를 마주할 때, 왜 이 일이 발생했는지를 이해해야 정확한 대처가 가능하다고 생각합니다. 그래서 기능 요구나 상황의 배경을 먼저 파악하여 정리한 뒤, 그중 가장 빠르게 구현할 수 있는 방법을 선택하는 편입니다. 처음부터 높은 완성도를 갖추고 싶어 하지만, 현실적인 일정 안에서는 일단 틀을 잡고, 유지보수에 유리하도록 구조를 설계해 기한 내 마무리한 뒤, 여유가 생기면 열어두었던 더 나은 방법으로 보완해나가는 쪽이 낫다는 것을 배웠습니다.

기억력이 좋은 편이 아니라 메모와 문서화를 일상처럼 하고 있고, 이것이 팀 협업에서도 큰 도움이 된다는 것을 여러 번 느꼈습니다.

말로만 공유되던 내용을 기준으로 정리해두면 반복적인 확인이나 오해를 줄일 수 있고, 다른 팀원이 작업할 때 기준점이 되어 협업도 훨씬 수월해졌습니다.

협업에서는 의견을 분명하게 표현하되, 먼저 팀원들의 생각을 충분히 듣는 걸 중요하게 생각합니다. 존중을 바탕으로 논의가 이루어질 때, 더 빠르게 합의점에 도달할 수 있다고 느꼈습니다. 중간 점검을 통해 팀원의 상황이나 진척도를 보고 배분을 조정하기도 했고, 해결이 어려운 문제는 논리적인 토론을 통해 팀의 의견을 하나로 정하기도 했습니다.

지금까지의 경험을 돌아보면, 그때그때 최선이라 생각한 방식을 습관으로 남기려 했던 것 같습니다. 앞으로도 더 나은 방법이 있다면 배우고 바꿔나가며, 더 나아지려고 할 것입니다. 저는 이런 꾸준한 개선을 향한 태도가 제 강점이라고 생각합니다.


Project Experience.

레스토랑 예약 및 웨이팅 서비스

: BobJool

회고

GitHub

PPT

브로셔

소개 레스토랑 예약 및 웨이팅을 위한 온라인 서비스
인원 백엔드 개발자 5명(부팀장)
사용기술
  • Java, Spring Boot
  • Spring Security, JWT
  • Spring Cloud (Eureka, Gateway, OpenFeign, Config, Circuit Breaker)
  • JPA, QueryDSL, PostgreSQL, Redis
  • Apache Kafka, Redis Streams
  • Docker Compose, GitHub Actions
  • AWS (ECR, EC2, RDS)
  • Prometheus, Grafana, Redis-exporter, Zipkin
  • Junit5, JMeter

주요 역할

  • 핵심 서비스인 예약과 웨이팅에서 처리되는 작업과 연결되는 알림 도메인을 구축하여, 사용자에게 편리하게 진행 상황을 전달
  • 발송 내역을 저장하고 QueryDSL 기반의 동적 검색 기능을 도입하여, 운영 시 원하는 알림 내역에 신속하게 접근 가능
  • OpenFeign을 활용한 마이크로서비스 통신 구현으로, 개발 기간 단축과 유지보수성을 향상
  • 발송 시점과 데이터 최신화 간격을 줄이는 작업을 통해, 오발송 문제를 최소화하였습니다.
  • Slack 장애 발생 시 이메일 자동 fallback 처리를 적용하여, 미발송 문제를 완전히 해소하였습니다.


트러블 슈팅 및 고민

알림 메시지 템플릿 고도화
  • 문제
    메시지 템플릿이 코드에 하드코딩되어 메시지 수정 시마다 코드 변경과 재배포가 필요해 운영 효율성이 저하되었습니다.
  • 해결
    데이터베이스 고도화를 통해 템플릿과 데이터를 별도로 분리하여 관리하고, 설정 파일을 활용해 템플릿 ID 매핑 정보를 config 서버에서 외부로 관리함으로써, 코드 변경 없이도 메시지 템플릿의 수정이 가능하고 알림 종류 추가 시에도 용이하도록 개선하였습니다.
통합 API 도입을 통한 RESTful 설계 준수 및 알림 발송 프로세스 효율성 극대화
  • 문제
    동일 기능을 수행하는 약 10개의 중복 API로 인해 RESTful하지 않은 설계가 발생했고, 각 역할을 별도의 API로 구현하면서 서비스 간 의존성과 중복 로직이 증가하여 코드 복잡성과 네트워크/인프라 비용이 심화되었습니다.
  • 해결
    단일 통합 API를 도입해 알림 발송 목적과 메시지 데이터를 HTTP Body로 전달받고 내부적으로 각 역할을 모듈화함으로써 RESTful 규약을 준수하며 API 관리 효율성, 코드 재사용성, 유지보수성을 개선하여 전체 알림 발송 프로세스의 효율성과 안정성을 극대화하였습니다.
대규모 트래픽 처리 개선
  • 문제
    단일 통합 API는 동기식 HTTP 요청에 의존하여 트래픽 급증 시 병목 현상과 알림 발송 실패, 데이터 누락 문제를 야기했습니다.
  • 해결
    Kafka 기반의 비동기 메시지 처리 시스템을 도입하여 알림 발송 작업을 메시지 큐로 분산시키고, 이를 통해 대규모 트래픽 상황에서도 안정적이고 일관된 처리를 달성하였습니다.
OpenFeign 인코딩 이슈 해결
  • 문제
    Slack API를 사용해 이메일로 유저 정보를 조회하려 했지만, {“ok”:false,”error”:”invalid_auth”} 오류가 발생했습니다. OpenFeign을 이용한 HTTP 통신은 IntelliJ .http 테스트에서는 정상적으로 동작했으나, 실제 환경에서는 동일한 문제가 재현되었습니다.
  • 해결
    HTTP Body를 통해 데이터를 전달하도록 수정하고, Feign Client 설정에서 기본적으로 지원되지 않는 application/x-www-form-urlencoded 인코딩을 위해 Spring Form Encoder를 Bean으로 등록하였습니다. 또한, DTO 대신 Map<String, String>을 사용하여 직렬화 문제를 해결한 결과, Slack API에서 정상적으로 Slack ID를 응답받을 수 있었습니다.
Kafka 메시지 미수신 이슈 해결
  • 문제
    Kafka 토픽에 메시지를 추가했음에도 불구하고, 알림 서버에서 JSON 메시지의 Map 바인딩 과정에서 문자열-숫자 타입 매핑 에러와, 전송된 JSON 문자열과 수신 시 이스케이프 문자가 포함된 문자열 간 불일치로 인한 역직렬화 실패가 발생하여 알림 누락 및 데이터 불일치 현상이 나타났습니다.
  • 해결
    Kafka 메시지를 NotificationDetailsFactory에서 전처리하여 양 끝의 따옴표와 이스케이프 문자를 제거한 후, 이를 JSON으로 역직렬화하여 모든 값을 문자열로 변환한 Map으로 재구성하였습니다. 이 메타데이터를 NotificationDetails 객체로 생성해 활용함으로써 문제를 해결하였습니다.
Resilience4j 및 서킷브레이커 예외 미감지 해결
  • 문제
    Kafka 에러 핸들러가 예외를 가로채 서킷브레이커까지 예외가 전달되지 않아, AOP 기반 서킷브레이커가 정상적으로 작동하지 않았습니다.
  • 해결
    Kafka 리스너 컨테이너를 제어하는 KafkaManager를 도입하여, 서킷브레이커 상태 전환 시 컨테이너를 일시 중단하거나 재개하도록 처리했고, Slack 메시지 발송 시 실패하면 fallback으로 이메일 발송 로직을 직접 호출하여 안정적인 장애 대응을 구현하였습니다.


물류 관리 및 배송 서비스

: FlowMesh

회고

GitHub

PPT

소개 B2B 물류의 효율적 운영을 위한 허브 중심 배송 관리 서비스
인원 백엔드 개발자 3명
사용기술
  • Java, Spring Boot
  • Spring Security, JWT
  • Spring Cloud (Eureka, Gateway, OpenFeign, Config, Circuit Breaker)
  • JPA, PostgreSQL
  • Swagger

주요 역할

  • 사용자와 토큰 관련 API 구현
  • MSA 환경의 사용자 인증/인가 프로세스 개발
  • DDD 패키지 구조와 레이어를 반영해 의존성을 관리하여 코드의 유지보수성과 확장성 향상
  • AWS 기반 인프라 설계와 설계도를 작성하여, 클라우드 인프라의 가시성 증가


트러블 슈팅 및 고민

Swagger를 도입하여 API 문서 작성
  • 문제
    기존 API 개발에서는 문서화가 미흡해, 클라이언트와 서버 간의 응답 구조에 대한 오해가 발생하고, 디버깅 및 유지보수 시 혼란이 있었습니다.
  • 해결
    Swagger를 활용하여 @ApiResponse, @ExampleObject 등의 어노테이션으로 구체적인 예시와 샘플 값을 제공함으로써, 각 API의 응답 구조(상태 코드 및 커스텀 에러 코드, 메시지, 데이터 형식 등)를 명확하게 정의하였습니다. 추가로 인터페이스를 별도로 분리하여, 실질적인 컨트롤러 코드와 구분함으로써 코드의 가독성과 유지보수성을 향상시켰습니다.
Gateway 패턴과 JWT Security 인증/인가 도입
  • 문제
    MSA 환경에서 여러 서비스로 분산된 API 호출을 중앙에서 관리하는 것이 어려웠고, 보안 측면에서도 각 서비스에 대해 개별 인증/인가를 처리하는 방식은 비효율적이었습니다. 또한, 엑세스 토큰의 짧은 유효기간과 보안 취약점으로 인해 토큰 탈취 문제가 우려되었습니다.
  • 해결
    게이트웨이 패턴을 단일 진입점으로 도입하여 모든 요청을 중앙에서 관리하고, JWT 기반의 Security 인증/인가를 적용했습니다. 토큰을 분석하여 사용자 ID와 역할 정보를 커스텀 헤더에 담아 각 서비스에 전달함으로써, 인증 정보를 손쉽게 공유할 수 있도록 했습니다. 또한, 엑세스 토큰과 별개로 리프레시 토큰을 도입하고, 리프레시 토큰 로테이션을 적용하여 보안을 강화하고 토큰 탈취에 따른 피해를 최소화했습니다.

Other Experience.

Leadership.

크루 운영

  • 아이디어를 실현하는 프로젝트 네트워크, EGO CREW 를 2009년부터 리드하고 있습니다.
  • 총 19명의 크루원과 다양한 주제로 30번의 프로젝트 및 스터디 활동을 진행하였습니다.
  • 그 중, 8개 프로젝트에서 개발을 담당하였으며, 5개의 서비스는 웹과 앱스토어에 출시할 수 있었습니다.

ETC.

애플 공인 스토어

: 제품 판매 및 고객 경험 향상

2017.07. ~ 2018.02.

  • 몇 가지 호기심을 실제로 근무하며 현장에서 데이터를 통해 답을 얻었습니다.
  • 앱과 액세서리를 활용하는 다양한 고객 관심사별 제품 사용의 최고의 경험을 꾸준히 고민함으로써, 고객 만족도가 향상했고 재방문 또는 지인 소개로 이어진 적이 있습니다.
  • 체계적인 응대 프로세스를 적용하여 20개의 매장 중 하루 매출 최고 기록(5,000만 원, 개인 비중 60%)를 달성해보았습니다.

프리랜서 디자이너

: 편집 및 웹 디자인

2015.12. ~ 2016.12.

  • 머리 속 아이디어를 시각화해보는 첫 경험이었습니다.
  • 브랜딩을 강조하는 디자인으로 다양한 분야의 클라이언트와 작업해볼 수 있었습니다.
  • 300개 이상의 카테고리에 대한 분류 및 UI를 새롭게 설계하여, 상세 페이지 도달 시간을 60% 이상 단축한 디자인으로 공기업 웹디자인 외주를 수주할 수 있었습니다.

Education.

AI를 활용한 백엔드 아키텍처 심화 과정

MSA 아키텍처 대규모 시스템 구축
팀스파르타 · 2024.10. ~ 2025.01.

K-디지털 트레이닝 단기 심화 과정 수료
Java, Spring, JPA, QueryDSL, JWT 등으로 백엔드 개발 및 AI 프로젝트 진행

  • MSA (Spring Cloud, Eureka), Redis 캐싱, Apache Kafka 스트림 처리 등 대규모 시스템 구축 경험
  • 모니터링 및 보안 코딩, 장애 대응 및 1억건 부하 테스트 실서비스 론칭 프로젝트 수행

전자정부 표준프레임워크 및 공통컴포넌트 개발자

전자정부 프레임워크 교육
한국정보화진흥원 · 2019.12. ~ 2019.12.

오프라인 교육 이수
표준프레임워크 아키텍처, 공통기반 및 데이터처리 환경 구성 경험, 모바일 표준프레임워크 개발 및 실행환경 이해

응용 프로그램 개발 및 빅데이터 분석 전문가양성 과정

웹 애플리케이션 개발
Korea IT Academy · 2019.06. ~ 2019.12.

국가기간·전략산업 직종훈련 응용SW엔지니어링(NCS) 수료

  • jQuery/JavaScript, JSP/Servlet, Java, Spring Framework, DB 모델링 및 ORM(MyBatis) 활용한 OOP, MVC, IoC/AOP 기반 개발 수행

  • 정규과정 이외의 시간에 야간과 주말 자율학습을 주도하며 교육을 통해 다른 훈련생들의 학습 발전에 기여하여 선행상 수여받았습니다.

JAVA 단과 교육

Java 기초, 실무 활용 기술 교육
Korea IT Academy · 2019.03. ~ 2019.05.
  • 기본 개념
    JVM, JRE, JDK 이해 및 변수, 형변환, 비트연산을 통한 암호화, 연산자, 제어문, 배열, 메서드, 클래스, 오버로딩, 제어자, 오버라이딩, 상속, 다형성 등 기초 문법 숙지
  • 심화 내용
    인터페이스, 추상클래스, 마커인터페이스, 예외처리, 내부/익명 클래스, API 활용, JAVA DOC, 제네릭, 컬렉션프레임워크, 소프트웨어 디자인패턴, 쓰레드, 동기화, GUI 및 파일 입출력 등 고급 기능 적용 능력 보유

컴퓨터 정보과

전반 IT 기술 교육
종로산업정보학교 · 2013.03. ~ 2014.02.

프로그래밍(C), 웹컨텐츠개발(HTML/CSS), 컴퓨터그래픽(PSD, AI), 사무관리실무(데이터베이스) 과목

  • 창업대회 동상: 스마트폰 배터리 관리를 위한 자동 취침모드/기상모드 전환, 수면유도 App 기획
  • 창의아이디어 경진대회 동상: 위치기반 사물추적을 이용한 개인의 소지품 관리를 도와주는 App 기획
  • 실기경진대회 우수상

  • 기능상: 실습시간 조교로 학우들의 실습과 설명을 보조
  • 성적우수상: 1년동안 전과목 과내 5등 이상

과학중점과정

과학, 수학 심화 교육 및 창의 융합 활동
방산고등학교 · 2011.03. ~ 2014.02.

3년간 과학, 수학 교과에서 총 교과 이수단위의 45%이상 이수

  • 과학 8과목중 7과목 이상( 물리학Ⅰ/Ⅱ, 화학Ⅰ/Ⅱ, 생명과학Ⅰ/Ⅱ, 지구과학Ⅰ/Ⅱ )
  • 수학 5과목중 4과목 이상( 수학Ⅰ / 수학Ⅱ / 확률과 통계 / 미적분 / 기하 )

  • 연간 50시간 이상의 과학체험활동을 창의적 체험활동과 연계
  • 과학융합 1과목, 과학교과 심화과목 2과목
  • 학교별 특화연구 실시