
backend 로직에 server action을 적극적으로 사용하기 위한 아키텍처.
문제점
해결방법
export const Home = () => {
const { value } = useStore();
const handleClick = async () => {
await controllerGo(value);
}
return (
<div>
<div>{value}</div>
<Button onClick={handleClick}>Click</Button>
</div>
);
}
"use client";
export const controllerGo = async (value: number) => {
const { setValue } = useStore.getState();
const response = await serviceGo(value);
if(response.result === "error") {
console.error(response.message);
return false;
}
const data = response.data;
if(!data) {
console.error("No Data");
return false;
}
setValue(data);
return true;
}
"use server";
export const serviceGo = async (value: number) => {
try {
const ErrorProbability = process.env.ERROR_PROBABILITY;
const newValue = await actionIncrease(value, ErrorProbability);
return {
result: "success",
data: newValue
}
} catch (error) {
if(error instanceof Error) {
return {
result: "Error",
message: error.message
}
}
return {
result: "Error",
message: "unknown"
}
}
}
export const actionIncrease = async (n: number, p: number) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
const randomValue = Math.random() * 100;
if (randomValue < p) {
reject(new Error('Random exception occurred'));
} else {
resolve(n + 1);
}
}, 1000);
});
}