본문으로 건너뛰기
DEVKBS
작업 원장
011개인 서비스2024.02

Portfolio (2024)

Zod와 Docker를 처음 실전에 넣어 본 자리

기간
2024.02
분류
웹사이트
역할
기획·디자인·개발 단독
구성
1인
이전 포트폴리오 보기

01개요

취업 준비용으로 만든 포트폴리오 사이트입니다. 결과물보다는 그때 공부하던 것들을 실제 프로젝트에 적용해 보는 데 의미를 뒀습니다.

그때 익히던 게 Zod와 Docker였습니다. 이전 프로젝트에서 문의 폼 검증을 정규식으로 직접 짰던 기억이 있어서, 이번에는 Zod로 클라이언트와 서버를 같은 스키마로 검증해 봤습니다. Docker는 개발 환경과 배포 환경을 나눠서 구성하는 연습이었습니다.

Lottie 애니메이션을 넣었다가 성능 문제도 겪었습니다. 애니메이션 파일이 생각보다 커서 새로고침할 때마다 다시 받아 오느라 초기 로딩이 눈에 띄게 느려졌습니다. 이 문제를 해결하는 과정에서 가장 많이 배웠습니다.

devkbs는 이 사이트의 데이터를 물려받되 구조와 디자인은 전부 새로 만든 후속작입니다.

02기술 결정

문제, 선택, 결과 순서로 적었습니다.

  1. 결정 01

    검증 규칙을 한 벌만 쓴다

    문제
    이전 프로젝트에서는 클라이언트와 서버에서 각각 정규식으로 검증했습니다. 규칙이 두 벌이라 한쪽만 고치는 실수가 나기 쉬웠고, 코드도 길었습니다.
    선택
    Zod 스키마를 하나 정의하고 클라이언트 폼과 서버 처리에서 같은 스키마를 임포트해 썼습니다.
    결과
    코드가 짧아졌고, 규칙이 어긋날 여지가 사라졌습니다. 타입까지 스키마에서 뽑아 쓸 수 있다는 점이 가장 큰 이득이었습니다.
  2. 결정 02

    무거운 애니메이션 데이터를 세션에 캐시한다

    문제
    Lottie JSON이 커서 페이지를 새로고침할 때마다 다시 받아 왔습니다. 초기 화면에 있는 애니메이션이라 로딩 지연이 그대로 첫인상이 됐습니다.
    선택
    처음 받은 데이터를 Session Storage에 저장하고, 이후 로드에서는 저장된 것을 먼저 쓰도록 했습니다.
    결과
    새로고침해도 다시 받아 오지 않아서 초기 로딩이 나아졌습니다. 보기 좋은 효과에도 비용이 든다는 걸 실감했습니다.
  3. 결정 03

    개발·배포 환경을 Docker로 나눠 본다

    문제
    Docker를 학습 중이었지만 튜토리얼만으로는 실제 쓰임새가 손에 잡히지 않았습니다.
    선택
    개발용과 프로덕션용 Dockerfile을 따로 작성하고 compose로 실행 환경을 구성해 봤습니다.
    결과
    이미지 레이어와 빌드 캐시가 왜 중요한지 직접 겪어 보고 이해했습니다. 배포 환경을 코드로 남긴다는 개념도 여기서 잡혔습니다.

03주요 기능

  • Zod 기반 문의 폼

    클라이언트와 서버가 같은 스키마로 검증하고 Nodemailer로 메일을 보냅니다.

  • Lottie 애니메이션 + 캐싱

    Session Storage에 애니메이션 데이터를 캐시해 재요청을 없앴습니다.

  • Intersection Observer 스크롤 연출

    스킬 섹션이 화면에 들어올 때 순차적으로 나타납니다.

  • Weather API 연동

    현재 날씨를 가져와 화면에 표시하는 소소한 장치.

  • Docker 환경 구성

    개발용과 배포용 이미지를 분리해 구성.

04화면

Desktop

  • 01

  • 02

  • 03

  • 04

Mobile · 반응형

  • 01

  • 02

  • 03

  • 04

05회고

배우고 있는 걸 개인 프로젝트에 실제로 써 보는 방식이 가장 효과적이었습니다. 튜토리얼을 따라 할 때와 제 프로젝트의 실제 문제에 적용할 때 남는 게 달랐습니다.

애니메이션 같은 시각 효과는 공짜처럼 보이지만 용량이 듭니다. Lottie 파일 하나 때문에 첫 화면이 느려지는 걸 본 뒤로는 시각 요소를 넣을 때 용량과 로딩 시점부터 확인합니다.

이 사이트를 만들고 2년 뒤에 devkbs를 다시 만들면서 그때와 지금이 어떻게 다른지 알 수 있었습니다. 그때는 무엇을 쓸 수 있는지 보여주려 했고, 지금은 무엇을 왜 그렇게 정했는지를 적어 두려고 합니다.