Skip to content

Commit ed37b3c

Browse files
committed
update post
1 parent 1d7d024 commit ed37b3c

File tree

5 files changed

+118
-14
lines changed

5 files changed

+118
-14
lines changed

content/posts/프로젝트/당근마켓 클론코딩/당근마켓 클론코딩으로 Next.js 복습하기.md

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ tags:
44
- carrot-market
55
- study
66
createdAt: 2025-06-30 08:48:51
7-
modifiedAt: 2025-07-03 12:55:22
7+
modifiedAt: 2025-07-03 14:59:00
88
publish: 프로젝트/당근마켓 클론코딩
99
related:
1010
- "[[당근마켓 클론코딩]]"
@@ -222,6 +222,115 @@ export default function Login() {
222222
}
223223
```
224224

225-
#### useActionState의 초기값의 활용
225+
#### useActionState의 초기값의 활용(휴대폰 토큰 검증 예시)
226+
227+
`useActionState`에 할당할 수 있는 초기 값을 설정하여 휴대폰 입력을 하고 토큰을 받아 검증하는 시스템을 구현할 수 있다.
228+
229+
```tsx
230+
"use client";
231+
232+
import Button from "@/components/button";
233+
import Input from "@/components/input";
234+
import { useActionState } from "react";
235+
import { smsVerification } from "./actions";
236+
237+
const initialState = {
238+
token: false,
239+
phone: undefined,
240+
};
241+
242+
export default function SMSLogin() {
243+
const [{ token, data, error }, action] = useActionState(
244+
smsVerification,
245+
initialState,
246+
);
247+
return (
248+
<div className="flex flex-col gap-10 py-8 px-6">
249+
<div className="flex flex-col gap-2 *:font-medium">
250+
<h1 className="text-2xl">SMS Login</h1>
251+
<h2 className="text-xl">Verify your phone number.</h2>
252+
</div>
253+
<form action={action} className="flex flex-col gap-4">
254+
{!token ? (
255+
<Input
256+
name="phone"
257+
defaultValue={token ? data : data}
258+
type="text"
259+
placeholder="Phone number"
260+
errors={error?.formErrors}
261+
required
262+
/>
263+
) : (
264+
<Input
265+
name="token"
266+
type="number"
267+
placeholder="Verification code"
268+
required
269+
min={100000}
270+
max={999999}
271+
/>
272+
)}
273+
<Button text={token ? "Verify Token" : "Send Verification SMS"} />
274+
</form>
275+
</div>
276+
);
277+
}
278+
```
279+
280+
- initialState에 초기 token값을 정의하여 첫 ServerAction에 해당 값을 넘겨준디.
281+
282+
```typescript
283+
"use server";
284+
import { z } from "zod";
285+
import validator from "validator";
286+
import { redirect } from "next/navigation";
287+
288+
const phoneSchema = z
289+
.string()
290+
.trim()
291+
.refine(
292+
(phone) => validator.isMobilePhone(phone, "ko-KR"),
293+
"잘못된 전화번호",
294+
);
295+
const tokenSchema = z.coerce.number().min(100000).max(999999);
296+
297+
interface ActionState {
298+
token: boolean;
299+
}
300+
301+
export async function smsVerification(
302+
prevState: ActionState,
303+
formData: FormData,
304+
) {
305+
const phone = formData.get("phone");
306+
const token = formData.get("token");
307+
308+
if (!prevState?.token) {
309+
const result = phoneSchema.safeParse(phone);
310+
if (!result.success) {
311+
console.log(result.error.flatten());
312+
return {
313+
token: false,
314+
error: result.error.flatten(),
315+
data: result.data,
316+
};
317+
} else {
318+
return {
319+
token: true,
320+
data: result.data,
321+
};
322+
}
323+
} else {
324+
const result = tokenSchema.safeParse(token);
325+
if (!result.success) {
326+
return { token: true };
327+
} else {
328+
redirect("/");
329+
}
330+
}
331+
}
332+
```
333+
334+
- serverAction에서 휴대폰의 검증이 끝나 성공하면 token을 true로 변경하여 값을 반환하면 react 에서 해당 값을 기준으로 다른 인풋 창을 나타내 줄 수 있다.
226335

227336
## API Route Handler vs ServerAction

content/posts/프로젝트/당근마켓 클론코딩/당근마켓 클론코딩으로 Zod 배우기.md

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ tags:
55
- study
66
- zod
77
createdAt: 2025-06-30 21:21:49
8-
modifiedAt: 2025-07-03 13:39:02
8+
modifiedAt: 2025-07-03 13:41:23
99
publish: 프로젝트/당근마켓 클론코딩
1010
related:
1111
- "[[당근마켓 클론코딩]]"
12+
- "[[당근마켓 클론코딩으로 Validator 사용해보기]]"
1213
series: ""
1314
---
1415

@@ -419,12 +420,6 @@ const formSchema = z.object({
419420
z.coerce.number().parse("1234");
420421
```
421422

422-
##### 토큰 유효성 검사 예시
423-
424-
```typescript
425-
426-
```
427-
428423
## 참고
429424

430425
- [[당근마켓 클론코딩으로 Validator 사용해보기]]

public/meta-data.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@
590590
"tags": ["project", "carrot-market", "study", "zod"],
591591
"series": "",
592592
"createdAt": "2025-06-30 21:21:49",
593-
"modifiedAt": "2025-07-03 13:39:02",
593+
"modifiedAt": "2025-07-03 13:41:23",
594594
"publish": "프로젝트/당근마켓 클론코딩"
595595
},
596596
{
@@ -612,7 +612,7 @@
612612
"tags": ["project", "carrot-market", "study"],
613613
"series": "",
614614
"createdAt": "2025-06-30 08:48:51",
615-
"modifiedAt": "2025-07-03 12:55:22",
615+
"modifiedAt": "2025-07-03 14:59:00",
616616
"publish": "프로젝트/당근마켓 클론코딩"
617617
},
618618
{

public/post-contents/프로젝트/당근마켓 클론코딩/당근마켓 클론코딩으로 Next.js 복습하기.json

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

public/post-contents/프로젝트/당근마켓 클론코딩/당근마켓 클론코딩으로 Zod 배우기.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)