반응형

Database

데이터베이스에 데이터를 올리기 위해서는 일단 Get과 Post에 대해 알아야한다. 이를 위해서 html의 form을 이용해서 POST를 보내주어야한다.

이를 이해하기 위해 Fake data base를 만들어보자

// Data
const videos: IContentsModel[] = [
	{
		id: 1,
		title: "hoho",
		desc: "fhj",
		createAt: new Date().toLocaleDateString(),
	},
	{
		id: 2,
		title: "heeh",
		desc: "werte",
		createAt: new Date().toLocaleDateString(),
	},
	{
		id: 3,
		title: "hahah",
		desc: "ryftujkty",
		createAt: new Date().toLocaleDateString(),
	},
	{
		id: 4,
		title: "asdf",
		desc: "asfdasdf",
		createAt: new Date().toLocaleDateString(),
	},
];

그리고 front를 만들어주어 back으로 보낼 준비를 해주자. 여기서 중요한 것은 form의 메소드를 POST로 설정해주어야한다. 만약 url의 설정을 바꾸고 싶다면 action attribute를 주어 url도 설정할 수 있으나 같은 url주소로 POST를 할꺼니 action은 따로 지정하지 않았다.

extends ../layout/layout
block contents 
    div 
        form(method="POST") 
            legned(hidden) EDIT #{video.title}
            label(for="videoTitle") EDIT #{video.title}
            input#videoTitle(type="text", name="title" value=video.title) 
            input(type="submit" value="submit")

 

해당 화면을 볼수 있게 라우터와 controller middleware를만들어준다.

 movieRouter.get("/:id([0-9]/edit)", videoEdit);
export const videoEdit: ExpressRouter = (req, res) => {
	const { id } = req.params;
	const videoId = +id.replace("/edit", "") - 1;
	const video = videos[videoId];
	return res.render("./videoTemp/videoEdit", {
		pageTitle: `EDIT ${video.title.toUpperCase()}`,
		video,
	});
};

POST를 위한 Router를 만들어준다.

movieRouter.post("/:id([0-9]/edit)", videoEditSave);

 

 

movieRouter.get("/:id([0-9]/edit)", videoEdit);
movieRouter.post("/:id([0-9]/edit)", videoEditSave);

 

router 설정에 get 과 post를 한 줄로 정리할 수 있는데

movieRouter.route("/:id([0-9]/edit)").get(videoEdit).post(videoEditSave);

로 축약할 수 있다.

 

그리고 POST의 controller middleware 설정을 해주면 끝

export const videoEditSave: ExpressRouter = (req, res) => {
	const { id } = req.params;
	const { title } = req.body;
	const videoId = +id.replace("/edit", "");
	const video = videos[videoId - 1];
	video.title = title;
	return res.redirect(`/video/${videoId}`);
};

 

MongoDB

mongoDB는 다목적이고 document(문서) 기반으로 작동한다. 보통 database는 문서기반이 아니다 sql 기반이다. 엑셀시트 같은 개념이다. mongoDB에서 DB는 object로 움직인다. 행으로 저장이 되지않고 Array Object들로 구성이 된다. JSON처럼 저장된다는 느낌이라고 생각하면 된다.

Install

MongoDB Community Server를 다운 받아준다. 

Connecting

Mongoose

mongoose는 NodeJS와 MongoDB를 이어주는 매개체가 될것이다. mongo가 잘 설치 되었는지 확인하기 위해 터미널에 아래의 명령어를 입력해준다. not found 문구가 나오면 다시 설치해야한다.

mongod

그리고 아래 입력

mongosh
mongosh 명령어

help
show dbs
db.

 

VScode로 돌아와서 mongoose 설치

npm install mongoose --save

mongoDB와 연결해주기 위해 코드를 작성해야한다. src 폴더에 db.ts or js를 생성

import mongoose from "mongoose";
//mongosh에 나와있는 connecting to 참조
mongoose.connect("mongodb://로컬호스트:포트넘버/임의 저장소 이름을 지정",{});

백엔드 파일에가서 db.ts or js 파일 자체를 import를 해주어야한다. 경고나 주의가 터미널창에 나오면 ,{} 안에 터미널창에 나오는 데로 작성해주면 된다.

연결의 성공 여부나 에러를 console.log로 출력하기 위해 다음과 같이 문장을 추가한다.

mongoose.connection.once("connected", () => console.log("✅ DB is connected"));
mongoose.connection.on("error", (error) => console.log(error));
728x90
반응형

interpolate - extrapolate

interpolate으로 동작의 변화를 주는데 내가 정한 수치보다 더 나아가서 계속 변화가 일어날때 그것을 방지하고자 사용한다. 수치보다 더 나아가고 싶다면 사용을 안해도 무방하다

extrapolate에는 3가지가 있는데

첫째로 "extend"는 끝이 한계치를 넘어서 계속 진행하는것이다.

둘째로 "identity"는

셋째로 "clamp"는 시작과 끝 점이 하나씩 있어서 다다르면 더이상 진행되지 않는다.

 

restSpeedThreshold 속도 임계점. 애니메이션을 끝난걸로 간주하는 속도 

restDisplacemetnThreshold 거리 임계값 애니메이션이 끝난걸로 간주하는 거리

 

Realm SDK

백엔드가 없이 데이터베이스에 의존적인 어플을 만들수가 있다. 또한 MongoDB를 실행할 수 있게 해준다.

npm i realm

 

import Realm from 'realm'

realm을 import 하면 model을 정의해야한다. 

const TaskSchema = {
	name:"Task",
    properties:{
    _id: "int",
    name: "string",
    status: "string?",
    },
    primaryKey:"_id",
}

 

이를 가지고 데이터베이스와 연결해주어야 하는데 데이터베이스를 열기 위해서는 다음 코드를 사용한다.

const realm = await Realm.open(){
  path: "myrealm",
  schema: [TaskSchema]
  });

 

 

다른 데이터를 추가하기 위해서는 schema에 추가하면 된다. 또한 이를 활성화 시키기 위해서 splash screen의 try & catch문을 통해서 시작해주면 된다.

 

다음으로 다른 컴포넌트와 함께 사용하기 위해 useContext hook을 사용할것이다. 

// Context.js
//App에서 그냥 사용하게되면 경고창이 뜬다 보통 createContext는 따로 파일을 둔다.
export const DATAContext = React.createContext();

//App.js

export default function App() {
  SplashScreen.preventAutoHideAsync();
  const [appReady, setAppReady] = useState(false);
  const [realm , setRealm] = useState(null)
  useEffect(() => {
    async function prepare() {
      try {
		const connection = await Realm.open){
		path: "myrealm",
		schema: [TaskSchema]
		});
        setRealm(connection)
        await new Promise((resolve) => setTimeout(resolve, 2000));
      } catch (e) {
        console.warn(e);
      } finally {
        setAppReady(true);
      }
    }
    prepare();
  }, []);
  const onLayoutRootView = useCallback(async () => {
    if (appReady) {
      await SplashScreen.hideAsync();
    }
  }, [appReady]);

  if (!appReady) {
    return null;
  }
  return (
    <View style={{flex: 1}} onLayout={onLayoutRootView}>
      <DATAContext.Provider value={realm}>
        <NavigationContainer>
          <Navigator />
        </NavigationContainer>
      </DATAContext.Provider>
    </View>
  );
}

 

createRealmContext

https://www.mongodb.com/docs/realm/sdk/react-native/quick-start/

2023년 12월 의 공식문서에 따르면 또 다른 방법이 있는데 React Native SDK 문서를 보면 createRealmContext를 사용하는 방법이다. useContext와 사용하는 방식이 비슷한데 설치를 해야하는 것이 하나 더 추가적으로 있다. 

 

install

npm install realm
npm install @realm/react

 

type define

공식문서에서는 정적타입으로 지정해주었다.

// Define your object model
class Profile extends Realm.Object {
  static schema = {
    name: 'Profile',
    properties: {
      _id: 'objectId',
      name: 'string',
    },
    primaryKey: '_id',
  };
}

 

Realm에게 타입알려주기

import React from 'react';
import Realm, {ObjectSchema} from 'realm';
import {createRealmContext} from '@realm/react';

// Define your object model
class Profile extends Realm.Object<Profile> {
  _id!: Realm.BSON.ObjectId;
  name!: string;
  static schema: ObjectSchema = {
    name: 'Profile',
    properties: {
      _id: 'objectId',
      name: 'string',
    },
    primaryKey: '_id',
  };
}
// Create a configuration object
const realmConfig: Realm.Configuration = {
  schema: [Profile],
};

// Create a realm context
const RealmContext = createRealmContext(realmConfig);

export default RealmContext

 

다음과 같이 설정해주면 schema type이 데이터베이스와 연동이 도었고 RealmContext를 전역으로 사용이 가능하다.

 

Write

create의 첫번째는 write하고자 하는 object의 name이다.  그리고 두번째는 그에 해당하는 것들의 값을 넣어주면 끝이다. 

정말 쉽다.

//other.js

const Compname = ({navigation:{goBack})=>{
  const realm = useContext(DATAContext);
  const onClick = () +> {
    realm.write(()=>{
      realm.create("Task",{
        _id: Date.now(),
        name: " state Value ",
        status:  " state Value ",
      })
    })
    //setStateOne(null)
    //setStateOne("")
    goBack() // 이를 이용한다면 state가 저절로 비어져 따로 setState할 필요가 없다.
  }
  return (
    
  )
}

 

createRealmContext으로 Write를 사용하는 경우

const Write = ({navigation: {goBack}}) => {
  const {useRealm} = realmContext;
  const realm = useRealm();
  const [selectEmo, setSelectEmo] = useState(null);
  const [feeling, setFeeling] = useState("");
  const onChangText = (text) => setFeeling(text);
  const onEmoPress = (face) => setSelectEmo(face);
  const onSubmit = () => {
    if (feeling === "" || selectEmo === null) {
      return Alert.alert("please..");
    }
    realm.write(() => {
      realm.create("Feeling", {
        _id: Date.now(),
        emotion: selectEmo,
        message: feeling,
      });
    });
    goBack();
  };
  return (
    <View>

Read

const Home = ({navigation: {navigate}}) => {
  const realm = useContext(DATAContext)
  const [feeling,setFeeling]=useState([])
  
  useEffect(() => {
    const feeling = useRealm.objects("Feeling");
    
    // const anger = feeling.filtered("emotion = '🤬'"); // 필터링도 가능하다.
    
    // 새로운 것을 추가했을 때 그것을 들어주는 함수 어떤 데이터 접근 같은 것을 넣기 위해 함.
	setFeeling(feeling)
    feeling.addListener(()=>{
      console.log( 'detected something')
    });
    return () =>{
      feelings.removeAllListeners()
  }, []);
  return (
    <View>
      <Title>Home</Title>
      <Btn onPress={() => navigate("WRITE")}>
        <Ionicons name="add" color="white" size={30} />
      </Btn>
    </View>
  );
};

createRealmContext으로 Read하는 경우

const Home = ({navigation: {navigate}}) => {
  const {useQuery} = realmContext;
  const feeling = useQuery("Feeling");
  useEffect(() => {
    feeling.addListener(() => {
      console.log("hohoh");
    });
    return () => {
      feeling.removeAllListeners();
    };
  }, []);
  
  //feeling으로 데이터를 출력할수있다.

Sorted(정렬)

const Home = ({navigation: {navigate}}) => {
  const realm = useContext(DATAContext)
  const [feeling,setFeeling]=useState([])
  
  useEffect(() => {
    const feeling = useRealm.objects("Feeling");	
    feeling.addListener((feeling,changes)=>{
      // 첫번째 인자에는 작성한 data들이 담겨져있다.
      /** 두번째 인자에는 array가 있는데 
      deletions insertions modifications newModifications oldModifications가 있다. 
      발생한 일에 대해 더 많은 컨트롤을 할 수 있다. 
      */
    setFeeling(feeling.sorted("_id",true)) // true라면 가장 큰 id에서 작은 순서로 정렬 false는 반대
    });
    return () =>{
      feelings.removeAllListeners()
  }, []);
  return (
    <View>
      <Title>Home</Title>
      <Btn onPress={() => navigate("WRITE")}>
        <Ionicons name="add" color="white" size={30} />
      </Btn>
    </View>
  );
};

 

Delete

지우는 방식은 두가지가 있는데 PrimaryKey를 이용한 삭제 방식과

item을 전체로 보내줘 삭제하는 방식이 있다.

const Home = ({navigation: {navigate}}) => {
  const {useQuery, useRealm} = realmContext;
  const realm = useRealm();
  const feeling = useQuery("Feeling", (feeling) => {
    return feeling.sorted("_id", true);
  });
  
  const onPress = (id) => {
    realm.write(() => {
      const feelRealm = realm.objectForPrimaryKey("Feeling", id);
      realm.delete(feelRealm);
      //realm.delete(id);
    });
  };
  return (
    <View>
      <Title>Home</Title>
      <FlatList
        data={feeling}
        ItemSeparatorComponent={Seperator}
        keyExtractor={(feeling) => feeling._id + ""}
        renderItem={({item}) => (
          <TouchableOpacity onPress={() => onPress(item_id)}> //onPress(item)
            <Record>
              <Emotion>{item.emotion}</Emotion>
              <Message>{item.message}</Message>
            </Record>
          </TouchableOpacity>
        )}
      />

 

Layout Animations

https://reactnative.dev/docs/layoutanimation

Layout을 움직이게 해준다. 수의 변화가 생겨 렌더링이 될때 Animated를 만들지 않고 애니메이션을 진행시킬수 있다.

android 개발자라면 추가적으로 불러와야할 것들이 있는데. 다음과 같다.

import {
  LayoutAnimation,
  Platform,
  UIManager,
  View,
} from 'react-native';

if (
  Platform.OS === 'android' &&
  UIManager.setLayoutAnimationEnabledExperimental
) {
  UIManager.setLayoutAnimationEnabledExperimental(true);
}

 

const Home = ({navigation: {navigate}}) => {
  const {useQuery, useRealm} = realmContext;
  const realm = useRealm();
  const feeling = useQuery("Feeling", (feeling) => {
    return feeling.sorted("_id", true);
  });
  useEffect(() => {
    feeling.addListener((feeling, changes) => {
      LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
      //LayoutAnimation.easeInEaseOut() 도 가능하다
    });
    return () => {
      feeling.removeAllListeners();
    };
  }, []);
  const onPress = (id) => {
    realm.write(() => {
      const feelRealm = realm.objectForPrimaryKey("Feeling", id);
      realm.delete(feelRealm);
    });
  };
728x90
반응형

Prisma 란?

prisma는 Node.js와 TypeScript ORM이다.

ORM은 Object Relational Mapping이라는 뜻이고 기본적으로 번역기의 역할을 한다고 생각하면된다.

JavaScript 혹은 TypeScript 코드와 DB사이에 다리를 놓아준다.

(mongo DB의 Mongoose를 떠올리면 쉬울것 같다.)

 

Prisma를 사용하기전에 데이터베이스가 어떻게 생겼는지를 schema.prisma라는 파일에 설명해줘야한다.

예를 들면 아래와 같다.

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider     = "mysql"
  url          = env("DATABASE_URL")
  relationMode = "prisma"
}

model User {
  id        Int      @id @default(autoincrement())
  name      String
  phone     Int?     @unique
  email     String?  @unique
  avatar    String?
  createAt  DateTime @default(now())
  updatedAt DateTime @updatedAt
}

이러한 타입에 관한 정보를 알고 있으면, Clinet를 생성해 줄 수 있다.

Client를 이용하면 타입스크립트로 데이터베이스와 직접 상호작용할 수 있다. 

prisma에게 DB가 어떻게 생겼느지 설명해주면 Prisma는 Client를 생성해 줄 거고 그 Client 안에 필요한 모든 name이 들어있을 것이다.

 

더불어  Prisma Studio라는 Visual Database Browser있는데 이것은 데이터베이스를 위한 관리자 패널(Admin panel) 같은 것이다.

데이터베이스는 PostgreSQL / MySQL / SQL Server / SQLite / MongoDB에 사용할 수 있다.  

Prisma Setup

1. VSCode에서 PRISMA EXTENTIONS찾아서 설치

2. Prisma 설치

npm i prisma -D

3. 설치 후 Prisma 불러오기 (Prisma를 사용할 때면 항상 npx prisma 라는 명령어 사용)

npx prisma init

위 코드를 입력시 application 안에 prisma 폴더가 생겼고 .env 파일도 생성이됨

생성 후에 VSCode 터미널에 다음으로 해야할 사항들이 나열되어있는데 

  1. .env파일에 있는 DATABASE_URL을 설정해줘야함 . 초기설정에 postgresql이 설정되어 있는데 자신이 사용하는 DB URL을 기입
  2. schema.prisma 파일에서 datasource의 provider를 설정 해야함
// This is your Prisma schema file,

datasource db {
  //provider는 우리가 사용할 데이터베이스를 말한다.
  provider     = "mysql"
  url          = env("DATABASE_URL")
  relationMode = "prisma"
}


//사용할 user에 대한 schema를 만들어준다. 만들때 model이라고 작성 후 이름을 붙어주고 사항들을 붙어준다.

model User {
  id        Int      @id @default(autoincrement())
  //@id는 모델의 id라는 걸 알려주는 역할을 하며 유니크한 식별자이다.
  //@default로 기본값을 지정해주는데 autoincrement로 자동으로 증가하는 field로 설정함.
  
  name      String
  phone     Int?     @unique
  //?의 표시는 값이 들어올수도 아닐수도 있다는 표시이며 @unique라는 걸 붙이게 되면 값이 중복될수가 없다.
  
  email     String?  @unique
  avatar    String?
  
  createAt  DateTime @default(now())
  //user가 만들어지고 난 시점(now())을 넣어준다.
  
  updatedAt DateTime @updatedAt
  // @updateAt은 유저가 업데이트 될 때마다 이 field값이 변할 거라고 prisma에게 알려줄거다.
}

 

 

PlanetScale

(이하 pscale)

pscale은 MySQL과 호환되는 Serverless 데이터베이스 플랫폼이다. 

이 말은 즉슨, 데이터베이스를 제공해주며 , serverless는 정말로 서버가 없다는 것이 아니라 , 서버를 우리가 유지보수할 필요가 없다는 뜻이다.

예를 들어 백만명이 작업자의 데이터베이스에 연결되면 직접 scaling(확장)시켜줘야하는데 이런 플랫폼을 사용하면 그런 작업을 대신 해준다. 

 

vitess - pscale에 따르면 가장 scaling 기능이 뛰어난 오픈 소스데이터베이스이다. vitess는 유튜브를 scale하기 위해 구글이 만든 것.

vitess는 대기업들이 규모에 맞게 MySQL을 scale하기 위해 쓰는 방법이다. 

 

pscale은 CLI가 있다.  CLI로 데이터베이스를 다룰 수 있다. 어떠한 Model을 수정한다면 모두가 사용하는 메인 데이터베이스를 직접 수정하는 대신 데이터베이스에 brach를 만들수가 있다. 그 brach에서 schema도 바꾸고 새로 model도 만들고 field도 수정할 수 있다.  수정 후에는  schema를 옮기는 건데 그걸 알아서 합쳐줄것이다.

 

PlanetScale Connecting

**pscale을 연결하기 위해서는 일단 회원가입을하고 카드를 등록해줘야 원할히 연결할 수 있다. 

 

1 . CLI를 사용을 위해 터미널에 명령어를 입력해준다. (mac 사용자)

brew install planetscale/tap/pscale

brew install mysql-client

 

window 유저라면 scoop을 통해 다운로드 (scoop은 콘솔을 통해서 쉽게 다운로드 받게 해줄수 있는 도구 https://scoop.sh)

설치가 완료됬다면 VSCode 터미널에서 pscale를 입력하면 그와 관련된 명령어들이 나온다.

 

2. 설치 후에는 pscale auth login 을 통해 로그인 해준다. 이때 카드 등록은 필수이며 vscode의 터미널에 나오는 숫자와 브라우저에 나오는 숫자를 잘 대조한다.

 

3. vscode로 다시 돌아와서 pscale region list를 터미널에 작성하면 slug의 태그 이름을 복사해서 

pscale database create 프로젝트이름 --region "region slug"

이러면 데이터베이스가 만들어질것이다.

 

4. pscale의 관리자 패널로 가보면 만들어져 있는 것을 볼 수 있을 것이다. (브라우저에서 로그인 후 확인)

 브라우저에서도 데이터베이스를 만들 수 있다. 

 

5.  prisma와 연결하기 위해 .env에 있는 DATABASE_URL를 바꿔줘야하는데 보통 데이터베이스 플랫폼에서는 데이터베이스를 하난 만들면 암호를 생성해야한다. 암호를 환경파일에 집어넣어야한다. 이렇게 되면 내 장치에 암호가 저장되는 꼴이 되어서 보안에 취약할 수 있다.

따라서 사람들이 보통하는 방식은 컴퓨터로 작업할 때 직접 진짜 데이터베이스를 건들지 않고  가짜와 진짜로 두 개의 데이터베이스를 운영한다. 

대신에 pscalse에서는 일종의 보안 tunnel을 이용할 수 있다. 컴퓨터와 pscale 사이에 암호를 알 필요가 없어진다. 

pscale 보안연결을 하기 위해서는 CLI를 활용해야한다. 

pscale connect 데이터베이스이름

이렇게 작성하면 터미널에 URL이 나온다.

Local address to connect your application: 127.0.0.1:3306 (press ctrl-c to quit)

콘솔을 절대 종료하지 않고  URL을 복사하여  env파일에 작성해준다.

DATABASE_URL="데이터베이스관리시스템이름://콘솔창에 나온 URL/프로젝트명"

이렇게 하면 pscalse와 연결이 되었다.

 

6. 연결 후 해야하는게 있는데 MySQL은 하는데 vitess는 하지 않는 몇가지가 있는데 그중에 foreign key 제약이다.

 

 

/* 

foreign key는 예를 들어

User DB: [
{id:1 , userName :"hoho"}
]

게시판 DB:[
{게시물의 id:1 , text:"hahahoho", 작성자: userID(1)}
]

이렇게 되면 게시판의 게시글의 작성자가 누가 누군지 알게 된다.
이러한 방식을 foreign key라고 한다.
MySQL이나 postgreSQL은 이러한 방식을 사용하지만 vitess는 이러한 방식을 사용하지 못한다.

만약 게시물의 작성자 id가 5가 되었다면 작동되지 않았겠지만 pscale에서는 아무 문제 없이 작동이 된다.
이게 작동되는 이유는 MySQL과 vitess의 차이점 때문이다.
vitess는 Scalability에 특화되어 있다.
vitess는 데이터베이스를 잘게 쪼개서 여러 서번에 분산시키는데에 특화되어 있다.
vitess는 게시물을 생성하기 전에 사요자가 존재의 유무를 확인하지 않는다.

그래서 보통은 데이터베이스에게 도움을 받아 존재의 유무를 확인한다. 하지만 우리는 prisma를 사용해 도움을 받을 수 있다. 

*/

//schema.prisma

//... 기존 코드들

datasource db {
  provider     = "mysql"
  url          = env("DATABASE_URL")
  // 아래 코드 추가
  relationMode = "prisma"
}

코드 추가 후에 VSCode 콘솔 창에 작성

npx prisma db push

후에 pscale의 해당 데이터베이스 Brach로가면 schema.prisma에서 작성한 모델이 올라가있는것을 볼 수 있다.

npx prisma studio

위의 명령어를 입력하게 되면 데이터 베이스 관리자 패널을 볼 수 있다.

 

Prisma Client

prisma가 prisma client라는걸 제공해준다.

npm i @prisma/client

 

typescript 파일을 만들고

import {PrismaClient} from "@prisma/client";

export default new PrismaClient();
npx prisma generate

client를 생성했다는 메세지를 볼 수 있다.

prisma client는 브라우저에서 실행할 수 없다. 프론트 단에서 실행할 수 없다.

DB에 접근하는 것은 프론트단에 작성하면 안된다.

 

API ROUTES (next.js)

prisma client를 접근하기 위해 서버, 즉 백엔드 코드를 작성할 곳이 필요하다.

보통같으면 백엔드로 nodejs를 사용해서 백엔드 코드를 작성할텐데 NextJS는 API를 만들기 위해 다른 서버를 구축할 필요가 없을 정도로 좋다.

app 폴더에 api 폴더를 만들고 route.ts를 만든다. 이렇게 만들면 api서버가 완성된다.

import {NextResponse} from "next/server";
import client from "../../../../util/client";
//Next JS에서 req,res object를 제공하는데 TS사용한다면 다음과 같이 지정
export async function GET() {
  await client.user.create({
    data: {
      name: "hahah",
      email: "11@22.22",
    },
  });

  return NextResponse.json({
    ok: true,
    data: "xxx",
  });
}

이후 Prisma studio에 들어와서 확인하면 유저가 생성된걸 볼 수 있다. 이때 prisma와 pscale은 계속 연결이 되어야 한다.

728x90

+ Recent posts