프론트엔드
Sonamu가 자동으로 생성한 프론트엔드 서비스 코드를 이용하여 프론트엔드를 구현하는 방법을 설명합니다.
코드를 작성하기 전에, 먼저 @sonamu-kit/react-sui 패키지가 설치되어 있는지 확인합니다. 해당 패키지는 Sonamu 프로젝트에서 사용하는 UI 라이브러리입니다. @sonamu-kit/react-sui 패키지는 semantic-ui-react 패키지를 기반으로 하며, Sonamu 프로젝트에서 사용하기 위한 컴포넌트 및 훅을 제공합니다.
yarn add @sonamu-kit/react-sui동기화된 파일
Sonamu는 백엔드 작업 시 작업의 종류에 따라 프론트엔드 디렉터리에 파일을 동기화(복사)합니다. 동기화되는 파일은 다음과 같습니다.
- 타입 파일(
.types.ts) - 서비스 파일(
.service.ts) - Sonamu 생성 파일(
sonamu.generated.ts)
서비스 코드
Sonamu는 @api 데코레이터로 등록된 API를 기반으로 프론트엔드 서비스 코드를 자동으로 생성합니다. 프론트엔드 서비스 코드는 web/src/services 디렉터리에 위치합니다.
게시글 목록
먼저, 게시글의 어떤 필드를 조회할지 설정해야 합니다. Sonamu UI에 접속하여 게시글 엔티티 페이지로 이동한 후, Subsets 테이블에서 아래와 같이 P 서브셋을 생성합니다. P는 Public의 약자로, 프론트엔드에서 게시글을 조회할 때 사용할 서브셋입니다.

다음으로, 게시글 목록을 보여주는 페이지를 구현해보겠습니다. web/src/pages 디렉터리에 post 디렉터리를 생성하고, 아래와 같이 index.tsx 파일을 작성합니다.
import { useListParams } from "@sonamu-kit/react-sui";import { List, ListContent, ListHeader, ListItem, Pagination,} from "semantic-ui-react";import { PostListParams } from "../../services/post/post.types";import { PostService } from "../../services/post/post.service";
export default function PostList() { const { listParams, setListParams, register } = useListParams( PostListParams, { num: 10, page: 1, orderBy: "id-desc" } );
const { data, isLoading, error, mutate } = PostService.usePosts( "P", listParams );
return ( <div> <h1>Sonamu</h1>
<List divided> {data?.rows.map((e) => ( <ListItem key={e.id}> <ListContent as="a" href={`/post/${e.id}`}> <ListHeader>{e.title}</ListHeader> {e.author.name} | {e.created_at} </ListContent> </ListItem> ))} </List> {data && data.total && listParams.num && ( <Pagination totalPages={Math.ceil(data.total / listParams.num)} {...register("page")} /> )} </div> );}위 코드는 게시글 목록을 보여주는 페이지를 구현한 것입니다. useListParams 훅을 이용하여 게시글 목록을 조회하기 위한 파라미터를 설정하고, PostService.usePosts를 이용하여 게시글 목록을 조회합니다. 이제 localhost:16001/post로 접속하여 게시글 목록을 확인할 수 있습니다.
게시글 작성
다음으로, 게시글을 작성하는 페이지를 구현해보겠습니다. web/src/pages/post/write 디렉터리에 index.tsx 파일을 생성하고, 아래와 같이 코드를 작성합니다.
import { useTypeForm } from "@sonamu-kit/react-sui";import { useState } from "react";import { useNavigate } from "react-router-dom";import { Button, Form, Input, Label, TextArea } from "semantic-ui-react";import { PostService } from "src/services/post/post.service";import { PostSaveMineParams } from "src/services/post/post.types";import { defaultCatch } from "src/services/sonamu.shared";
export default function PostWrite() { const navigate = useNavigate();
const [loading, setLoading] = useState(false); const { form, register } = useTypeForm(PostSaveMineParams, { title: "", content: "", author_id: 1, });
const submit = () => { setLoading(true); PostService.saveMine(form) .then(() => navigate("/post")) .catch(defaultCatch) .finally(() => setLoading(false)); };
return ( <div> <Form> <Input placeholder="제목" {...register("title")} /> <TextArea placeholder="내용" {...register("content")} /> <Button onClick={submit} disabled={loading}> 저장 </Button> </Form> </div> );}위 코드는 게시글을 작성하는 페이지를 구현한 것입니다. useTypeForm 훅을 이용하여 게시글 작성을 위한 폼을 설정하고, PostService.saveMine을 이용하여 게시글을 저장합니다. 이제 localhost:16001/post/write로 접속하여 게시글을 작성할 수 있습니다.
마치며
Sonamu가 생성한 프론트엔드 서비스 코드와 @sonamu-kit을 이용하여 아주 간단한 프론트엔드를 구현해보았습니다. 더 자세한 내용은 @sonamu-kit 문서를 참고하세요.