๐ถ๐ป์ด๋๋ก ๊ฑท๊ณ ์๋? (28) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ ๐ถ๐ป#28 [Apollo Server & GraphQL & Prisma] - ์๋ฒ์ธํ GraphQL Node.js๋ฅผ ์ด์ฉํด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๋๋ง์ ๋ช ๋ น์ด๋ฅผ ๋ง๋ค๊ณ (Query, Mutation, TypeDefs, resolvers ) CRUD ์์ฒญ, ์๋ต์ ๋ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ API ( ์ฐ๊ฒฐ๋ค๋ฆฌ ) Apollo Server GraphQL ์ ์ฌ์ฉํ๋ ์๋ฒ๋ฅผ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ Node.js ์ ํจํค์ง Prisma prisma ๋ ORM ์ผ๋ก์จ GraphQL ํ์ ์ผ๋ก DB ์ฟผ๋ฆฌ ์กฐํ, ํ ์ด๋ธ ์์ฑ ๋ฑ์ ๋ด๋นํ๋ค GraphQL ๋ก ๋ถ๋ฌ์ค๊ณ ์ถ์ ๋ฐ์ดํฐ์ ๋ผ๋๋ฅผ ๋ง๋ค๊ณ , prisma ๋ฅผ ํตํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค Step 01 - package.json ๋ง๋ค๊ธฐ /* package.json ํ์ผ์ ๋ง๋๋ ๋ช ๋ น์ด */ npm init --yes Step 02 - ํจํค์ง.. ๐ถ๐ป#27 [React & RN] - Flatlist Flatlist vs ScrollView ScrollView ๋ ScrollView ์์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์จ๋ค Flatlist ๋ ํ๋ฉด์์ ๋ณด์ด๋ ๋ฐ์ดํฐ๋ง ๊ฐ์ง๊ณ ์จ๋ค ์ฌ์ฉ๋ฒ ๋ฐ Props import React from "react"; import { FlatList } from "react-native"; ( )} /> ํ์ Props ๋ data ์ renderItem ์ ๋๋ค data ๋ FlatList ์์ ๋ณด์ฌ์ค data array ๋ฅผ ๋งํฉ๋๋ค renderItem ์ data ์ ์ ๋ ฅํ data array ๋ฅผ ํ๋์ฉ ๋ ๋๋ง ์ํต๋๋ค onRefresh ๋ ์คํฌ๋กค ํด์ ์๋ก๊ณ ์นจ ํ ๋ ์ฌ์ฉํฉ๋๋ค refreshing ์ boolean ํ์ผ๋ก ์๋ก๊ณ ์นจ์ด ์งํ์ค์ธ์ง ํ๋ณํฉ๋๋ค ItemSepar.. ๐ถ๐ป#26 [React & RN] - @react-navigation/native, Tab, Stack React Native Navigation, Tab, Stack /* ๋ค๋น๊ฒ์ด์ ์ค์น๋ฒ */ npm install @react-navigation/native npm install react-native-safe-area-context npm install react-native-screens /* Mac OS */ npx pod-install ios /* Tab ์ค์น๋ฒ */ npm install @react-navigation/bottom-tabs /* Stack ์ค์น๋ฒ */ npm install @react-navigation/native-stack How to used /* App.js */ import React from "react"; import { NavigationContainer } fr.. ๐ถ๐ป#25 [Javascript] - export ์ export default ์ ์ฐจ์ด export /* color.js */ export const YELLOW_COLOR = "#ffa801"; export const BLACK_COLOR = "#1e272e"; export const DARK_GREY = "#d2dae2"; export const LIGHT_GREY = "#808e9b"; /* Tabs.js (color.js ์ export ๋์ด์๋ ๋ณ์๋ค์ ์ฌ์ฉํ๋ jsํ์ผ์ ๋๋ค) */ import { BLACK_COLOR, DARK_GREY, LIGHT_GREY, YELLOW_COLOR } from "../colors"; export default /* Movies.js */ import React from "react"; import { View, Text } from "react.. ๐ถ๐ป#24 [React & RN] - ์ฑ์ด ์คํ๋๊ธฐ ์ Preload ํ๋ ๋ฐฉ๋ฒ Apploading /* ์ค์น๋ฒ */ expo install expo-app-loading /* ์ฌ์ฉ๋ฒ */ import AppLoading from 'expo-app-loading'; RN ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ์ด ๋ก๋ฉ์ค ์ผ๋ splash ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค๋ค Apploading ์ ์ฌ์ฉํ๋ฉด ์ฑ์ด ์คํ๋๊ธฐ ์ ์ font, image, ์ฑ ์คํ ์ ํ์ํ DB ์ ๋ณด ๋ฑ๋ฑ ํ์ํ๊ฒ๋ค์ ๋ถ๋ฌ์ฌ์ ์๋ค Case 01 - Apploading Props ์ฌ์ฉํ๊ธฐ import AppLoading from "expo-app-loading"; import React, { useState } from "react"; import * as Font from "expo-font"; import { Text, Image } from.. ๐ถ๐ป#23 [React & RN] - While trying to resolve module '@apollo/client' from file Error Message While trying to resolve module '@apollo/client' from file ... ๋จ์ํ apolloprovider ๋ก app.js ์ return ๋๋ ๋ถ๋ถ์ ๊ฐ์ธ์ฃผ์๋๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค ํด๊ฒฐ๋ฐฉ๋ฒ project root ๊ฒฝ๋ก์ metro.config.js ํ์ผ์ ์์ฑํ๋ค const { getDefaultConfig } = require("metro-config"); const { resolver: defaultResolver } = getDefaultConfig.getDefaultValues(); exports.resolver = { ...defaultResolver, sourceExts: [...defaultResolver.sourceExts, ".. ๐ถ๐ป#22 [React & RN] - some() ๊ณผ filter() ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒดํฌ๋ฐ์ค ํ ๊ธ ํจ์ ๋ง๋ค๊ธฐ Some() some()์ ๋ฐฐ์ด์ ๊ฐ ์๋ฆฌ๋จผํธ์ ๋ํด์ ํจ์์ ๋ฐํ ๊ฐ์ด ํ๋๋ผ๋ true๊ฐ ์๋์ง ํ์ธํ๋ค ํ๋๋ผ๋ true๊ฐ ๋ฐ์ํ๋ฉด true๋ฅผ ๋ฐํํ๋ค ๋ชจ๋ false์ธ ๊ฒฝ์ฐ๋ง false๋ฅผ ๋ฐํํ๋ค /* example */ let testArray = ["walker", "jjh", "tistory"]; const someExample = testArray.some((item) => item == "jjh"); console.log(someExample); Toggle Function /* example */ const [checkbox, setCheckbox] = useState([]); const dataArray = ["walker", "jjh", "tistory"]; const handleC.. ๐ถ๐ป#21 [React] - filter() ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ฒ์๊ธฐ๋ฅ ๋ง๋ค๊ธฐ How to used it? ์ง๋ ๊ธ์ filter() ์ find() ์ ์ฐจ์ด์ ์ ๋ํด ์ ๋ฆฌํ๋ ๊ธ์ด ์๋ค ๊ทธ๊ฑธ ๋ฐํ์ผ๋ก filter() ์ includes() ์ useState() ๋ฅผ ์ฌ์ฉํด์ ์๋ฒ์ ํธ์ถ ์์ด ํด๋ผ์ด์ธํธ ์ชฝ์์ ๊ฒ์๊ธฐ๋ฅ์ ๊ตฌํํด๋ดค๋ค /* ๊ฐ๋จํ ์ฐธ๊ณ ์ฉ ์์ค */ import React from 'react'; const names = ['James', 'John', 'Paul', 'Ringo', 'George']; function App() { return ( {names.filter(name => name.includes('J')).map(filteredName => ( {filteredName} ))} ); } export default App; filter() ์์ inclu.. ๐ถ๐ป#20 [Nest.js] -ValidationPipe + class-validator ์ฌ์ฉํ์ฌ ์ ํจ์ฑ ๊ฒ์ฌํ๊ธฐ Case ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ คํ๋ค title, year, genres ๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ์ ๋ ฅ๋ฐ๋ ๊ฐ๋ค์ Type Validation ๊ณผ ์ ๋ ฅ๋ฐ์์ ์๋ ๊ฐ๋ค์ ๋ํ Validation ์ ํด๋ณด๋ ค๊ณ ํ๋ค Step 01 - ValidationPipe Import ํ๊ธฐ /* main.ts ํ์ผ */ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes( n.. ๐ถ๐ป#19 [Nest.js] - ์ค์น๋ถํฐ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ ์ดํดํ๊ธฐ Nest.js Node.js ๋ก ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ๋, ์กฐ๊ธ ๋ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ ํ๋ ์์ํฌ ๊ธฐ๋ณธ์ ์ผ๋ก TypeScript ๋ฅผ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์, TypeScript ์ ๋ํ ์ดํด๊ฐ ์์ด์ผํ๋ค Nest.js ์ค์นํ๊ธฐ /* ์ค์น */ npm install -g @nestjs/cli /* nest project ์์ฑ */ nest new project-name Nest.js ๊ตฌ์กฐ Nest.js ๋ ๊ธฐ๋ณธ์ ์ผ๋ก main.ts ํ์ผ์ ์ฝ๋๋ค src ํด๋๋ก ์ฐพ์์ค๋ ์ด์ ๋ nest-cil.json ํ์ผ์ ์ด์ด๋ณด๋ฉด ์์์๋ค main.ts > app.module.ts > app.modules.ts ํ์ผ์ ์ ์ธ๋ controller ์ service ๋ฅผ ์ฌ์ฉํ๋ ๊ตฌ์กฐ Nest.js Controller import { Cont.. ์ด์ 1 2 3 ๋ค์