검색 엔진 친화적 다국어 블로그 만들기

블로그의 SEO를 개선하기 위해 canonical, hreflang, Open Graph, JSON-LD 등을 구현하고 _config.yml로 중앙 관리하는 과정을 공유합니다.
업데이트

Cloudflare Pages 커스텀 도메인 설정 트러블슈팅: www 리다이렉트와 403 에러 해결

문제 상황 Cloudflare Pages로 배포한 사이트에 커스텀 도메인을 연결했는데, www 서브도메인이 계속 Inactive (Error) 상태였습니다. 몇 시간이 지나도 해결되지 않았고, 루트 도메인으로 접속하면 www로 리다이렉트는 되지만 아래와 같은 에러가 발생했습니다. HTTP ERROR 403 — 이 페이지를 볼 수 있는 권한이 없습니다. 원인 1: www 도메인 Inactive (Error) — DNS 소유권 충돌 왜 발생하는가 Cloudflare Pages...
업데이트

@ControllerAdvice를 통한 아키텍처 개선

각 컨트롤러 메서드마다 현재 로그인한 사용자의 정보를 조회하고 모델에 담는 로직은 코드의 중복을 발생시키고 유지보수성을 저하시킵니다. 또한 비로그인 사용자의 접근 시 발생할 수 있는 NullPointerException의 잠재적 원인이 되기도 합니다. 이를 해결하기 위해 @ControllerAdvice를 도입했습니다. 공통으로 필요한 사용자 정보(userInfo)와 좋아요 목록(likeList)을 전역 모델 속성으로 정의하여 모든 컨트롤러에서 개별적으로 관리하던 로직을 한 곳으로 집중시켰습...
업데이트

유연한 응답 구조 설계와 사용자 경험 개선을 위한 프로필 관리 기능 구현

서비스의 확장성과 유지보수성을 높이기 위해 공통 응답 객체를 개선하고, 사용자가 직접 자신의 정체성을 표현할 수 있는 프로필 이미지 관리 기능을 구현했습니다. 이 과정에서 겪은 기술적 해결 방안을 공유합니다. 공통 응답 객체의 제네릭 타입 추론 개선 기존의 ResponseDto는 롬복의 @Builder를 통해 생성되었습니다. 하지만 제네릭 타입을 사용하는 구조상, 빌더 사용 시 명시적인 타입 지정이 없으면 컴파일러가 타입을 정확히 추론하지 못하는 문제가 발생했습니다. 이를 해결하기 위해 ...
업데이트

어떤 이의 관심사는 그 사람의 결핍과 관련이 있는거같다 미래가 걱정되면 자기계발서를 마음이 헛헛하면 읽다 만 소

어떤 이의 관심사는 그 사람의 결핍과 관련이 있는거같다. 미래가 걱정되면 자기계발서를, 마음이 헛헛하면 읽다 만 소설책을 꺼내보곤 한다.
업데이트

조회수 및 권한 시스템 개선기

기록의 본질에 집중하는 플랫폼 ‘무제’는 정식 출시 이후 사용자의 이용 패턴을 분석하며 시스템의 안정성과 데이터 신뢰성을 높이는 데 주력하고 있습니다. 특히 이번 업데이트에서는 사용자가 게시물을 소비하는 가장 기본적인 지표인 ‘조회수’ 산정 방식의 개편과 더불어, 프런트엔드와 백엔드 간의 데이터 동기화 과정에서 발생한 기술적 부채를 해결한 과정을 공유하고자 합니다. 1. 지표의 신뢰성을 위한 조회수 산정 로직 개편 단순히 페이지가 로드될 때마다 수치가 증가하는 기존 방식은 새로고침 어뷰징...
업데이트

일관성 있는 사용자 경험과 데이터 무결성을 위한 로직 개선

무제는 사용자의 다양한 페르소나를 존중하며, 기록의 가치를 보존하는 플랫폼을 지향합니다. 서비스가 성장함에 따라 기존에 작성된 파편화된 로직들은 유지보수의 복잡도를 높이고, 때때로 사용자 의도와 다른 결과를 초래하기도 합니다. 최근 진행된 업데이트를 통해 직면했던 기술적 문제들과 이를 해결하기 위해 시도한 구조적 개선 사항들을 공유하고자 합니다. 1. 폼 바인딩의 모호성 해결과 UI/UX 일관성 확보 기존의 게시물 에디터는 메인 페이지의 빠른 작성(Quick Compose) 도구와 서로 ...
업데이트

검색 기능 구현과 무제 정식 배포를 위한 서비스 안정화 여정

무제 프로젝트가 오늘 정식 버전을 배포했습니다. 스프링 부트 기반의 기술 스택을 활용하여 서비스의 완성도를 높이는 과정에서 마주했던 기술적 도전과 이를 해결한 과정에 대해 공유하고자 합니다. 1. 사용자 경험의 핵심, 검색 시스템 설계와 구현 정보가 축적됨에 따라 사용자가 원하는 게시물과 작성자를 신속하게 찾아낼 수 있는 검색 기능의 필요성이 대두되었습니다. 무제의 검색 시스템은 단순한 키워드 매칭을 넘어 사용자 중심의 편의성을 극대화하는 방향으로 설계되었습니다. 텍스트 검색과 핸들 검...
업데이트

게시물 관리 인터랙션 개선 및 프론트엔드 로직 추상화하기

블로그 프로젝트 트리드 를 개발하며 사용자 경험(UX)의 핵심인 게시물 관리 기능을 고도화했습니다. 기존의 페이지 단위 렌더링 방식에서 벗어나, 비동기 통신을 통한 동적 UI 업데이트와 공통 로직의 외부화를 통해 코드 유지보수성을 확보한 과정을 공유합니다. 1. 게시물 렌더링 로직의 통합 및 추상화 초기 구현 단계에서는 메인 피드 페이지와 게시물 상세 페이지에서 각각 유사한 자바스크립트 로직이 중복되어 존재했습니다. 게시물 카드(Postcard)를 생성하고 목록에 추가하는 과정이 파편화되...
업데이트

Out Of Memory 해결기

저사양 컨테이너 환경에서 Spring Boot 서비스의 안정성을 확보하는 방법 클라우드 환경의 발전으로 서비스를 손쉽게 배포할 수 있게 되었지만, 제한된 리소스 내에서 애플리케이션의 안정성을 유지하는 것은 여전히 엔지니어에게 중요한 과제입니다. 특히 Railway와 같은 PaaS 환경의 프리티어에서 제공하는 1GB 내외의 메모리는 Spring Boot 애플리케이션을 구동하기에 다소 도전적인 수치입니다. 본 포스팅에서는 1GB 메모리 환경에서 발생한 OutOfMemory(OOM) 문제를 진...
업데이트

UI 컴포넌트 통합을 통한 프론트엔드 유지보수성 개선

서비스의 규모가 커짐에 따라 사용자에게 노출되는 UI 컴포넌트의 일관성을 유지하는 것은 개발자에게 중요한 도전 과제가 됩니다. 특히 블로그나 SNS와 같이 게시물 카드가 다양한 페이지에서 반복적으로 사용되는 경우, 이를 관리하는 로직이 파편화되면 사소한 디자인 변경에도 막대한 비용이 발생하게 됩니다. 본 글에서는 서버 사이드 렌더링(SSR)과 클라이언트 사이드 렌더링(CSR)으로 나뉘어 있던 게시물 렌더링 로직을 하나의 JavaScript 클래스로 통합하여 유지보수성을 극대화한 과정을 공유...
업데이트

타임리프 레이아웃을 이용한 UI 개편기

들어가며 “부트스트랩으로 어려운 거만 커스텀 CSS를 작성해달라”는 요청에서 시작된 프로젝트였습니다. 기존의 레거시 UI를 현대적인 SNS 스타일로 완전히 리뉴얼하면서 겪었던 경험과 해결책을 공유하고자 합니다. 문제 상황 기존 블로그는 전통적인 웹 블로그 레이아웃을 따르고 있었습니다. 하지만 사용자 경험을 개선하고 더 현대적인 인터페이스를 제공하기 위해 트위터 같은 SNS 피드 형태로의 전환이 필요했습니다. 특히 백엔드 개발자 입장에서 프론트엔드를 직접 구성하기 위해서는 다음과 같은 고...
업데이트

Spring Boot 프로파일을 활용한 환경별 설정 관리

개요 멀티 환경 애플리케이션을 개발할 때 가장 골치 아픈 문제 중 하나는 환경별 설정을 어떻게 관리할 것인가 하는 점입니다. 개발 환경, 스테이징, 운영 환경마다 데이터베이스 주소, 캐시 정책, 로깅 레벨 등이 모두 달라야 하기 때문입니다. 이번 글에서는 Spring Boot의 프로파일(Profile) 기능을 활용하여 환경별 설정을 효율적으로 관리하는 방법을 소개하겠습니다. 문제 상황 일반적인 프로젝트에서 환경별 설정을 관리할 때 다음과 같은 문제가 발생합니다. # 기존의 문제: ...
업데이트

소셜 레퍼런스

https://dribbble.com/shots/16842379-Social-Feed https://dribbble.com/shots/27002130-Vibe-Coding-Website-Design-Landing-page
업데이트
소셜 레퍼런스

Cloudflare R2를 활용한 이미지 업로드 및 자동 정리 시스템 구축

들어가며 웹 애플리케이션에서 이미지 업로드 기능은 필수적이지만, 관리하지 않으면 사용되지 않는 파일들이 스토리지에 누적되어 비용과 관리 부담이 증가하게 됩니다. 특히 사용자가 이미지를 업로드한 후 게시물 작성을 취소하거나, 게시물을 삭제할 때 연결된 이미지를 어떻게 처리할 것인가는 중요한 과제입니다. 본 글에서는 Spring Boot 기반의 블로그 프로젝트에서 Toast UI Editor를 통한 이미지 업로드부터 Cloudflare R2 스토리지 저장, 그리고 배치 작업을 통한 자동 정리...
업데이트

보안, 유지보수성, 그리고 동시성 제어

이번 글에서는 프로젝트의 품질을 한 단계 높이기 위해 진행했던 리팩토링 과정을 공유합니다. 데이터베이스 접속 정보를 안전하게 보호하는 암호화 작업부터, 프론트엔드 코드의 중복을 제거하는 모듈화, 그리고 빈번한 데이터 갱신 상황에서의 동시성 제어 처리 방법을 소개합니다. 1. Jasypt를 활용한 민감 정보 암호화 개발을 진행하다 보면 데이터베이스 URL, 사용자명, 비밀번호와 같은 민감한 정보가 application.yaml 파일에 평문으로 노출되는 경우가 많습니다. 이는 보안상 큰 취약...
업데이트

Railway로 배포하기, 동시성 이슈 고려하여 좋아요 기능 추가하기

1. 스프링 부트 애플리케이션의 배포와 데이터베이스 연결 오류 해결 프로젝트의 초기 단계에서 배포 편의성을 고려하여 Railway 플랫폼을 선택하였습니다. Dockerfile을 기반으로 한 자동 배포 시스템을 구축하였으나, 실행 단계에서 JDBCConnectionException이 발생하는 문제에 직면하였습니다. 해당 오류의 주된 원인은 데이터베이스 연결 문자열의 형식 불일치였습니다. Railway에서 제공하는 DATABASE_URL은 표준 PostgreSQL 형식을 따르지만, 스프링 부...
업데이트

로그레벨

소프트웨어 개발 및 운영 과정에서 로그(Log)는 시스템의 상태를 파악하고 문제를 진단하는 핵심적인 지표가 됩니다. 무분별한 로그 기록은 시스템 성능 저하와 저장 공간 부족을 초래할 수 있으며, 반대로 부족한 기록은 장애 대응을 어렵게 만듭니다. 이를 효율적으로 관리하기 위해 도입된 개념이 로그 레벨(Log Level)입니다. 본 글에서는 표준적으로 통용되는 로그 레벨의 정의와 상황별 활용 방안에 대하여 기술합니다. 1. 로그 레벨의 정의와 계층 구조 로그 레벨은 이벤트의 중요도와 ...
업데이트

About

김준영 백엔드 엔지니어 이메일 이력서 링크드인 안녕하세요, 기록을 좋아하는 백엔드 개발자 김준영입니다. 주로 Java와 Spring을 사용하여 RESTful API를 설계하고 확장 가능한 서버 아키텍처를 개발하며, 안정적이고 효율적인 시스템을 기반으로 서비스의 핵심 로직을 구현하고 복잡한 문제를 해결하는 데 집중합니다. 클린 코드와 탄탄한 설계 원칙을 바탕으로 오래 지속될 수 있는 소프트웨어를 만드는 것에 깊은 관심을 두고 있으며, 유지보수성과 확장성을 고려한 시스템을 설...
업데이트
About