Logo
Projects 목록으로

Project Detail / 프로젝트 상세

IT'S SMI

Blog & Portfolio Site

개인 블로그 및 포트폴리오 사이트입니다.

IT'S SMI preview

Focus / 작업 초점

Full-stack / Portfolio / Content

Core Problem / 핵심 문제

포트폴리오, 블로그, 개발 기록을 하나의 서비스로 구성

Stack / 주요 기술

Next.js, NestJS, TypeScript, Tailwind CSS, Supabase

Overview / 프로젝트 소개

IT'S SMI는 개인 블로그 및 포트폴리오 사이트입니다. Next.js 프론트엔드와 NestJS API 서버를 분리해 포트폴리오, 프로젝트 상세, 블로그 콘텐츠 작성/조회 흐름을 직접 운영할 수 있도록 구성했습니다.

Focus / 작업 초점

Next.js 기반 포트폴리오/블로그 화면과 상세 페이지 구조 구현
NestJS 기반 posts/categories/tags/images API 구현
Supabase Auth, Database, Storage 연동 및 관리자 작성 흐름 구성

Motivation / 개발 목적

개인 도메인을 가진 나만의 사이트를 만들고 싶다는 생각에서 시작했습니다.
회사에서 적용해보지 못했던 다양한 웹 신기술을 실험하고 적용하기 위해 제작했습니다.
개발 과정에서 겪는 트러블슈팅 경험과 개발 일지를 기록하고 공유하기 위한 공간으로 구성했습니다.
정적 소개 페이지를 넘어 직접 글을 작성하고 발행할 수 있는 콘텐츠 운영 구조를 만들고자 했습니다.

Architecture / 전체 구조

Frontend

Next.js App Router 기반의 포트폴리오, 프로젝트 상세, 게시글 목록/상세, 관리자 작성 화면을 담당합니다.

Backend

NestJS 서버로 posts, categories, tags, images API와 SupabaseService를 구성해 데이터 접근을 담당합니다.

Supabase

Auth, Database, Storage를 제공하며, 서버는 사용자 토큰을 전달받아 권한이 필요한 요청을 처리합니다.

Implementation / 주요 구현

게시글 목록/상세 화면은 Next.js에서 NestJS API를 호출해 렌더링합니다.
관리자 작성 화면은 인증된 관리자 요청만 게시글 저장/발행 API를 사용할 수 있도록 구성했습니다.
게시글 작성 중 제목/본문/태그 변경을 감지하고 debounce 기반 자동 저장 흐름을 구성했습니다.
게시글 발행/비공개, 공개 목록과 관리자 목록 조회를 분리했습니다.
게시글 저장 시 태그 생성과 연결 관계를 서버에서 일관되게 동기화했습니다.
이미지 파일은 서버 검증을 거친 뒤 Storage에 업로드되도록 구성했습니다.

Tech Decisions / 기술 선택

Next.js

App Router 기반으로 포트폴리오, 프로젝트 상세, 블로그 목록/상세 화면을 구성하고 서버 렌더링 데이터 조회 흐름을 만들었습니다.

NestJS

posts, categories, tags, images를 모듈 단위 API로 나누고 DTO 검증과 Supabase 연동을 백엔드 계층에서 처리하기 위해 사용했습니다.

TypeScript

프론트엔드와 백엔드를 같은 타입 기반 언어로 구성해 API 데이터 흐름과 관리 화면 구현의 안정성을 높였습니다.

Tailwind CSS

포트폴리오와 블로그 UI를 빠르게 구성하고 모바일/데스크톱 반응형 레이아웃을 일관되게 관리하기 위해 사용했습니다.

Supabase

Auth 토큰 기반 관리자 요청, 게시글/카테고리/태그 데이터 조회, Storage 이미지 업로드를 담당하는 데이터 기반으로 사용했습니다.

Retrospective / 배운 점

개인 사이트를 직접 운영하면서 포트폴리오, 블로그, 관리자 작성 도구를 하나의 서비스 흐름 안에 배치하는 경험을 쌓았습니다. 백엔드를 NestJS로 구성하면서 프론트엔드와 같은 TypeScript 기반으로 API 계약과 데이터 흐름을 맞추기 쉬워졌고, Supabase를 데이터 계층으로 두면서 인증, DB, 이미지 저장을 작은 규모의 서비스에 맞게 연결할 수 있었습니다.