๐ŸŒŸ1์ฐจ ํ”„๋กœ์ ํŠธ - Beats๐ŸŒŸ

GyungHo Goยท2020๋…„ 6์›” 7์ผ
0

Wecode Project

๋ชฉ๋ก ๋ณด๊ธฐ
1/2
post-custom-banner

Wecode 8๊ธฐ๋ฅผ ์‹œ์ž‘ํ•œ์ง€ 6์ฃผ์ฐจ์— 1์ฐจ ํ”„๋กœ์ ํŠธ๋ฅผ 2์ฃผ๊ฐ„ ์ง„ํ–‰ํ•˜์˜€๋‹ค.
ํ”„๋กœ์ ํŠธ ํŒ€์€ 4๋ช…์˜ ๊ฐœ๋ฐœ์ž Front-End 3๋ช…, Back-End 1๋ช… ์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํ˜‘์—…ํ•˜์˜€๋‹ค.

์†Œ๊ฐœ

ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

  • beatsbydre.com ์‚ฌ์ดํŠธ์˜ interface ์™€ ๋™์ผํ•˜๊ฒŒ ํ™”๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ
  • ์‹ค์ œ ์‚ฌ์ดํŠธ์— ์—†๋Š” ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ, Cart, ๋งˆ์ดํŽ˜์ด, ๊ฒฐ์ œ๋‚ด์—ญ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ
  • Back-End API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ GET / POST / DELETE ํ•˜๊ธฐ
  • trello๋ฅผ ์‚ฌ์šฉํ•ด ํ˜‘์—…ํ•˜๋ฉฐ ๋งค์ผ ์•„์นจ Stand Up ๋ฏธํŒ…๊ณผ, ์Šคํ”„๋ฆฐ์Šค ์Šคํฌ๋Ÿผ ๋ฏธํŒ… ์ง„ํ–‰ํ•˜๊ธฐ

์‚ฌ์šฉ๋œ ๊ธฐ์ˆ 

  • Front-End : ReactJs, Sass
  • Back-End :Django, MySQL(Back-End Repository)

๋‹ด๋‹นํ•œ ๋ถ€๋ถ„

๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ์ œํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€, ๊ทธ๋ฆฌ๊ณ  SupportํŽ˜์ด์ง€
์šฐ์„ , Beats(https://www.beatsbydre.com)์—๋Š” ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๊ฐ€ ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์›น ์‚ฌ์ดํŠธ์˜ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž…๋ฅผ ์ฐจ์šฉํ•ด Beats ํ™ˆํŽ˜์ด์ง€์— ์–ด์šธ๋ฆฌ๊ฒŒ ๋‹ค์‹œ ๋””์ž์ธ์„ ํ•˜์˜€๋‹ค.
๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…์€ Modal๋กœ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

  • ์‹ค์ œ Beats ํ™ˆํŽ˜์ด์ง€ ๋ฉ”์ธ ํ™”๋ฉด์„ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.

  • ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋„ฃ์€ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ๋ฉ”์ธํ™”๋ฉด ๋ถ€๋ถ„์ด๋‹ค.

  • ์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด Modal๋กœ ๋งŒ๋“ค์–ด์ง„ Login ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.

  • "@" ๋ฅผ ํฌํ•จํ•œ Email์ฃผ์†Œ์™€ 8์ž ์ด์ƒ์˜ Password๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๊ฐ€ ๋œ๋‹ค.

  • ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ ค๋ฉด Login ๋ฒ„ํŠผ ์•„๋ž˜ Sign Up ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด๋œ๋‹ค.

  • SignUp ์ฐฝ ๋˜ํ•œ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๊ฐ€ ๋œ๋‹ค. ์šฐ์„ , ๋ชจ๋“  ์ž…๋ ฅ์ฐฝ์ด ์ฑ„์›Œ์ ธํ•˜๊ณ , Email๊ณผ Password๋Š” ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•ด์„œ Email์€ @์™€ .์ด ๋ฐ˜๋“œ์‹œ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๊ณ , password๋Š” 8~20์ž์‚ฌ์ด ์˜๋ฌธ๊ณผ ์ˆซ์ž๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๊ฐ€ ๋˜๋ฉด ๋ฉ”์ธํ™”๋ฉด์˜ Login ๋ฒ„ํŠผ์€ SignUp ๋•Œ ์ž…๋ ฅํ–ˆ๋˜ username์œผ๋กœ ๋ฐ”๋€๋‹ค.

  • ๋‘๋ฒˆ์งธ๋กœ ๋งก์€ ๋ถ€๋ถ„์€ Support ํŽ˜์ด์ง€ ์ด๋‹ค. ํŽ˜์ด์ง€์˜ ์ž์„ธํ•œ ๊ตฌ์„ฑ์€ ์œ„์— ์œ ํˆฌ๋ธŒ ๋งํฌ๋กœ ๋“ค์–ด๊ฐ€์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (0:41)

  • ์„ธ๋ฒˆ์งธ๋กœ ๋งก์€ ๋ถ€๋ถ„์€ ์ œํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€์ด๋‹ค. Beats์˜ ์ œํ’ˆ ์ค‘ Pill ์Šคํ”ผ์ปค์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๋‹ด๋‹นํ•˜์˜€๋‹ค. ์ด ๋˜ํ•œ ํŽ˜์ด์ง€์˜ ์ž์„ธํ•œ ๊ตฌ์„ฑ์€ ์œ ํˆฌ๋ธŒ ๋งํฌ๋กœ ๋“ค์–ด๊ฐ€์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (1:35)

์ž˜ํ•œ์ 

  • ์šฐ์„  ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฌด์‚ฌํžˆ ๋งˆ์ณค๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ”„๋กœ์ ํŠธ ์ฒซ๋‚  ์šฐ๋ฆฌ๊ฐ€ ๋ชฉํ‘œํ–ˆ๋˜ ํŽ˜์ด์ง€์™€ ๊ธฐ๋Šฅ๋“ค์„ ์ž˜ ๊ตฌํ˜„ํ•˜์˜€๊ณ , ์™„์„ฑ๋„ ๋†’์€ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ๋งค์ผ ์•„์นจ ์ง„ํ–‰๋˜๋Š” StanUp Meeting์œผ๋กœ ํŒ€์›๋“ค ๊ฐ„์— ์ถฉ๋ถ„ํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์ด๋ค„์ง€๋ฉด์„œ ์ „์ฒด์ ์ธ ์ง„ํ–‰ ์‚ฌํ•ญ๋“ค์„ ๋งค๋ฒˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์„œ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ๋“ค์„ ์ ์ ˆํ•˜๊ฒŒ ๋‚˜๋ˆ ์„œ ํ”„๋กœ์ ํŠธ ํ›„๋ฐ˜๋ถ€์—๋Š” Conflict๋ฅผ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž…์„ Modal๋กœ effect ๊นŒ์ง€ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
  • BackEndํŒ€์›๊ณผ ํ†ต์‹ ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์ „๋‹ฌ์ด ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•จ์œผ๋กœ์จ ์ž‘์—…์˜ ํ๋ฆ„์„ ์ดํ•ดํ• ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๋„ฃ๊ณ ์ž ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ž˜ ์กฐ์œจํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ด์ œ git์ด ์ต์ˆ™ํ•ด ์กŒ๋‹ค.
  • ํ”„๋กœ์ ํŠธ deadline์„ ํ•˜๋ฃจ ๋ฐ˜ ๋‚จ๊ธฐ๊ณ , ๋‚ด๊ฐ€ ๋งก์€ ์ œํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๋ฐค์ƒˆ๋ฉด์„œ ์ž‘์—…ํ•˜์˜€๋‹ค. ๊ผญ ํ•ด๋ณด๊ณ ์‹ถ์—ˆ๋˜ Sticky๋ถ€๋ถ„์„ ์‹ค์ œ ํ™ˆํŽ˜์ด์ง€์™€ ๋˜‘๊ฐ™์ด ๊ตฌํ˜„ํ•˜์˜€๊ณ , ์•ž์„œ Support ํŽ˜์ด์ง€์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ ๋ชปํ•œ ๊ธฐ๋Šฅ์„ ํ–ˆ๋‹ค๋Š” ์ ์—์„œ ๊ฐœ์ธ์ ์œผ๋กœ ์ž˜ํ–ˆ๋‹ค๊ณ  ์นญ์ฐฌ..ํ•ด ์ฃผ๊ณ ์‹ถ๋‹ค..

์•„์‰ฌ์šด์ 

  • ์ฝ”๋”ฉ์„ ๊ฒจ์šฐ ํ•œ๋‹ฌ ๋ฐฐ์šฐ๊ณ  ๋‚˜์„œ, 6์ฃผ์ฐจ์— ๋ฐ”๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜์— ๊ฐˆํ”ผ๋ฅผ ๋ชป์žก๊ณ  ํ—ค๋งจ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์•„์‰ฝ๋‹ค. ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์ƒํ•˜๋Š”๋ฐ, Beats์—๋Š” ์—†๋Š” ๊ธฐ๋Šฅ์ด๋ผ ๋‹ค๋ฅธ ์›น ํŽ˜์ด์ง€์˜ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… ๋””์ž์ธ๊ณผ ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์™€ ๋ฆฌ๋””์ž์ธ ํ•ด์•ผํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ ๋“ค์–ด๋ณด๋Š” Modal๋กœ ์ž‘์—…ํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ณต๋ถ€ํ•˜๊ณ , ์ตํžˆ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜์—ˆ๋‹ค. ๊ฒฐ๊ตญ Modal๋กœ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ UI์žก๊ณ  ๋กœ์ง์งœ๋Š”๋ฐ 4์ผ์ด ๊ฑธ๋ ธ๋‹ค..(์ด๊ฒƒ๋„ ๊ฒฐ๊ตญ ๋‚˜์ค‘์— ๋˜ ์ˆ˜์ •์„ ํ–ˆ์ง€๋งŒ..) ์ด ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ์•„์‰ฝ๋‹ค. ํ˜‘์—… ํ”„๋กœ์ ํŠธ๊ฐ€ ์ฒ˜์Œ์ด๋ผ ์–ด๋ ค์šด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์„๋•Œ ๋ฉ˜ํƒˆ์ด ๋‚˜๊ฐ€์„œ ํ˜ผ์ž ๋™๋™ ์•“์•˜๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ๋„์›€์„ ์ฒญํ•˜๊ณ , ๋ฉ˜ํ† ๋‹˜์—๊ฒŒ ์ƒ๋‹ด์„ ๋ฐ›์€ ํ›„ ๋‹ค์‹œ ๋ฉ˜ํƒˆ์„ ์žก๊ณ  ์™„์„ฑ์‹œํ‚ฌ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋•Œ ํฌ๊ฒŒ ๋ฐฐ์šด ์ ์€ ํŒ€์›๋“ค๊ณผ ํ˜‘์—…์„ ํ•˜๋ฉด์„œ ์ด๋ค„์ง€๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์€ ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ์ ์ธ ๋ถ€๋ถ„๋งŒ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ ์ด๋‹ค. ๋ถ€์กฑํ•œ ๋‚˜๋ฅผ ๋งŽ์ด ๋ฐฐ๋ คํ•ด์ฃผ๊ณ , ์„œ๋กœ์—๊ฒŒ ํ•ญ์ƒ ์ข‹์€ ๋ง์„ ๋งŽ์ด ํ•ด์ค€ ํŒ€์›๋“ค์—๊ฒŒ ๊ฐ์‚ฌํ•  ๋ฟ์ด๋‹ค.
  • ๊ผญ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๊ธฐ๋Šฅ๋“ค์„ ํ•ด๋ณด์ง€ ๋ชปํ•œ ์ ์ด ์•„์‰ฝ๋‹ค. mapํ•จ์ˆ˜์™€ filterํ•จ์ˆ˜๋ฅผ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ํด๋ก ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ ํ•˜๋ฉด์„œ ํ•„์ˆ˜์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„์ด๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ ์ง์ „์— mapํ•จ์ˆ˜์™€ filterํ•จ์ˆ˜ ์„ธ์…˜์„ ํ•œ๋ฒˆ ๋“ฃ๊ณ  ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•  ์‹œ๊ฐ„์—†์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰๋˜๋ฉด์„œ ๋‚˜์—๊ฒŒ๋Š” ์•„์ง๋„ ๋ฏธ์ง€์˜ ์˜์—ญ์ด๋‹ค. 2์ฐจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ mapํ•จ์ˆ˜์™€ filterํ•จ์ˆ˜๋ฅผ ๋งก์•„์„œ ํ•˜๋ฆฌ๋ผ..

๊ธฐ๋กํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ

  1. SignUp.js
FetchRegister = () => {
    fetch(`${API}/register`, {
      method: "POST",

      body: JSON.stringify({
        email: this.state.email,
        password: this.state.password,
        first_name: this.state.first_name,
        last_name: this.state.last_name,
      }),
    }).then((res) => {
      if (res.ok) {
        localStorage.setItem("Authorization", res.Authorization);
        alert("WELCOME TO THE BEATS");
        this.props.switch();
      }
    });
  };

  handleClickEvent = () => {
    const { email, password, password_re, first_name, last_name } = this.state;

    if (
      email &&
      password &&
      password_re &&
      password === password_re &&
      first_name &&
      last_name
    ) {
      this.FetchRegister();
    }
  };
  • fetchํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ํ™” ์‹œ์ผœ์„œ ํ˜ธ์ถœํ–ˆ๋‹ค.
  • Config๋ฅผ ์‚ฌ์šฉํ•ด์„œ API์˜ ๊ณตํ†ต๋œ ๋ถ€๋ถ„์„ ๋ณ€์ˆ˜ํ™” ์‹œํ‚ค๊ณ , endpoint๋Š” fetchํ•จ์ˆ˜์—์„œ ์ง์ ‘ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ๋‹ค.
const SpeakerImg = {
  0: {
    src: `${Config.ProductsPillColor}/white_thqrt_retina_1800x1800_V2.png`,
  },
  1: {
    src: `${Config.ProductsPillColor}/black_thqrt_retina_1800x1800_V2.png`,
  },
  2: {
    src: `${Config.ProductsPillColor}/_0001_rgb_ML4Q2-RGB-thrqtrlft_V2.png`,
  },
};

class ProductsDetailPage2 extends React.Component {
  state = {
    isActive: 0,
    view: 0,
  };

  ImgSelect = (number) => {
    this.setState({ view: number });
  };


......
  <div className="ColorList">
                    <div className="WhiteWrap">
                      <div className="White">
                        <div
                          className="WhiteBox"
                          onClick={() => this.ImgSelect(0)}
                        />
                      </div>
                      <div className="TextWhite">White</div>
                    </div>
                    <div className="BlackWrap">
                      <div className="Black">
                        <div
                          className="BlackBox"
                          onClick={() => this.ImgSelect(1)}
                        />
                      </div>
                      <div className="TextBlack">Black</div>
                    </div>
                    <div className="RedWrap">
                      <div className="Red">
                        <div
                          className="RedBox"
                          onClick={() => this.ImgSelect(2)}
                        />
                      </div>
                      <div className="TextRed">Red</div>
                    </div>
                  </div>

์ƒ‰์ƒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์‚ฌ์ง„์ด ๋‚˜ํƒ€๋‚˜๋Š” ์ฝ”๋”ฉ์ด๋‹ค. state๊ฐ’ view๋ฅผ 0์œผ๋กœ ์ฃผ๊ณ , ์ด๊ฒŒ default๊ฐ’ 0(white)์ด ๋œ๋‹ค. 1(black), 2(red)๊ฐ€ ๋˜๋Š”๊ฒƒ์ด๋‹ค. ์ด๋˜ํ•œ ์ค‘๋ณต๋˜๋Š” ์ฃผ์†Œ๋ฅผ Config์— ๋ณ€์ˆ˜ํ™”์‹œํ‚ค๊ณ , endpoint๋Š” ์ง์ ‘ ์ž‘์„ฑํ•ด์ค€๊ฒƒ์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค.

๋Š๋‚€์ 

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

profile
๊ธฐ๋กํ•˜๋Š” ์Šต๊ด€
post-custom-banner

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