React

[React-query] ๋ฐ์ดํ„ฐํ†ต์‹ ์„ ์œ„ํ•œ useMutation ๊ฐœ๋…๊ณผ hooks ์‚ฌ์šฉ๋ฒ•

martinooo 2024. 7. 16. 19:24
728x170

 

 

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œ


react-query๋Š” React์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ ๋‹ค์–‘ํ•œ ํ›…๊ณผ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ๋ฉฐ ๊ฐœ๋ฐœ์ž์˜ ํŽธ๋ฆฌ์„ฑ๊ณผ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.

๋ณธ๋ก ์— ์•ž์„œ ์•„๋ž˜์˜ ๊ธ€๋“ค์„ ์ฝ๊ณ  ์˜ค์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

useMutation๋Œ€ํ•œ ๊ธ€์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

 


react-query ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ

https://cometruedream.tistory.com/130

 

React-query ์ƒํƒœ ๊ด€๋ฆฌ

๐Ÿ“–React-query ์•Œ๊ธฐ์ „์— JSX๋ž€?JSX(javascript XML)๋Š” javascript์— XML์„ ์ถ”๊ฐ€ํ•œ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์ด๋‹ค.JSX๋Š” React์—์„œ ์‚ฌ์šฉ๋˜๋Š”๋ฐ ๊ณต์‹์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.JSX๋Š” javascript ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ๋ฐ”๋ฒจ๋“ฑ๋“ฑ์„

cometruedream.tistory.com

 

 

react-query ๋ฐ์ดํ„ฐ ํ”„๋ฆฌํŽ˜์นญ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ

https://cometruedream.tistory.com/251

 

[React-query] ๋ฐ์ดํ„ฐ ํ”„๋ฆฌํŽ˜์นญ ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œํ’€์Šคํƒ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์„ ์šฐ์„ ์œผ๋กœ ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์šฐ์„ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋ ค ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์–ผ๋งˆ ์ „์— ์ฝ์€ ์ฑ…์—์„œ"๊ฐœ๋ฐœํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ˆ˜๊ณ ๋กญ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜

cometruedream.tistory.com

 

 

refetch ์˜ต์…˜๊ณผ ์‚ฌ์šฉ๋ฒ• ์ด ์ •๋ฆฌ

https://cometruedream.tistory.com/252

 

[React-query] refetch ์˜ต์…˜๊ณผ ์‚ฌ์šฉ๋ฒ• ์ด ์ •๋ฆฌ

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œreact-query๋Š” React์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์บ์‹ฑํ•˜๊ณ , ๋™๊ธฐํ™”ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํ›„ํฌ์™€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ™œ์šฉ์€ React์˜ ์ „๋ฐ˜

cometruedream.tistory.com

 

๐Ÿคท‍โ™‚๏ธ useMutation ๊ฐœ๋…?


useMutation์€ React Query์—์„œ ์ œ๊ณตํ•˜๋Š” ํ›…์œผ๋กœ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…(HTTP ๋ฉ”์„œ๋“œ: POST, PUT, PATCH, DELETE)์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

useMutation์€ ์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š”๋ฐ ๋งค์šฐ ํšจ์œจ์ ์ด๋ฉฐ, ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

useMutation ์œ ์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฆฌ์•กํŠธ ์ธ๊ธฐ ์žˆ๋Š” ์ด์œ ?

ํ”„๋ŸฐํŠธ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฆฌ์•กํŠธ๋ฅผ ์ข‹์•„ํ•˜๋Š” 8๊ฐ€์ง€ ์ด์œ ์— ๋Œ€ํ•ด ๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

https://fnfentermagazine.com/%ed%94%84%eb%a1%a0%ed%8a%b8%ea%b0%9c%eb%b0%9c%ec%9e%90%ea%b0%80-%eb%a6%ac%ec%95%a1%ed%8a%b8%eb%a5%bc-%ec%a2%8b%ec%95%84%ed%95%98%eb%8a%94-8%ea%b0%80%ec%a7%80-%ec%9d%b4%ec%9c%a0/

 

ํ”„๋ก ํŠธ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฆฌ์•กํŠธ๋ฅผ ์ข‹์•„ํ•˜๋Š” 8๊ฐ€์ง€ ์ด์œ 

๋ฆฌ์•กํŠธ๋Š” ํŽ˜์ด์Šค๋ถ์—์„œ ๊ฐœ๋ฐœํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 2013๋…„ ์ฒ˜์Œ ์ถœ์‹œ๋œ ์ดํ›„๋กœ, ๋ฆฌ์•กํŠธ๋Š” ๋น ๋ฅด๊ฒŒ ์ธ๊ธฐ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ๊ฐœ๋ฐœ์ž๊ฐ€

fnfentermagazine.com

 

 

300x250

 

๐Ÿคท‍โ™‚๏ธ useMutation ์‚ฌ์šฉ๋ฒ•?


Mutation์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

 

  1. useMutation ํ›…์€ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. ์˜ˆ์ œ
import { useMutation } from 'react-query';
import axios from 'axios';

const createPost = async (newPost) => {
  const response = await axios.post('/posts', newPost);
  return response.data;
};

const MyComponent = () => {
  const { mutate }  = useMutation(createPost);

  const handleCreatePost = () => {
     mutate({ title: 'New Post', content: 'Hello World' });
  };

  return (
    <div>
      <button onClick={handleCreatePost}>Create Post</button>
      {mutation.isLoading && <p>Creating post...</p>}
      {mutation.isError && <p>Error creating post</p>}
      {mutation.isSuccess && <p>Post created successfully!</p>}
    </div>
  );
};

 

์œ„์— ์˜ˆ์ œ์ฒ˜๋Ÿผ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ useMutation ์‚ฌ์šฉ๋ฒ•์ด๋ฉฐ HTTP ๋ฉ”์„œ๋“œ POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

useMutation ํ›…์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ 4๊ฐ€์ง€์˜ ์ฝœ๋ฐฑ ์˜ต์…˜

  1. useMutation ํ›…์€ ‘onSuccess’, ‘onError’, ‘onSettled’์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ฝœ๋ฐฑ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜ˆ์ œ
const mutation = useMutation(createPost, {
  onSuccess: (data) => {
    console.log('์„œ๋ฒ„์™€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ:', data);
  },
  onError: (error) => {
    console.error('์„œ๋ฒ„์™€ ํ†ต์‹  ์˜ค๋ฅ˜:', error);
  },
  onSettled: () => {
    console.log('์„œ๋ฒ„์™€ ํ†ต์‹ ์ด ์‹คํŒจํ•˜๋“  ์•ˆํ•˜๋“  ํ˜ธ์ถœ');
  },
});

 

์œ„์— ์˜ˆ์ œ์ฒ˜๋Ÿผ useMutation ํ›…์˜ 4๊ฐ€์ง€ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

 

 

onMutate, onSuccess, onError, onSettled ์˜ต์…˜ ์•Œ์•„๋ณด๊ธฐ

 

  1. onMutate
    1. useMutation ํ›…์ด ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    2. ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— ์ฒ˜๋ฆฌํ•ด์•ผ ๋˜๋Š” ๋กœ์ง์„ onMutate์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ์„œ๋ฒ„์™€ ํ†ต์‹ ์ง์ „ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ• ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. onSuccess
    1. ์„œ๋ฒ„์™€ ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต๊ฐ’์„ ๋Œ๋ ค์คฌ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    2. ์„œ๋ฒ„์™€ ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผ๋˜๋Š” ๋กœ์ง์„ onSuccess์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ์„ฑ๊ณต ๋ฉ”์‹œ์ง€, ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ์ด๋™์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  3. onError
    1. ์„œ๋ฒ„์™€ ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    2. ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•ด์•ผ ๋˜๋Š” ๋กœ์ง์„ onError์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ์„œ๋ฒ„์™€ ํ†ต์‹  ์‹คํŒจ ์‹œ ์—๋Ÿฌ๋ฉ”์‹œ์ง€, ์‚ฌ์šฉ์ž์— ๊ฐ€์ด๋“œ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. onSettled
    1. ์„œ๋ฒ„์™€ ์š”์ฒญ์ด ๋๋‚œ ํ›„ ์„ฑ๊ณตํ•˜๋“  ์‹คํŒจํ•˜๋“  ํ•ญ์ƒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ํ˜ธ์ถœ์„ ์•ˆ ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.
    2. ์š”์ฒญ์ด ๋๋‚˜๊ณ  ํ•ญ์ƒ ์ฒ˜๋ฆฌํ•ด์•ผ ๋˜๋Š” ๋กœ์ง์„ onSettled์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ์„œ๋ฒ„์™€ ํ†ต์‹ ์ด ์™„๋ฃŒ ํ›„ ๋กœ๋”ฉ๋ฐ”๋ฅผ ํ•ด์ฒดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์œ„์— 4๊ฐ€์ง€ ์˜ต์…˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ

import { useMutation } from '@tanstack/react-query';

const sendText = async (message) => {
  // ์„œ๋ฒ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ํ•จ์ˆ˜
};

const useSendText = () => {
  const { mutate: send } = useMutation({
    mutationFn: sendText,
    onMutate: () => {
      // ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์ง์ „์— ํ˜ธ์ถœ
      console.log('๋ฌธ์ž๋ฅผ ๋ณด๋‚ด๋Š” ์ค‘...');
    },
    onSuccess: () => {
      // ๋ฉ”์‹œ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋ณด๋‚ธ ํ›„ ํ˜ธ์ถœ
      console.log('๋ฌธ์ž๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋ณด๋ƒˆ์–ด์š”!');
    },
    onError: (error) => {
      // ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ
      console.log('๋ฌธ์ž ๋ณด๋‚ด๊ธฐ์— ์‹คํŒจํ–ˆ์–ด์š”. ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.');
    },
    onSettled: () => {
      // ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ๊ฐ€ ๋๋‚˜๋ฉด ํ•ญ์ƒ ํ˜ธ์ถœ (์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“ )
      console.log('๋ฌธ์ž ๋ณด๋‚ด๊ธฐ ์ž‘์—…์ด ๋๋‚ฌ์–ด์š”.');
    },
  });

  return send;
};

 

useMutation ์‹ค์ œ ์˜ˆ์ œ

import { useMutation, useQueryClient } from 'react-query';
import axios from 'axios';

const deletePost = async (postId) => {
  await axios.delete(`/posts/${postId}`);
};

const MyComponent = () => {
  const queryClient = useQueryClient();

  const { mutate: send } = useMutation(deletePost, {
    onSuccess: () => {
      queryClient.invalidateQueries('posts');
    },
  });

  const handleDelete = (postId) => {
    send(postId);
  };

  return (
    <div>
      <button onClick={() => handleDelete(1)}>Delete Post</button>
      {mutation.isLoading && <p>Deleting post...</p>}
      {mutation.isError && <p>Error deleting post</p>}
      {mutation.isSuccess && <p>Post deleted successfully!</p>}
    </div>
  );
};

 

์œ„์— ์˜ˆ์ œ์ฒ˜๋Ÿผ ์‹ค์ œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” useMutation ๋กœ์ง์ž…๋‹ˆ๋‹ค.

์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต์‹  ํ›„ onSuccess ํ˜ธ์ถœํ•˜๊ณ  ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” react-query ์ œ๊ณตํ•˜๋Š” invalidateQueries ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

queryClient.invalidateQueries ๋ฌด์—‡์ธ๊ฐ€?

queryClient.invalidateQueries ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์ฟผ๋ฆฌ์˜ status๋ฅผ ์ฆ‰์‹œ stale๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹จ์—์„œ refetch๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

useMutation ํ›…์Šค์—์„œ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต์‹  ํ›„์— ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

๐Ÿคท‍โ™‚๏ธ ๋งˆ์ง€๋ง‰์œผ๋กœ


useMutation์— ๊ฐœ๋…๊ณผ ํ™œ์šฉํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ์ค‘์š”ํ•œ 4 ์ž๊ธฐ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์„œ๋ฒ„ ์š”์ฒญ์˜ ๋‹ค๋ฅธ ๋‹จ๊ณ„์—์„œ ํ˜ธ์ถœ๋˜๋ฉฐ ๊ฐ๊ฐ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํšจ์œจ์ ์œผ๋กœ ์„œ๋น„์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

useMutation ํ›…์Šค๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ๋งค์šฐ ํšจ์œจ์ ์ด๋ฉฐ ๋‹ค์–‘ํ•œ ์˜ต์…˜๋“ค์„ ํ™œ์šฉํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹์€ UI/UX ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


 

์žฌ๋ฐŒ๋Š” ์˜ค๋Š˜์˜ ๋ ๋ณ„ ์šด์„ธ ๋ณด๊ณ  ๊ฐ€์„ธ์š”! 

 

https://fnfentermagazine.com/%ec%8a%a4%ec%bd%94%ed%94%84%ec%9d%98-%ea%b0%9c%eb%85%90/

 

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ 1ํƒ„] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค์ฝ”ํ”„์˜ ๊ฐœ๋…๊ณผ ์˜ˆ์ œ ์•Œ์•„๋ณด๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค์ฝ”ํ”„์˜ ๊ฐœ๋…, ์Šค์ฝ”ํ”„(scope)๋Š” ๋ฒ”์œ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์Šค์ฝ”ํ”„๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„

fnfentermagazine.com

 

 

https://cometruedream.tistory.com/247

 

[React] Tailwind ํ•œ์ค„, ๋‘์ค„, ์„ธ์ค„ ํšจ๊ณผ className ์ปค์Šคํ…€

๐Ÿคท‍โ™‚๏ธ Tailwind ํ•œ์ค„, ๋‘์ค„, ์„ธ์ค„ ํšจ๊ณผํ”„๋กœ์ ํŠธ ์ง„ํ–‰์ค‘ ๋ฐฐ๋„ˆ ๋งํฌ์— URL ๊ธธ์ด๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์„œ 3์ค„ ํšจ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. React + Tailwind CSS ์…‹ํŒ…๋œ ํ”„๋กœ์ ํŠธ ์—ฌ์„œ CSS ํŒŒ์ผ & style ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜

cometruedream.tistory.com

 

 

https://cometruedream.tistory.com/243

 

NestJS Lifecycle (์ƒ๋ช…์ฃผ๊ธฐ) ๊ฐœ๋…

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œ Nest JS ๊ฐœ๋…?Nest JS๋Š” Node JS ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์„œ๋ฒ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒ๋‹นํžˆ ์˜ค๋žซ๋™์•ˆ Express ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ์••๋„์ ์ธ ์ 

cometruedream.tistory.com

 

 

https://cometruedream.tistory.com/242

 

๋ฆฌ์•กํŠธ Vite Proxy ํ™œ์šฉํ•œ CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œํ”„๋ก ํŠธ์—”๋“œ ๋ฒˆ๋“ค๋Ÿฌ ๊ฐœ๋…๊ณผ webpack vs vite ๋น„๊ต์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ๊ธ€์„ ๋ณด์‹œ๋ฉด ๋” ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค^^ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋ฒˆ๋“ค๋Ÿฌ ๊ฐœ๋…๊ณผ webpack vs vite ๋น„๊ตhttps://comet

cometruedream.tistory.com

 

 

https://cometruedream.tistory.com/241

 

React ํด๋”๊ตฌ์กฐ FSD ๊ธฐ๋Šฅ ๋ถ„ํ™œ ์„ค๊ณ„ ์•„ํ‚คํ…์ฒ˜

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ํด๋” ๊ตฌ์กฐ, ์„ค๊ณ„์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ต๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— React FSD ํด๋”๊ตฌ์กฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ์˜ˆ์ •์ด๋ผ์„œ FSD ์•„ํ‚คํ…

cometruedream.tistory.com

 

 

https://cometruedream.tistory.com/244

 

์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” Prisma ๋ช…๋ น์–ด ์ •๋ฆฌ

๐Ÿคท‍โ™‚๏ธ Prisma ๋ช…๋ น์–ด ๋ณธ๋ก ์— ์•ž์„œ Prisma๋ž€?Nest JS ํ”„๋ ˆ์ž„์›Œํฌ์™€ Prisma ORM์„ ํ™œ์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Prisma๋Š” Node JS ๊ธฐ๋ฐ˜์— ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ์ž˜๋˜๋ฉฐ Prisma + DB ์—ฐ๋™์œผ

cometruedream.tistory.com

 

 

 

๊ทธ๋ฆฌ๋“œํ˜•