목차
😄 프론트엔드 개발자 양승찬입니다.
- “무엇이 더 나은 서비스 사용 경험을 이끌어낼까?“ 라는 질문에 대해 함께 고민해보고 이를 기술적 요소로 구현해내며 사용자 중심의 서비스로 발전 시키는 것을 선호합니다.
- “보다 나은 개발자 경험은 서비스의 사용자 경험 향상에도 기여한다“ 라는 믿음을 가지고 조직 내에서 보다 생산적인 개발 환경이 조성되도록 기여해왔습니다.
- 개발하면서 겪은 문제 상황에 대한 고민과 이를 풀어가는 과정을 기록하며 임팩트 있는 개발 경험들을 공유할 수 있도록 블로그 활동을 지속하고 있습니다.
📝 개발 경력
토스뱅크
Frontend Developer, Check Card Squad (2025.05 ~ )
매드업
디지털 마케팅 자동화 솔루션 Lever Xpert 프론트엔드 개발
Integration Engineering Team, Frontend Developer (2023.09 ~ 2025.04)
개발 환경 개선을 위한 프론트엔드 모노레포 마이그레이션
webpack swc pnpm turborepo github actions
- 기존의 환경에서는 공통 모듈들을 관리하기 위해 패키지를 제작하면 환경 구성이 까다롭고, 반복되는 빌드 시간 소요로 인하여 비효율적인 요소가 반복되었습니다. 이를 해소하고자
Turborepo기반의 모노레포로 마이그레이션 했습니다.Turbo cache을 통해 내부 패키지들의 반복적인 빌드 시간을 최소화하여 어플리케이션 전체 개발 서버 구축 시간을 최소 5초 이내로 단축시켜 개발 생산성 향상에 기여했습니다.github actions환경에서의 빌드, 타입 체크 및 테스트 과정 시의 소요시간을Turbo cache를 이용해 최소화 하여 1분 내외로 전체 모노레포 코드의 지속적인 통합이 가능하게 했습니다.- 패키지 환경 구성 시간을 최소화 하고자 코드 제너레이터를 CLI 형태로 사용할 수 있게 제작하여 누구나 3초 내외로 손쉽게 패키지 개발 및 배포 환경 구성을 완료할 수 있도록 하였습니다.
- 결과적으로 10개의 내부 공통 패키지를 기반으로 4개의 어플리케이션을 통합하는 모노레포를 구성하여 안정적인 마이크로 프론트엔드 환경을 운영할 수 있도록 하였습니다.
공통 디자인 시스템 개발
vite vitest storybook vanilla extract radix primitive changeset chromatic
styled components이용시 조건부 렌더링 시 복잡한 코드가 반복되고 props에 대한 타입 정의시의 번거로움으로 인해 개발 생산성이 저하되는 등 여러 문제가 있었습니다.이를 개선하고자 팀원들을 설득해vanilla extract을 활용하는 방식으로 전환하였습니다.- 원시 컴포넌트를 기반으로 높은 확장성과 생산성을 가지는 디자인 시스템을 구성했습니다.
sprinkles를 기반으로한atomic css기법을 적용하여 코드의 중복은 최소화 하면서도 스타일링 로직을 인라인 형태로 빠르게 작성할 수 있도록 하였습니다.- 다형성 컴포넌트 패턴을 적용하여 같은 스타일링을 여러 태그에서도 사용할 수 있게 했습니다. 이러한 요소들을 Box라는 원시 컴포넌트로 추상화하여 높은 재사용성을 보장하고 다른 고차원의 컴포넌트 제작에도 쉽게 활용되도록 하였습니다.
- 디자인시스템의 규모가 커짐에 따라 사용하는 어플리케이션 번들사이즈가 불필요하게 커지는 문제가 발생했습니다. 이를 해소하고자 디자인 시스템이 사용하는 컴포넌트만
import될 수 있게 만들었습니다.rollup의preserveModule옵션을 설정해 모듈구조를 유지하며 빌드될 수 있도록 하였습니다. 또한 번들러의 정적 모듈 구조 분석이 보다 잘 되도록sideEffect와 순환 import를 하는 코드들은 제거하였습니다.- 이를 통해
treeshaking이 되도록 만들어내면서 app의 번들사이즈를 낮추는데 기여했습니다.
actions와chromatic을 이용해 PR 마다storybook을 자동으로 배포 및 공유하도록workflow를 구성하여 컴포넌트에 대한 개발자의 리뷰 경험을 향상시키는데 기여했습니다.- 다양한 인터페이스 요구사항들을 안정적으로 처리할 수 있는 57개의 컴포넌트들이 갖추어져 있으며 3개의 서로 다른 웹서비스에서 같이 사용되는 공통 디자인 시스템으로 발전시켰습니다.
아이콘 에셋 라이브러리 개발
rollup babel svgr github actions storybook
- 기존의 경우 사용하지 않는 에셋도 같이
import되는 문제가 있었습니다. 이를 해결하고자rollup의manualChunks를 활용해 트리셰이킹이 적용되는 라이브러리를 제작하여 사용되는 아이콘 에셋만 불러올 수 있도록 하였습니다. - 아이콘 에셋의 변경 사항을 반영하는데 있어서 개발자가 직접 에셋을 추가하고 버전을 관리하는 일련의 과정들이 무수히 많이 반복되었습니다. 이를 해소하고자 에셋 업로드부터 패키지 업데이트 및 배포 까지 이어지는 일련의 과정들을 자동화하였습니다.
figma api와github action을 이용하는workflow를 매일 실행되도록 하여 피그마 내 아이콘 에셋의 업데이트 내역을 불러오고 이를 커밋으로 추가하는 PR을 자동으로 생성하게 했습니다.- 이러한 자동화를 통해 개발자의 불필요한 리소스 투입 및 디자이너와의 소통으로 인한 시간을 최소화하여 조직의 생산성 향상에 기여할 수 있었습니다.
마이크로프론트엔드 웹 어플리케이션 개발
webpack vite react react query react hook form zustand ky
- 데이터를 조회하는데 있어서 사용자가 검색 및 필터링 시 새로운 데이터를 불러와 로딩 화면으로 바뀌는 UI로 인해 사용자 경험이 저해되는 문제가 있었습니다. 이를 해소하고자 상태 업데이트의 우선순위를 조정해 보다 고도화된 인터페이스로 개선하였습니다.
- 검색 및 필터링 상태 업데이트 로직에
transition을 적용해 상대적으로 비동기 상태의 우선순위는 높여 로딩 상태로의 전환없이 매끄러운 형태로 데이터를 볼 수 있도록 개편하였습니다.
- 검색 및 필터링 상태 업데이트 로직에
- 테이블에서 다량의 데이터를 보여주는 UI 에서 너무 많은 컬럼의 개수로 인하여 스크롤 시 버벅이는 현상이 있었습니다. 이를 해소하고자 테이블에 가상화 기법을 적용해 렌더링 성능상 병목이 있는 부분을 최적화해 사용자의 데이터 분석 시의 경험을 향상시키는데 기여했습니다.
- 즐겨찾기 기능에서 빠른 응답을 통해 사용자 경험은 향상시키고 불필요한 api 반복 호출을 줄이기 위해 react query의 cache를 이용한 낙관적 업데이트 기능을 적용하였습니다.
- 사용자 입력값에 대한 유효성 및 에러 로직을 다루는 코드가 다소 복잡하고 관리하기 어려운 측면이 있었습니다. 이를 위해 팀원들을 설득해
react hook form을 도입하는 방식으로 개편하였습니다.useForm훅에서 제공되는 추상화된 상태를 사용함으로써 에러 및 유효성 상태를 정의하고 이를 제어해야 했던 반복적인 로직의 코드들을 제거할 수 있었습니다.- 동일한 형태로 여러개를 입력받아야 하는 필드들은
useFieldArray를 이용해 처리하여 필드의 추가 및 삭제로 인해 복잡했던 상태관리를 보다 단순하게 처리할 수 있었습니다. - 이를 통해, 사용자 입력값에 대한 다양한 요구사항들을 구현하는데 있어서 복잡도는 낮추고 코드의 일관성도 높여 전체적인 코드의 유지보수성을 높이는데 기여할 수 있었습니다.
webpack module federation을 이용해 9개의 리모트 앱을 런타임에 통합하는 마이크로 프론트엔드 어플리케이션을 구성하고 운영하였습니다.
🗂️ 프로젝트
개발 블로그
모노레포와 디자인 시스템을 관련 내용을 학습하며 만든 블로그 프로젝트 (2024.01 ~ 2024.06)
Next(v14) Notion API vanilla extract turborepo zapier
- 노션에 업로드 된 이미지는 1시간 이내로 만료되는 문제가 있어 블로그에서 이미지가 제대로 서빙되지 못하는 문제가 있었습니다. 이를 해결하고자 노션 이미지를 외부 저장소에 저장하는 프로세스를 도입하였습니다.
- 블로그 빌드 시점에 노션 이미지를 외부 저장소의 이미지로 변환하는 로직을 추가하여 노션 에디터의 편리한 이미지 업로드 경험은 살리면서도 이미지들이 영구적으로 보존되게 했습니다.
- 블로그 빌드 시점에 노션 이미지를 외부 저장소의 이미지로 변환하는 로직을 추가하여 노션 에디터의 편리한 이미지 업로드 경험은 살리면서도 이미지들이 영구적으로 보존되게 했습니다.
- 노션 페이지 수정 시점에
revalidation을 진행하는NextJSroute API을 호출하도록 하는 프로세스를webhook으로 연동하여 정적 컨텐츠가 자동으로 업데이트 될 수 있게 했습니다.
- 노션 페이지 수정 시점에
- 향후 추가적인 어플리케이션 개발에 용이할 수 있도록 모노레포를 도입하여 블로그 앱과 디자인 시스템 패키지 및 아이콘 패키지를 독립된 형태의 레포지토리로 개발하였습니다.
먹팟
직장인들의 점심시간을 네트워킹의 기회로 만들기 위한 커뮤니티 서비스 (2023.05 ~ 2023.08)
Next(v13) react query vitest testing library react hook form
- 모달, 토스트 등
overlay영역에 띄워지는 컴포넌트들을 보다 쉽게 사용할 수 있는 공통 훅을 만들어 가독성과 생산성을 높였습니다. - 기존에 흩어져 있던 비동기 상태 관련
query로직들을 관심사 별로 묶는 형태로 바꾸어 사용성과 가독성이 높은 코드로 발전시켰습니다. - 단위 테스트 환경을 구성하고 이를 자동화해 검증 가능한 비즈니스 로직을 작성하도록 하였습니다.
🎓 교육
성균관대학교
소프트웨어대학 소프트웨어학과 졸업
2017.03 ~ 2023.08
네이버 커넥트재단 부스트캠프
7기 웹풀스택 과정 수료
2022.06 ~ 2022.12