꽤 오랜 시간 블로그 작성을 하지 못했습니다.
물론 개발은 근면하게 진행하며 많은 진척이 있었으나,
항상 그렇듯 어느부분에서 끊고 정리를 할지 고민이 되고
고민이 길어질 즈음에 이럴 시간에 조금이라도 더 개발을 해서
한 파트를 마무리 짓고 한번에 작성하자! 라는 생각을 하지만
점점 프로젝트의 볼륨이 커지는 상황에서 한 파트를 개발하면서
다른 파트에 대한 사이드 이펙트가 생기고 이런 것들이 반복되면서
쉽게 블로그에 발을 들이기 힘들어지네요..
열심히 하겠습니다.
5월 11일에 기존 배포방식에 문제가 발생했습니다.
vercel.app 주소를 한국에서 정식으로 막아 사용이 불가능해졌기에
clanbe.site라는 도메인을 가비아에서 구매 후
vercel에서 새 도메인을 지정하여 해결하였습니다.
기존 코드는 이전에 진행했던 블로그 프로젝트의 메서드를 일부
그대로 이전하여 사용하면서
ssr단계에서 api를 통하지 않고 몽고db를 통해 접근하거나
fetch를 사용하지 않아 서버액션 적용이 불가하거나
ssr단계에서 fetch하지 않고 csr로 넘어와서 fetch를 하는 등
프로젝트 컨벤션이 컴포넌트 및 페이지 단계에서 단일화 되지 않아
성능감소 및 개발과 유지보수에 비효율적인 구조였기에
전체적으로 fetch를 사용하고 서버액션을 적용하며 ssr단계에서
초기 데이터를 로드하도록 변경하였습니다.
기존의 라우팅 주소들이 직관적이지 못하거나 컨벤션이 일치하지 않아
프로젝트 덩어리가 점점 커지는 와중에 개발과 유지보수에 어려움을
주기 시작하여 api들을 카테고리 별로 다시한번 정리하여 묶어주었습니다.
클랜내 후원게시판 및 후원레이아웃 보드를 개발했습니다.
후원관련 게시물 등록시 후원/지출 의 type을 지정하고
모든 유저들의 닉네임을 받아 오토컴플리트 기능을 통해
db내 존재하는 유저의 닉네임을 지정 및 금액을 선택 할 수있게 했습니다.
기존 클랜홈페이지는 단순히 글의 제목을 받아 렌더하는 방식이었기에
db에서 후원금액을 관리하고 렌더할 수가 없었기 때문에
import mongoose, { Model } from "mongoose";
import { Match, SupportAmount } from "../../types/types";
const supportSchema = new mongoose.Schema(
{
type: Number,
amount: Number,
email: String,
postid: String,
},
{
timestamps: true, // createdAt 및 updatedAt 타임스탬프 자동 생성
}
);
let SupportModel: Model<SupportAmount>;
if (mongoose.modelNames().includes("support")) {
// 모델이 이미 존재하는 경우, 해당 모델을 가져옵니다.
SupportModel = mongoose.model<SupportAmount>("support");
} else {
// 모델이 존재하지 않는 경우, 새로운 모델을 생성합니다.
SupportModel = mongoose.model<SupportAmount>(
"support",
supportSchema,
"support"
);
}
export default SupportModel;
후원금에 대한 스키마를 작성하고
import { NextApiRequest, NextApiResponse } from "next";
import { uploadPostData } from "@/service/posts";
import { MongoClient } from "mongodb";
import { NextResponse } from "next/server";
import mongoose from "mongoose";
import PostModel from "@/models/post";
import SupportModel from "@/models/support";
export async function POST(req: Request, res: Response) {
const body = await req.json();
let {
htmlContent,
noticed,
title,
description,
category,
thumbnail,
featured,
author,
view,
supporter,
type,
amount,
} = body.postData;
try {
const fileUrl = await uploadPostData(htmlContent);
// MongoDB에 데이터 저장
await mongoose.connect(process.env.NEXT_PUBLIC_MONGODB_URI as string);
if (thumbnail === "")
thumbnail =
"https://theon2blog.s3.ap-northeast-2.amazonaws.com/KakaoTalk_20230607_124653702_02.png";
const post = new PostModel({
title,
description,
category,
thumbnail,
featured,
fileUrl,
author,
noticed,
view,
});
const savedPost = await post.save();
if (category === "support") {
try {
const supportData = new SupportModel({
type,
email:supporter,
amount,
postid:savedPost._id,
});
supportData.save();
} catch (error: unknown) {
console.error("후원내역 저장 실패:", error);
}
}
console.log("게시글 저장 성공");
return new Response(
JSON.stringify({
message: savedPost._id.toString(),
}),
{
status: 200,
statusText: savedPost._id.toString(),
}
);
} catch (error: unknown) {
if (error instanceof Error) {
new Response(JSON.stringify({ error: error.message }), {
status: 500,
});
} else {
new Response(JSON.stringify({ error: "An unknown error occurred" }), {
status: 500,
});
}
}
}
게시물에 대한 crud시 후원게시글의 경우 후원정보를 생성하도록 하였습니다.
이를 통해 db의 총 amount의 합계로 후원금 실시간 내역과 사용내역 후원내역등을 파악하는데 기존보다 수월해졌습니다.
사이트 리뉴얼의 핵심기능중 하나입니다.
기존 홈페이지는 클랜의 핵심 컨텐츠인 BELO에 접근하거나
BELO관련 기능을 이용하는데에 굉장히 불편했습니다.
기존 홈페이지 BELO기능
페이지네이션이나 인피니트 스크롤 및 검색이나 필터링 기능 자체가 없는 선수정보 / 매치정보 페이지로 인해 컨텐츠 열람에 큰 불편감과 거부감을 주었고,
경기기록 등록시 불편한 위치에 자리잡은 페이지를 찾아내 진입후
한경기를 등록하고 SUBMIT 하면 입력정보가 전부 지워지며
여러 경기를 등록할 경우 굉장히 불편한 경험을 하게 되어
클랜의 핵심 컨텐츠 임에도 참여율과 중요도가 크게 떨어지는 요인이 되었습니다.
새 홈페이지 belo기능
가장 먼저 중점으로 둔것은 접근성의 향상이었습니다.
이제 새 홈페이지 에서는 클랜원이 로그인시 고정된 네비게이션에서
자신의 belo성적과 belo 간편등록버튼을 제공받습니다.
해당 모달에서 메인페이지에서 사전 ssr로드된 유저정보를 받아
오토컴플리트로 db에 등록된 클랜원을 쉽게 등록할 수 있습니다.
그리고 등록성공 시에도 입력데이터가 곧바로 지워지지 않게 변경하여
한 선수와 여러 경기를 진행해도 한번에 편하게 등록 할 수있으며,
유저 전환 버튼을 통해 승자와 패자의 정보만 스왑하여
승패승 등의 상황에서도 재입력이 없도록 편의성을 크게 개선했습니다.
유저정보 페이지에서도 닉네임 검색 / 티어 및 종족 필터링과
페이지네이션을 적용하여 가독성의 향상 및 접근성을 개선했습니다.
전적조회도 같은 방향으로 개선점이 적용되었습니다.