From cd51b7652701c4e3cb3891df20bb0463ce227e35 Mon Sep 17 00:00:00 2001 From: rmkim7 Date: Sat, 29 Mar 2025 22:16:24 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20PostViewModel=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?PostDetail=EC=97=90=20ViewModel=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/entities/post/model/post-view-model.ts | 6 +++++- .../web/features/post/post-detail/ui/post-detail.tsx | 12 +++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/web/entities/post/model/post-view-model.ts b/apps/web/entities/post/model/post-view-model.ts index 6501625..2b68287 100644 --- a/apps/web/entities/post/model/post-view-model.ts +++ b/apps/web/entities/post/model/post-view-model.ts @@ -1,7 +1,11 @@ import { Post } from '@/entities/post'; import { formatToLocaleDate } from '@/shared/lib'; -export const mapPostToViewModel = (post: Post) => ({ +export interface PostViewModel extends Post { + localeCreatedAt: string; +} + +export const mapPostToViewModel = (post: Post): PostViewModel => ({ ...post, localeCreatedAt: formatToLocaleDate(post.createdAt), }); diff --git a/apps/web/features/post/post-detail/ui/post-detail.tsx b/apps/web/features/post/post-detail/ui/post-detail.tsx index 7f55417..6ddce5f 100644 --- a/apps/web/features/post/post-detail/ui/post-detail.tsx +++ b/apps/web/features/post/post-detail/ui/post-detail.tsx @@ -3,14 +3,12 @@ import { useParams } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { getPostById } from '@/entities/post'; -import { Post } from '@/entities/post'; -import { formatToLocaleDate } from '@/shared/lib'; +import { getPostById, mapPostToViewModel } from '@/entities/post'; +import { PostViewModel } from '@/entities/post/model/post-view-model'; -// 특정 게시글 페이지 - 게시글 생성 후 넘어가지는지 확인용으로 만든 임시 컴포넌트 export function PostDetail() { const { id } = useParams(); - const [post, setPost] = useState(null); + const [post, setPost] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); @@ -21,7 +19,7 @@ export function PostDetail() { try { setIsLoading(true); const data = await getPostById(id as string); - setPost(data); + setPost(mapPostToViewModel(data)); } catch (err) { setError('게시글을 불러오는 중 오류가 발생했습니다.'); console.error(err); @@ -41,7 +39,7 @@ export function PostDetail() {

{post.title}

{post.content}

작성자: {post.author}

-

작성일: {formatToLocaleDate(post.createdAt)}

+

작성일: {post.localeCreatedAt}

); } From bad46c930c6b6d2e7d2a5c023a92a2d7f1d48372 Mon Sep 17 00:00:00 2001 From: rmkim7 Date: Sun, 30 Mar 2025 18:22:15 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20PostDetail=EC=9D=84=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=ED=8C=A8=EC=B9=AD=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/post-detail/ui/post-detail.tsx | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/apps/web/features/post/post-detail/ui/post-detail.tsx b/apps/web/features/post/post-detail/ui/post-detail.tsx index 6ddce5f..e96f15e 100644 --- a/apps/web/features/post/post-detail/ui/post-detail.tsx +++ b/apps/web/features/post/post-detail/ui/post-detail.tsx @@ -1,45 +1,39 @@ -'use client'; - -import { useParams } from 'next/navigation'; -import { useEffect, useState } from 'react'; - import { getPostById, mapPostToViewModel } from '@/entities/post'; import { PostViewModel } from '@/entities/post/model/post-view-model'; -export function PostDetail() { - const { id } = useParams(); - const [post, setPost] = useState(null); - const [isLoading, setIsLoading] = useState(true); - const [error, setError] = useState(null); +interface PostDetailProps { + params: { id: string }; +} + +export async function PostDetail({ params }: PostDetailProps) { + let post: PostViewModel | null = null; + let error: string | null = null; - useEffect(() => { - if (!id) return; + const id = (await params).id; - async function fetchPost() { - try { - setIsLoading(true); - const data = await getPostById(id as string); - setPost(mapPostToViewModel(data)); - } catch (err) { - setError('게시글을 불러오는 중 오류가 발생했습니다.'); - console.error(err); - } finally { - setIsLoading(false); - } - } - fetchPost(); - }, [id]); + try { + const data = await getPostById(id); + post = mapPostToViewModel(data); + } catch (err) { + console.error(err); + error = '게시글을 불러오는 중 오류가 발생했습니다.'; + } - if (isLoading) return

로딩 중...

; if (error) return

{error}

; if (!post) return

게시글을 찾을 수 없습니다.

; return ( -
-

{post.title}

-

{post.content}

-

작성자: {post.author}

-

작성일: {post.localeCreatedAt}

+
+

{post.title}

+
+

{post.content}

+
+
+ + {post.author} + + +
); } From 0a7d0962af5bda1090bafd71f15ce37b5d4d3217 Mon Sep 17 00:00:00 2001 From: rmkim7 Date: Sun, 30 Mar 2025 18:25:37 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20Post=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EC=97=90=20=EB=AA=A9=EB=A1=9D=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/posts/[id]/page.tsx | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/web/app/posts/[id]/page.tsx b/apps/web/app/posts/[id]/page.tsx index d1c88a8..1144371 100644 --- a/apps/web/app/posts/[id]/page.tsx +++ b/apps/web/app/posts/[id]/page.tsx @@ -1,13 +1,22 @@ +import { Button } from '@workspace/ui/components/button'; import Link from 'next/link'; import { PostDetail } from '@/features/post/post-detail'; -// 특정 게시글 페이지 - 게시글 생성 후 넘어가지는지 확인용으로 만든 임시 페이지 -export default function PostPage() { +export default async function PostPage({ params }: { params: { id: string } }) { + const id = (await params).id; + return ( -
- - 목록으로 -
+
+
+ + +
+ +
); } From c7a0f668827d8992663c2b4e7aa3df41d7a0f2ac Mon Sep 17 00:00:00 2001 From: rmkim7 Date: Sun, 30 Mar 2025 18:29:33 +0900 Subject: [PATCH 4/6] =?UTF-8?q?design:=20Home=20=EB=B0=8F=20layout.tsx=20?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/layout.tsx | 6 ++++-- apps/web/app/page.tsx | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 7e42423..c99ce77 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -20,11 +20,13 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - + - {children} + +
{children}
+
); diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index 4102775..6f9606d 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -8,8 +8,8 @@ export default async function Home() { const { data, nextCursor, hasMore } = await getInfiniteScrollData('', 10); return ( - <> - @@ -18,6 +18,6 @@ export default async function Home() { lastPostId={nextCursor} hasMore={hasMore} /> - +
); } From 46cda56e5b9ee040a594d5b61adc565b5be149e9 Mon Sep 17 00:00:00 2001 From: rmkim7 Date: Mon, 31 Mar 2025 02:16:53 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor:=20PostViewModel=EC=9D=98=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5=20=EA=B5=AC=EC=A1=B0=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EB=AA=85=ED=99=95=ED=95=9C=20=EC=86=8D=EC=84=B1=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/entities/post/model/post-view-model.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/web/entities/post/model/post-view-model.ts b/apps/web/entities/post/model/post-view-model.ts index 2b68287..20db1c6 100644 --- a/apps/web/entities/post/model/post-view-model.ts +++ b/apps/web/entities/post/model/post-view-model.ts @@ -1,11 +1,18 @@ import { Post } from '@/entities/post'; import { formatToLocaleDate } from '@/shared/lib'; -export interface PostViewModel extends Post { +export interface PostViewModel { + id: string; + title: string; + content: string; + author: string; localeCreatedAt: string; } export const mapPostToViewModel = (post: Post): PostViewModel => ({ - ...post, + id: post.id, + title: post.title, + content: post.content, + author: post.author, localeCreatedAt: formatToLocaleDate(post.createdAt), }); From 2d47393f670f0ad2a8352d3a81a7d7d15405e6fb Mon Sep 17 00:00:00 2001 From: rmkim7 Date: Mon, 31 Mar 2025 02:51:21 +0900 Subject: [PATCH 6/6] =?UTF-8?q?design:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/app/page.tsx | 17 +++++++---- apps/web/app/posts/[id]/page.tsx | 22 +++++++------- apps/web/app/posts/edit/[id]/page.tsx | 6 +--- apps/web/app/posts/write/page.tsx | 6 +--- .../post/post-detail/ui/post-detail.tsx | 4 +-- .../post/post-editor/ui/post-form.tsx | 29 ++++++++++--------- 6 files changed, 44 insertions(+), 40 deletions(-) diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index 6f9606d..f8341f2 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -8,16 +8,23 @@ export default async function Home() { const { data, nextCursor, hasMore } = await getInfiniteScrollData('', 10); return ( -
- + <> +
+

+ 게시글 목록 +

+
+ +
+
-
+ ); } diff --git a/apps/web/app/posts/[id]/page.tsx b/apps/web/app/posts/[id]/page.tsx index 1144371..8508c7a 100644 --- a/apps/web/app/posts/[id]/page.tsx +++ b/apps/web/app/posts/[id]/page.tsx @@ -7,16 +7,18 @@ export default async function PostPage({ params }: { params: { id: string } }) { const id = (await params).id; return ( -
-
- - -
+ <> -
+
+
+ + +
+
+ ); } diff --git a/apps/web/app/posts/edit/[id]/page.tsx b/apps/web/app/posts/edit/[id]/page.tsx index f06f95d..d8c02a3 100644 --- a/apps/web/app/posts/edit/[id]/page.tsx +++ b/apps/web/app/posts/edit/[id]/page.tsx @@ -15,9 +15,5 @@ export default async function PostEditPage({ params }: PostEditPageProps) { notFound(); } - return ( -
- -
- ); + return ; } diff --git a/apps/web/app/posts/write/page.tsx b/apps/web/app/posts/write/page.tsx index 04837cb..1f7342b 100644 --- a/apps/web/app/posts/write/page.tsx +++ b/apps/web/app/posts/write/page.tsx @@ -1,9 +1,5 @@ import { PostForm } from '@/features/post/post-editor'; export default function NewPostPage() { - return ( -
- -
- ); + return ; } diff --git a/apps/web/features/post/post-detail/ui/post-detail.tsx b/apps/web/features/post/post-detail/ui/post-detail.tsx index e96f15e..e03e8b3 100644 --- a/apps/web/features/post/post-detail/ui/post-detail.tsx +++ b/apps/web/features/post/post-detail/ui/post-detail.tsx @@ -23,10 +23,10 @@ export async function PostDetail({ params }: PostDetailProps) { if (!post) return

게시글을 찾을 수 없습니다.

; return ( -
+

{post.title}


-

{post.content}

+

{post.content}


diff --git a/apps/web/features/post/post-editor/ui/post-form.tsx b/apps/web/features/post/post-editor/ui/post-form.tsx index 30d1219..23a3d9d 100644 --- a/apps/web/features/post/post-editor/ui/post-form.tsx +++ b/apps/web/features/post/post-editor/ui/post-form.tsx @@ -22,8 +22,8 @@ export function PostForm({ post }: PostFormProps) { ); return ( -
-

+ +

{isEditMode ? '게시글 수정' : '새 게시글 작성'}

@@ -43,6 +43,7 @@ export function PostForm({ post }: PostFormProps) { disabled={isPending} isTextArea defaultValue={post?.content || ''} + className="min-h-[30vh]" /> {actionResult.error}

)} - - +
+ + +
); }