성공적인 프로젝트 경험을 통해 문제 해결 능력과 협업 역량을 키워왔습니다.
PickRoad는 블로그, 유튜브 등의 링크를 주제별로 큐레이션해 로드맵 형태로 공유할 수 있는 웹 서비스입니다. Next.js의 Server Action과 SSR을 활용해 서버 중심의 데이터 흐름을 구성하고, Drizzle ORM과 PostgreSQL로 기본적인 데이터 모델링과 CRUD 작업을 직접 구현했습니다.
특정 주제에 대한 다양한 링크(블로그, 유튜브, 자료 등)를 한곳에 모아 보기 좋게 정리하고 공유하고 싶을 때, 매번 새 글을 작성하는 번거로움을 줄이고자 했습니다. 링크만으로도 큐레이션된 공유 페이지를 만들 수 있는 도구의 필요성을 느껴 개발했습니다.
기술적인 측면에서는 Next.js Server Action 및 SSR 실습하면서, 실제 서비스 수준의 데이터 흐름을 구현하며 React Query 없이 모든 데이터 흐름을 SSR과 서버액션 기반으로 처리하여 서버 중심 아키텍처 경험을 쌓는 것을 목표로 했습니다.
Next.js의 App Router 환경에서 서버 액션을 활용해 로드맵의 생성, 수정, 삭제 기능을 구현했습니다. API 라우트를 별도로 두지 않고, 클라이언트에서 직접 서버 함수를 호출하는 구조로 간결하고 일관된 데이터 흐름을 만들었습니다.
Next.js SSR과 쿼리스트링 연동 시 발생하는 UX적 부자연스러움을 해결하기 위해 프레임워크 렌더링 과정을 분석하고, React의 useTransition, useOptimistic 등 최신 Hook을 학습하고 활용했습니다.
링크를 입력시 서버 액션으로 Open Graph 메타데이터를 수집한 뒤, 자동으로 링크 입력 필드를 추가합니다. 이 동적 폼은 react-hook-form의 useFieldArray로 구성되며, 생성/삭제뿐만 아니라 순서 변경까지 지원합니다. 정렬은 DnDKit과 Motion을 사용하여 드래그 시 자연스러운 애니메이션으로 처리했습니다.
서버 액션을 통해 Presigned URL을 발급하고, 클라이언트에서 해당 URL로 직접 업로드하도록 구성했습니다. 이를 통해 서버 사이드에서의 업로드 용량 제한을 피하면서, Cloudflare R2로 안정적으로 파일을 전송할 수 있는 구조를 구현했습니다.
온라인에 이미지를 공유하는 일이 많아진 요즘, 의도치 않게 개인정보나 민감한 내용이 노출되는 경우도 잦아졌습니다. Maskit(마스킷)은 이런 상황에서 간단하게 민감한 영역을 가릴 수 있는 도구가 있었으면 좋겠다는 생각에서 출발한 프로젝트입니다.
복잡한 UI를 구현할 때 DOM 상태를 직접 제어하는 방식에 한계를 느꼈고, 상태 기반으로 UI를 선언적으로 구성할 수 있는 React의 방식에 매력을 느껴 이를 실제로 적용해 보기 위해 프로젝트를 시작하게 되었습니다.
사용자가 업로드한 이미지를 Canvas에 렌더링한 후, 드래그 마스킹 또는 이모지를 이용해 시각적으로 가릴 수 있도록 구현했습니다. 마스킹된 결과는 이미지 형태로 다시 추출할 수 있도록 처리했습니다.
복잡한 Canvas 조작 상태를 Jotai로 체계적으로 분리해 관리함으로써, 동작 흐름을 간결하게 구성했습니다.
Google Drive, Dropbox 클라우드 서비스와 연동하여, 사용자가 저장된 이미지를 선택해 불러올 수 있도록 구현했습니다.
다국어 처리, 단축키 지원, 복사 및 붙여넣기 등의 사용자 편의 기능을 구현했습니다.
Tesseract.js가 반환하는 텍스트 인식 결과(좌표)를 활용해, 위치와 스케일 보정을 거쳐 캔버스에 정확하게 시각화했습니다.
Taskify는 일정 관리 기능을 지원하는 웹 애플리케이션입니다. 초대 기능을 활용하여 다른 사용자와 일정 관리를 공유할 수 있습니다. 다른 사람들과 일정을 공유하여 성공적으로 Task를 해결할 수 있습니다.