๐Ÿ“Œ (1) ์ž์ฒด ํ”„๋กœ์ ํŠธ with-dog UI

seul_velogยท2022๋…„ 10์›” 6์ผ
1
post-thumbnail

ํ•จ๊ป˜ํ•˜๊ฐœ(with-dog) ํ”„๋กœ์ ํŠธ

๊ตฌํ˜„ ์˜์ƒ

๋ฐ˜๋ ค๊ฒฌ MBTI ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์›น ์„œ๋น„์Šค
๐Ÿ“Œ ์‚ฌ์ดํŠธ : https://withdog.me/
๐Ÿ“Œ ์œ ํŠœ๋ธŒ
1๋ถ€ - ๋ฉ”์ธ & ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ & MBTI๊ฒ€์‚ฌ
2๋ถ€ - ๐Ÿ‘‰ ์ฑ„ํŒ… โœ…
3๋ถ€ - ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ


๋ธ”๋กœ๊ทธ ๊ธฐ๋ก

โœจ ํ”„๋กœ์ ํŠธ ๋“ค์–ด๊ฐ€๊ธฐ ๐Ÿ‘‰ (1) ์ž์ฒด ํ”„๋กœ์ ํŠธ with-dog UI
โœจ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๐Ÿ‘‰ (2) ์ž์ฒด ํ”„๋กœ์ ํŠธ with-dog ์ฑ„ํŒ…๊ตฌํ˜„

ํ”„๋กœ์ ํŠธ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์•ž์„œ Websocket๊ณผ Socket.IO ๊ฐœ๋… ์•Œ๊ณ  ์ตํžˆ๊ธฐ. ์‹ค์Šต ํ”„๋กœ์ ํŠธ !

1. JavaScript + Websocket ๐Ÿ‘‰ WebSocket ์œผ๋กœ ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ•ด๋ณด๊ธฐ
2. JavaScript + Socket.IO & React + Socket.IO ๐Ÿ‘‰ Socket.IO๋กœ ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ•ด๋ณด๊ธฐ


ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ ๋ฐ ์ธ์›

  • ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„
    22.08 ~ 22.09

  • ๊ฐœ๋ฐœ ์ธ์›
    Front-end 5๋ช…, Back-end 1๋ช…


๊ตฌํ˜„ ํ•ญ๋ชฉ

  • ํ•„์ˆ˜ ๊ตฌํ˜„
    Nav, ๋ฉ”์ธ ํŽ˜์ด์ง€
    ๋กœ๊ทธ์ธ (์†Œ์…œ๋กœ๊ทธ์ธ) & ํšŒ์›๊ฐ€์ž…
    ๊ฒŒ์‹œํŒ (๋ฉ”์ธ, ๊ธ€์ž‘์„ฑ, ๋””ํ…Œ์ผ)
    MBTI (๊ฒ€์‚ฌ, ๊ฒฐ๊ณผ)
    ์ฑ„ํŒ…๋ฐฉ (๋ฆฌ์ŠคํŠธ, ์ฑ„ํŒ…๋ฐฉ) โœ”๏ธ
    ๋งˆ์ดํŽ˜์ด์ง€
    ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€

  • ์ถ”๊ฐ€ ๊ตฌํ˜„
    ์‚ฐ์ฑ… ์‹œ์Šคํ…œ


๐Ÿ“Œ focus
3์ฐจ ํ”„๋กœ์ ํŠธ๋Š” ์•„๋ž˜ ๋‚ด์šฉ๋“ค์„ ๋ชฉํ‘œ๋กœ ์ง„ํ–‰๋˜์—ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ๊ธฐํš๋ถ€ํ„ฐ ๋””์ž์ธ, ๊ฐœ๋ฐœ, ๋ฐฐํฌ๊นŒ์ง€์˜ ์ „ ๊ณผ์ • ํŒ€ํ˜‘์—…
  • 1,2์ฐจ ํ”„๋กœ์ ํŠธ์‹œ ๊ฐ์ž ํ•ด๋ณด์ง€ ๋ชปํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„
  • ์Šคํ”„๋ฆฐํŠธ ์ผ์ •์— ๋งž๋Š” ์ž‘์—… ์ง„ํ–‰๊ณผ ์†๋„ ๊ฐœ์„ 
  • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ฐœ์„ 
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ฐ์Šต
  • ๋ฆฌ๋•์Šค ๋ฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ

๊ธฐ์ˆ  ์Šคํƒ

  • Front-end
    : HTML/CSS, JavaScript, React, React-Router, React-Redux, TypeScript, Socket.IO, Styled-Component, AWS(EC2)

  • Back-end
    : Python, Django web framework, Django Ninja, Postgresql, python-socketio , MongoDB(pymongo) / AWS S3, RDS, EC2, NGINX, Heroku, MongoDB Cloud, Gunicorn and Eventlet worker


ํ˜‘์—…๋„๊ตฌ

GitHub, Slack, Notion



์ดˆ๊ธฐ์„ธํŒ… & ์ปจ๋ฒค์…˜

๐Ÿ“Œ yarn ๋Œ€์‹ ์— npm์‚ฌ์šฉํ•˜๊ธฐ.
๐Ÿ“Œ ๋‹จ์œ„, Naming, Type Appointment, CSS ์†์„ฑ ์ˆœ์„œ, Commit Role, , UI ๊ตฌ์„ฑ ํฌ๊ธฐ, React import ์ปจ๋ฒค์…˜ ์ง€์ •

๐Ÿ“Œ ์„ค์น˜ํŒŒ์ผ ๋‚ด์šฉ

// ๋ฆฌ์•กํŠธ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋” ์„ค์น˜
npx create-react-app with-dog โ€”template typescript 
npm install react-router-dom --save

// ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๋ฆฌ์•กํŠธ, ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋”, ๋ฆฌ์•กํŠธ ๋”
// ๋งŒ์•ฝ package.json์— types/react, react-dom์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๊ฒƒ(์˜ค๋ฅ˜ ๋ฐœ์ƒ ์›์ธ)
npm install โ€”save @types/react,react-dom,react-router-dom

// ํƒ€์ž… ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ ์„ค์น˜
npm install โ€”save @types/styled-components  

// TypeScript์—์„œ eslint, prettier ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์น˜ ์ž‘์—…
npm i -D typescript eslint prettier
npm i -D @typescript-eslint/eslint-plugin @typescript-eslint/parser # ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ
npm i -D eslint-config-prettier eslint-plugin-prettier # prettier ํ”Œ๋Ÿฌ๊ทธ์ธ

// react ํ™˜๊ฒฝ์—์„œ์˜ react + redux ์„ค์น˜
npm i redux react-redux
// react + typescript ํ™˜๊ฒฝ์—์„œ์˜ react + redux ์„ค์น˜
npm i --dev @types/react-redux

// axios ์„ค์น˜
npm install axios

๐Ÿ“Œ ๋””๋ ‰ํ† ๋ฆฌ, ํŒŒ์ผ ๊ตฌ์กฐ ์„ธํŒ…

with_dog
โ”œโ”€โ”€ package-lock.json
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ public
โ”‚   โ”œโ”€โ”€ images
โ”‚   โ”‚   โ””โ”€โ”€ dog1.jpg - ์ž„์‹œ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ถ”๊ฐ€
โ”‚   โ””โ”€โ”€ index.html
โ”œโ”€โ”€ src
โ”‚   โ”œโ”€โ”€ Router.tsx
โ”‚   โ”œโ”€โ”€ config.ts
โ”‚   โ”œโ”€โ”€ index.tsx
โ”‚   โ”œโ”€โ”€ pages
โ”‚   โ”‚   โ”œโ”€โ”€ Admin
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Admin.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ Chatting
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Chatting.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ Login
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Login.tsx
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SignIn
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ SignIn.tsx
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Signup
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Signup.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ MBTI
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ MBTI.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ Main
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Main.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ MainRouter
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ MainRouter.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ Mypage
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Mypage.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ NoticeBoard
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ NoticeBoard.tsx
โ”‚   โ”‚   โ””โ”€โ”€ components
โ”‚   โ”‚       โ”œโ”€โ”€ Footer
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ Footer.tsx
โ”‚   โ”‚       โ””โ”€โ”€ Nav
โ”‚   โ”‚           โ””โ”€โ”€ Nav.tsx
โ”‚   โ””โ”€โ”€ styles
โ”‚       โ”œโ”€โ”€ GlobalStyles.tsx
โ”‚       โ””โ”€โ”€ Theme.tsx
โ””โ”€โ”€ tsconfig.json - "baseUrl": "./src" ์ฝ”๋“œ ์ถ”๊ฐ€

1) Router.tsx

import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Signup from './pages/Login/Signup/Signup';
import MainRouter from './pages/MainRouter/MainRouter';

const Router = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/signup" element={<Signup />} />
        <Route path="/*" element={<MainRouter />} />
      </Routes>
    </BrowserRouter>
  );
};

export default Router;

2) MainRouter.tsx

  • ์ค‘์ฒฉ ๋ผ์šฐํŒ…
  • ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ์ œ์™ธ Nav, Footer ์ ์šฉ ๋ชฉ์ 

3) config.ts

export const BASE_URL = 'http://...';
const API = {
  signUp: `${BASE_URL}/users/signup`,
  signIn: `${BASE_URL}/users/login`,
  ...
};
export default API;

4) index.tsx
5) GlobalStyles.tsx
6) Theme.tsx
7) eslintsrc
8) prettierrc
9) tsconfig.json baseUrl ์ถ”๊ฐ€ โ†’ "baseUrl": "./src"
10) j. srcํด๋”์— types ํด๋” ๋งŒ๋“ค๊ณ  svg.d.ts ํŒŒ์ผ ์ถ”๊ฐ€

declare module '*.svg' {
  const value: React.DetailedHTMLProps<
    ImgHTMLAttributes<HTMLImageElement>,
    HTMLImageElement
  >;
  export default value;
}




ChatList UI

์ฑ„ํŒ…๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€ UI ๊ตฌํ˜„

  1. ์ฑ„ํŒ…๋ฆฌ์ŠคํŠธ ๋ ˆ์ด์•„์›ƒ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์™„์„ฑ
  • ChatList UI ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ
  • ์ƒ์ˆ˜๋ฐ์ดํ„ฐ ํ™œ์šฉ -> map ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ UI ๊ตฌํ˜„
  • ์šฐ์ธก ์‚ดํŽด๋ณด๊ธฐ ๋ฒ„ํŠผ hover์‹œ ๋ฐฐ๊ฒฝ์ƒ‰์ƒ ๋ณ€๊ฒฝ

  1. styled-components ์ ์šฉ
  • ์Šคํƒ€์ผ๋“œ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ style ์ž‘์„ฑ

  1. type ์„ค์ •
  • inrerface ChatListProp ์ถ”๊ฐ€

props์™€ type / intrinsicattributes ํ˜•์‹์—๋Ÿฌ์™€ interface props

โ“ 'intrinsicattributes' ํ˜•์‹์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์Šˆ ํ•ด๊ฒฐํ•˜๊ธฐ!

  • title={title} ์— ๋ฐ‘์ค„, ์œ„์™€๊ฐ™์€ ์—๋Ÿฌ๋ฌธ๊ตฌ๊ฐ€ ๋–ด๋‹ค.
const Chatting = () => {
  return (
    <ChattingContainer>
      {CHATLIST_DATA.map(({ id, title, description }) => {
        return <ChatList key={id} title={title} description={description} />;
      })}
    </ChattingContainer>
  );
};

โ—๏ธ๋‹จ์ˆœํžˆ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ props๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ๊ตฌ์กฐ๋กœ ์„ธํŒ…ํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

const ChatList = ({ title, description }: ChatListProp) => { // ์ด๋ถ€๋ถ„
  return (
    <ChatListContainer>
      <ChatListLeft title={title} description={description} />
      <ChatListRight />
    </ChatListContainer>
  );
};

๋‹จ ์—ฌ๊ธฐ์„œ props๋กœ ๋ฐ›์•„์˜ฌ ์š”์†Œ์— ํƒ€์ž…์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค!

export interface ChatListProp {
  id?: number;
  title: string;
  description: string;
}

type โ†’ number | undefined

โ“ ModalHandler์—์„œ id๋ฅผ ๋ฐ›์•„์˜ฌ๋•Œ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค.

โ—๏ธ ์•„๋ž˜์™€ ๊ฐ™์ด ํ˜•์‹์„ ์ถ”๊ฐ€๋กœ ๊ธฐ์žฌํ•ด ์ฃผ์—ˆ๋‹ค.

const ChatListRight = ({ id }: ChatListProp) => {
  const ModalHandler = (id: number | undefined) => { // ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€๋กœ ๊ธฐ์žฌํ•จ
    console.log(id);
  };

  return (
    <GoChatRightContainer
      onClick={() => {
        ModalHandler(id);
      }}
    >
      <GoChatIntro> ์‚ดํŽด๋ณด๊ฐœ </GoChatIntro>
      <GoChatIntroIcon src={ArrowRight} />
    </GoChatRightContainer>
  );
};

์—ฌ๋Ÿฌ๊ฐœ์˜ svg ํŒŒ์ผ ๊ฐ€์ ธ์™€์„œ map ๋ฉ”์„œ๋“œ๋กœ ๋Œ๋ฆฌ๊ธฐ / type ์ง€์ •

๐Ÿ“Œ ์ฐธ๊ณ  stackoverflow

1) svg ํŒŒ์ผ์„ import ํ•ด์˜ค๊ธฐ

import { ReactComponent as Icon1 } from 'assets/svg/ํƒํ—˜๊ฐ€ํ˜•.svg';
import { ReactComponent as Icon2 } from 'assets/svg/์ „๋žต๊ฐ€ํ˜•.svg';
import { ReactComponent as Icon3 } from 'assets/svg/๊พธ๋Ÿฌ๊ธฐํ˜•.svg';
import { ReactComponent as Icon4 } from 'assets/svg/ํ™œ๋™๊ฐ€ํ˜•.svg';

2) map์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•œ ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ ์ž‘์„ฑ

{
    id: 1,
    Image: Icon1,
    title: 'ํƒํ—˜๊ฐ€',
    description:
      '์†Œ์‹ฌํ•˜์ง€๋งŒ ์„ธ์ƒ์ด ๊ถ๊ธˆํ•œ ๋Œ•๋Œ•์ด, ์ธค๋ฐ๋ ˆ ๋Œ•๋Œ•์ด, ๋ชฝ์ƒ์„ ์ฆ๊ธฐ๋Š” ํƒํ—˜์  ๋Œ•๋Œ•์ด๋“ค์„ ์œ„ํ•œ ์ฑ„ํŒ…๋ฐฉ์ž…๋‹ˆ๋‹ค!',
  },

3) type ์„ค์ • ์ž˜ ํ•ด์ฃผ๊ธฐ

export interface ChatListProp {
  id?: number;
  Image?: any; 
  title: string;
  description: string;
}

// any ํƒ€์ž…์ด ์•„๋‹Œ ์ง€์ •์„ ํ•ด์ฃผ๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ์•„์ง ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค.

4) Image ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ๋ฆฌ๊ธฐ

const ChatListLeft = ({ Image, title, description }: ChatListProp) => {
  return (
    <ChatListLeftContainer>
      <Image />
      <DogType>{title}</DogType>
      <Introduce>{description}</Introduce>
    </ChatListLeftContainer>
  );
};

5) style ์†์„ฑ ์ง€์ •ํ•˜๊ธฐ

<Image style={{ width: '100px', marginRight: '16px' }} />

ํƒ€์ž… ์ง€์ •ํ•˜๊ธฐ

  • +) svg.d.ts ํŒŒ์ผ์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€
declare module '*.svg' {
  import React = require('react');
  export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
  const src: string;
  export default src;
}
export interface ChatListProp {
  id?: number;
  Image?: any; 
  title: string;
  description: string;
}

โ“ any ๋ถ€๋ถ„์— React.FC<React.SVGProps<SVGSVGElement>> ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ƒ์œ„์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋œจ์ง€ ์•Š์•˜์ง€๋งŒ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ts(2604)์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค. ๐Ÿฅฒ




ChatList Modal UI

์ฑ„ํŒ…๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€ ๋ชจ๋‹ฌ UI ๊ตฌํ˜„

Aug-23-2022 00-44-37

  1. ๋ชจ๋‹ฌ์ฐฝ UI ๋ ˆ์ด์•„์›ƒ ์ž‘์„ฑ
  • ChatModal UI๋ฅผ ์œ„ํ•œ CHATLIST_DATA ์ถ”๊ฐ€
  • position & top & transform ์†์„ฑ์œผ๋กœ ์ค‘์•™ ๋ฐฐ์น˜

  1. ๋ชจ๋‹ฌ์ฐฝ onClick ์ด๋ฒคํŠธ ์„ค์ •
  • isShowModal ์ƒํƒœ ์ถ”๊ฐ€ ๋ฐ onClickToggleModal ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์ž‘์„ฑ
    • ์šฐ์ธก ์‚ดํŽด๋ณด๊ฐœ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ๋ชจ๋‹ฌ์ฐฝ ๋ณด์ด๊ธฐ (isShowModal ๊ฐ’์ด true๋กœ ์„ค์ •๋จ)
    • ๋ชจ๋‹ฌ์ฐฝ์ด ๋„์›Œ์ง„ ์ƒํƒœ๋กœ ๋ชจ๋‹ฌ์ฐฝ ์™ธ๋ถ€(background) ํด๋ฆญ์‹œ ๋ชจ๋‹ฌ์ฐฝ ๋‹ซ๊ธฐ

  1. type ์„ค์ •
  • inrerface ChatModalProp ์ถ”๊ฐ€

CHATLIST_DATA ์ƒ์ˆ˜๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ

์ฑ„ํŒ… ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ + ๋ชจ๋‹ฌ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ ๋ฅผ ๋ฌถ์–ด์„œ ์ƒ์ˆ˜๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ค๊ณ  ๋”ฐ๋กœ DATA ํด๋”๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.


๋ชจ๋‹ฌ ์ค‘์•™๋ฐฐ์น˜

position ์†์„ฑ๊ณผ top, transform ์†์„ฑ์„ ํ†ตํ•ด์„œ ์ค‘์•™์œผ๋กœ ๋ฐฐ์น˜ํ–ˆ๋‹ค.โœจ

const ChatModalContainer = styled.div`
  ${props => props.theme.flex.flexBox('column')}
  position: fixed;
  top: 50%;
  width: 30rem;
  height: 40rem;
  transform: translateY(-49%);
  background-color: white;
  box-shadow: 1px 1px 15px 2px rgba(0, 0, 0, 0.1);
  border-radius: 1.2rem;
  z-index: 2;
`;

๋ชจ๋‹ฌ show์ƒํƒœ ๋ฐ ํ† ๊ธ€ ํ•จ์ˆ˜๋กœ ํ•ธ๋“ค๋งํ•˜๊ธฐ

  • isShowModal ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ํด๋ฆญ์‹œ ํ† ๊ธ€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด false or true ์ƒํƒœ๋ฅผ ํ•ธ๋“ค๋งํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค.
  • <BackGround onClick={onClickToggleModal} /> ๋ชจ๋‹ฌ์— ํ† ๊ธ€ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํด๋ฆญ์‹œ ํ† ๊ธ€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด isShowModal ์ƒํƒœ๋ฅผ false๋กœ ์„ค์ • ํ•จ์œผ๋กœ์จ ๋ชจ๋‹ฌ ๋ณด์ด๊ธฐ ๋‹ซ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.




React-Redux

โœ๏ธ Redux ๋ฒจ๋กœ๊ทธ ์ •๋ฆฌ (Action, Reducer, Store, CombineReducers)

๐Ÿ“Œ ์ƒํƒœ๊ด€๋ฆฌ

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ๋ณ€๊ฒฝ์ด ์–ด๋ ค์šธ ๋•Œ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์—ฌ๊ธฐ์„œ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  state๋ฅผ ์•„์˜ˆ ์•ˆ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
    โ†’ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ๋งŒ ํ•„์š”ํ•œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ state๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“ Q & A

๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ถ๊ธˆํ–ˆ๋˜ ์ ์—๋Œ€ํ•ด ํ˜„์—…์— ๊ณ„์‹  ๋ถ„๊ป˜ ์—ฌ์ญค๋ณด์•˜๋‹ค. ๐Ÿง โœ๏ธ

Q.
๋ฐฑ์ด๋ž‘ ํ†ต์‹  ์—†๋Š” ํ”„๋ก ํŠธ์—์„œ ํ•„์š”ํ•œ ์ƒ์ˆ˜๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ map์„ ๋Œ๋ ค์„œ ์ฐ์–ด๋‚ด๋Š” ํ˜•ํƒœ๋ผ์„œ ํ”„๋กญ์Šค ๋“œ๋ฆด๋ง์ด ๊ณ„์† ๋“ค์–ด๊ฐ„๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฆฌ๋•์Šค๋ฅผ ์“ฐ๋ฉด ์ „์—ญ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ฌด๋ฐ์„œ๋‚˜ ๋ฝ‘์•„์˜ค๋ฉด ๋˜๋‹ˆ๊นŒ ๋“œ๋ฆด๋ง์„ ์•ˆํ•ด๋„ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋งต์„ ๋Œ๋ฆฌ๊ณ  ํ•„์š”ํ•œ ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค์ฃผ๋Š”๊ฒŒ ๋งž๋Š”๊ฑฐ ๊ฐ™์œผ๋‹ˆ ๋ฆฌ๋•์Šค๋ฅผ ๊ผญ ์จ์•ผํ• ์ง€ ์˜๋ฌธ์ด๋‹ค.

A.
๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ”๋กœ ํ•˜์œ„๋กœ ๋‚ด๋ ค์ค€๋‹ค๊ฑฐ๋‚˜ ๋“œ๋ฆด๋ง์ด ์‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌ๋•์Šค๋ฅผ ์•ˆ์“ฐ๊ณ  ํ”„๋กญ์Šค๋กœ ๋‚ด๋ ค์ค€๋‹ค. ๊ทธ๊ฒŒ ๋” ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ์‰ฝ๊ณ  ์•Œ์•„ ๋ณด๊ธฐ๋„ ์‰ฝ๊ณ  ์ง„์งœ ๋“œ๋ฆด๋ง์œผ๋กœ ์ธํ•ด ์“ธ๋ฐ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๊ฑฐ์ณ๊ฐ€๊ฑฐ๋‚˜ ์ˆ˜ํ‰๊ด€๊ณ„์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์ง€ ์•Š์€ ๊ณณ์œผ๋กœ์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์—์„œ ๋ณดํ†ต ์“ฐ์ธ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋•์Šค๋กœ ๊ฐ€์ ธ์˜จ store ๋ฐ์ดํ„ฐ๋ฅผ map์„ ๋Œ๋ฆด์ˆ˜ ์žˆ๋ƒ ์—†๋ƒ๋ฅผ ๋ฌผ์–ด๋ณธ๋‹ค๋ฉด ๋Œ๋ ค๋„ ์ƒ๊ด€ ์—†๋‹ค. ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ api์—์„œ ๋ฐ›์•„์˜จ ๊ฐ์ฒด๋ฅผ ๋Œ๋ฆด๋•Œ ๋ณดํ†ต ๊ทธ๋ ‡๊ฒŒ ํ•œ๋‹ค. ( ๋น„๋™๊ธฐapi->๋ฏธ๋“ค์›จ์–ด->๋ฆฌ๋•์Šค->store ๊ฐ€์ ธ์™€์„œ map )

Q.
๋งŒ์•ฝ ํ•„์š”์—†๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๋“œ๋ฆด๋ง์ด 1~2๋ฒˆ ์ •๋„ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ฆฌ๋•์Šค๋กœ ๋นผ๋Š”์ง€? ์ฆ‰, ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์ธ ์ƒ์ˆ˜๋ฐ์ดํ„ฐ๋„ Store๋กœ ๊ด€๋ฆฌํ•˜๋Š”์ง€? (ํ˜„์žฌ Data ํด๋”๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ์ƒ์ˆ˜๋ฐ์ดํ„ฐ ๋‹ด์•„์„œ ๊ด€๋ฆฌ์ค‘)

A.
๋ณดํ†ต์€ ์ง„์งœ ํ•„์š”ํ•œ ๊ณณ์—์„œ๋งŒ ์“ด๋‹ค. ์ƒ์ˆ˜๋Š” ๋ณดํ†ต ์•ˆํ•˜๋Š”๊ฑฐ ๊ฐ™๊ณ  ์ƒ์ˆ˜๋Š” ๋ง๊ทธ๋Œ€๋กœ ์จ์•ผ ๋˜๋Š”๊ณณ์—์„œ๋งŒ ๋ฐ”๋กœ ๋งŒ๋“ค์–ด์„œ ์“ฐ๋‹ˆ๊นŒ ์Šคํ† ์–ด ๋งŽ์ด ๋งŒ๋“ค๊ณ  ํ•„์š”์—†๋Š”๊ณณ๊นŒ์ง€ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์“ฐ๋ฉด ๊ทธ๊ฑฐ๋งˆ์ €๋„ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ผ์„œ ์šฐ๋ฆฌ๋„ ๊ตณ์ด ์ž๋ฃŒ์˜ ๋ณ€๋™์ด ์—†๋Š” ๊ฒƒ๋“ค์€ ์ƒ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์„œ data์— ๋„ฃ๊ณ  ์“ฐ๊ณ ์žˆ๋‹ค.
์ƒํƒœ๊ด€๋ฆฌ๋Š” ์ง„์งœ ํ•„์š”ํ•œ๊ณณ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋‹ค ๊ฐ€์ ธ๋‹ค ์จ์•ผํ•˜๋Š”๊ฒƒ, ๋กœ๊ทธ์ธ, ์ธ์ฆ์ธ๊ฐ€, ํ† ํฐ ๋‹คํฌ๋ชจ๋“œ.. ๊ฒŒ์‹œํŒ ๊ด€๋ จ ๋“ฑ๋“ฑ / ๋‹จ์ˆœ ๋“œ๋ฆด๋ง์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

Q.
๋ฆฌ๋•์Šค์™€ ์ปจํ…์ŠคํŠธ๋ฅผ ๋™์‹œ์— ์“ฐ๊ธฐ๋„ ํ•˜๋Š”์ง€?

A.
์ƒํƒœ๊ด€๋ฆฌ๋Š” ํ•˜๋‚˜๋กœ ํ†ต์ผํ•ด์„œ ์จ์•ผ์ง€ ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ์‰ฝ์ง€ ์•Š๊ณ  ์ปจํ…์ŠคํŠธ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ๋ฆฌ๋•์Šค์— ์žˆ๊ณ  ์„ฑ๋Šฅ๋„ ๋ฆฌ๋•์Šค๊ฐ€ ์ข‹๋‹ค.




๐ŸŒˆ ํ•จ๊ป˜ํ•˜๊ฐœ BI


image
image
image
image
image
image
แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-03-09 แ„‹แ…ฉแ„’แ…ฎ 1 35 40




with-dog ํ”„๋กœ์ ํŠธ(2)

ํ”„๋กœ์ ํŠธ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์•ž์„œ Websocket๊ณผ Socket.IO ๊ฐœ๋… ์•Œ๊ณ  ์ตํžˆ๊ธฐ. ์‹ค์Šต ํ”„๋กœ์ ํŠธ !
1. JavaScript + Websocket ๐Ÿ‘‰ WebSocket ์œผ๋กœ ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ•ด๋ณด๊ธฐ
2. JavaScript + Socket.IO ๐Ÿ‘‰ Socket.IO๋กœ ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ•ด๋ณด๊ธฐ
3. React + Socket.IO ๐Ÿ‘‰ Socket.IO๋กœ ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ•ด๋ณด๊ธฐ
โœจ with-dog ํ”„๋กœ์ ํŠธ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๐Ÿ‘‰ โœจโœจ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์ฑ„ํŒ…๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐโœจโœจ

profile
๊ธฐ์–ต๋ณด๋‹จ ๊ธฐ๋ก์„ โœจ

0๊ฐœ์˜ ๋Œ“๊ธ€