๐Ÿ’ป My Work 112

[React/JS] Firebase - ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •sendPasswordResetEmail

๋กœ๊ทธ์ธ ํ™”๋ฉด์—์„  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊นŒ๋จน์—ˆ์„ ๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ๋ฅผ ํ†ตํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ • ํ•˜๋„๋ก ๋•๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 00. sendPasswordResetEmail( auth, email ) /** ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ(๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •) */ async function handleFindPassword() { await sendPasswordResetEmail(auth, emailValue) .then((res) => { // ์ด๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ์„ฑ๊ณต! }) .catch((error) => { // ์ด๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ์‹คํŒจ... }); } ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ณธ์ธ์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ธ emailValue์„ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ธ์ž์— ๋„ฃ์–ด ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. 01. ๊ฒฐ๊ณผ ํ•ด๋‹น ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•˜๋ผ๋Š” ๋ฉ”์ผ์ด ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค! ๋ณ€๊ฒฝํ• ..

[์œ ๋‹ˆํ‹ฐ] ์บ๋ฆญํ„ฐ ์›€์ง์ด๊ธฐ, ์‰ฌํ”„ํŠธ ๋ˆ„๋ฅผ ์‹œ ๋‹ฌ๋ฆฌ๊ธฐ

์บ๋ฆญํ„ฐ ์›€์ง์ด๊ธฐ MovingObject.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class MovingObject : MonoBehaviour { public float speed;// ์†๋„ private Vector3 vector; //x,y,z ์ถ• // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { // "Horizontal" : ์šฐ ๋ฐฉํ–ฅํ‚ค : 1, ์ขŒ ๋ฐฉํ–ฅํ‚ค : -1 ๋ฆฌํ„ด // "Vertical" : ์ƒ ๋ฐฉํ–ฅํ‚ค : 1, ํ•˜ ๋ฐฉํ–ฅ..

์†Œํ”„ํŠธ์›จ์–ด ์ƒ๋ช… ์ฃผ๊ธฐ์—์„œ ๋งํ•˜๋Š” ์•ŒํŒŒ ๋ฒ„์ „, ๋ฒ ํƒ€ ๋ฒ„์ „, RC ๋ฒ„์ „

http://bobbyryu.blogspot.com/2006/12/rc.html ์•ŒํŒŒ ๋ฒ„์ „, ๋ฒ ํƒ€ ๋ฒ„์ „, ๊ทธ๋ฆฌ๊ณ  RC ํ‹ฐ์Šคํ† ๋ฆฌ๋กœ ์ธํ•œ ๋ฒ ํƒ€ ๋ฒ„์ „ ๋…ผ๋ž€์˜ ๊ธ€ ์„ ๋ณด์•˜๋Š”๋ฐ, ๊ธฐ๋ณธ ์ „์ œ์—์„œ ์•ŒํŒŒ ๋ฒ„์ „๊ณผ ๋ฒ ํƒ€ ๋ฒ„์ „์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ์ž˜๋ชป ๋˜์–ด ์žˆ๊ตฐ์š”. 20๋…„ ์ด์ƒ ๊ฐœ๋ฐœ์„ ํ•ด์™”๊ณ  ๋˜ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์„ ์ „๊ณตํ•œ ์‚ฌ๋žŒ์œผ๋กœ์„œ bobbyryu.blogspot.com ์†Œํ”„ํŠธ์›จ์–ด ์ƒ๋ช… ์ฃผ๊ธฐ ์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์˜ ์ด์ฒด ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋‹จ๊ณ„๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ถœ์‹œ ๋‹จ๊ณ„๊นŒ์ง€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์„ ์— ๋„์›€์ด ๋˜๋Š” ์—…๋ฐ์ดํŠธ ๋ฒ„์ „๊ณผ ์†Œํ”„ํŠธ์›จ์–ด์— ๋‚ด์žฌ๋œ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ํฌํ•จ ๋‹จ๊ณ„ : ํ”„๋ฆฌ์•ŒํŒŒ > ์•ŒํŒŒ > ๋ฒ ํƒ€ > ์ถœ์‹œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์ˆ˜๋ช… ์ฃผ๊ธฐ(Software Development Life Cycle, SDLC) ์‹œ์Šคํ…œ ์—”์ง€๋‹ˆ์–ด๋ง, ์ •๋ณด ์‹œ์Šคํ…œ, ๋˜๋Š”..

[Material Design] Material-UI(MUI) : Masonry, Grid (์ปดํฌ๋„ŒํŠธ ๋‚˜์—ดํ•˜๊ธฐ, ๊ฐ€๋กœ๋กœ ๋‚˜๋ž€ํžˆ ๋†“๊ธฐ)

00. Masonry https://mui.com/material-ui/react-masonry/ React Masonry component - Material UI Masonry lays out contents of varying dimensions as blocks of the same width and different height with configurable gaps. mui.com ๋†’์ด๊ฐ€ ์ œ๊ฐ๊ฐ์ธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ์„ฑ์žˆ๊ฒŒ, ์—์˜๊ฒŒ ๊ตฌํ˜„๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ๋†’์ด๊ฐ€ ๋‹ฌ๋ผ๋„, ์„œ๋กœ์˜ ๋†’์ด์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ์ซ˜๋ผ๋ฝ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.๐ŸŒˆ import * as React from 'react'; import Box from '@mui/material/Box'; import Maso..

[React/JS] ์š”์†Œ๊ฐ€ Object์ธ ๋ฐฐ์—ด์˜ ์ค‘๋ณต ์ œ๊ฑฐํ•˜๊ธฐ

ํ•„ํ„ฐ(Filter) 01. ๊ธฐ๋ณธ const data = ["A", "B", "C", "D", "A", "C"]; const result = data.filter((value, index) => { return data.indexOf(value) === index; // ์ฒ˜์Œ์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฐ’์˜ ์ธ๋ฑ์Šค์™€ ํ˜„์žฌ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ™์„ ์‹œ, ํฌํ•จ }); ํŠน์ • ๋ฌธ์ž ์œ„์น˜๋ฅผ ์ฐพ๋Š” indexOf ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.โœจ 02. ์š”์†Œ๊ฐ€ Object const data = [ { name: "A", age: "20" }, { name: "B", age: "24" }, { name: "C", age: "20" }, { name: "A", age: "20" }, { name: "D", age: "24" } ]; const result =..

[React/JS] useRef ์—ฌ๋Ÿฌ ๊ฐœ ํ•œ๋ฒˆ์— ์„ ์–ธํ•˜๊ธฐ(useRef ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ)

useRef๋ฅผ ํ†ตํ•ด input์„ ์ œ์–ดํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฐ๋ฐ, ์ด๋Ÿฐ input์ด 5๊ฐœ๋ผ๋ฉด? useRef์ด 5๊ฐœ ํ•„์š”ํ•˜๊ฒ ์ฃ ! 5๊ฐœ ์ •๋„๋Š”.. ํ•˜๋‚˜ํ•˜๋‚˜ ์„ ์–ธํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ... ๋น„ํšจ์œจ์ ์ธ๋ฐ๋‹ค๊ฐ€ ์‹ฌ์ง€์–ด๋Š” input์ด 1000๊ฐœ๋ผ๋ฉด?!? ํ•˜๋‚˜ํ•˜๋‚˜ ์„ ์–ธํ•ด์ค„ ์ˆ˜ ์—†๊ฒ ์ฃ ..!!๐Ÿค”๐Ÿค”๐Ÿค” ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค!! ๊ฒฐ๋ก ์ ์œผ๋ก  ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Ref๋ฅผ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๊ณ , (item, index) => ( { Ref๋ฐฐ์—ด.current[index] = element; }} onChange={(e) => Ref์ด๋ฒคํŠธํ•จ์ˆ˜(e, index)} /> ) 00. ๋ฌธ์ œ.. import * as React from "react"; export default function App() { /** ํŒŒ์ผ์ด ์ถ”๊ฐ€๋  input์˜ r..

[Material Design] Material-UI(MUI)๋กœ react & styled component ์‚ฌ์šฉํ•˜๊ธฐ <๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ํ•˜๊ธฐ - Select>

๋ชจ~~~๋“  ์ •๋ณด๋ฅผ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์™€๋ฒ„๋ฆฌ๋ฉด, ๋น„ํšจ์œจ์ ์ด๊ฒ ์ฃ . ๊ฝค๋‚˜ ๋งŽ์€ ์‚ฌ์ดํŠธ์—์„œ ๋ฌดํ•œ ์Šคํฌ๋กค๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”!๐Ÿ˜๐Ÿ˜ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค!!! ์šฐ์„ , ์ตœ์ข…์ ์ธ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์˜ํ™” ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๋Š” API๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.๐Ÿ”ฅ import * as React from "react"; import { Select, MenuItem, FormControl, InputLabel } from "@mui/material"; export default function App() { const PANEL_HEIGHT = 240; // ํŒจ๋„ ๋†’์ด /** ์„ ํƒํ•œ item */ const [selectItem, setSelectItem] = React.useState(""); /** ์ด menu it..

[React/JS] CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ(์ด๋ฏธ์ง€ URL์„ API ์š”์ฒญ, ์ด๋ฏธ์ง€ URL๋กœ Blob, Blob๋กœ File ์ƒ์„ฑ)

https://velog.io/@zero-black/CORS-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-Reverse-Proxy-server-%EA%B5%AC%EC%B6%95-with-Nginx CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ + Reverse Proxy server ๊ตฌ์ถ• with Nginx ์œ„์™€ ๊ฐ™์ด React์—์„œ ์™ธ๋ถ€ api๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ, CORS ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.CORS๋Š” Cross Origin Resource Sharing๋กœ, ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ฐ„์— ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ ธ๋Š” ๋™์ผ velog.io ์œ„ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค!! โ˜บ๏ธโ˜บ๏ธ https://avoc-o-d.tistory.com/90 [React/JS] Image ..

[React/JS] Image URL๋กœ ํŒŒ์ผ ๊ฐ์ฒด(File object) ์ƒ์„ฑํ•˜๊ธฐ

https://avoc-o-d.tistory.com/91 [React/JS] CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ(์ด๋ฏธ์ง€ URL์„ API ์š”์ฒญ, ์ด๋ฏธ์ง€ URL๋กœ Blob, Blob๋กœ File ์ƒ์„ฑ) https://velog.io/@zero-black/CORS-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-Reverse-Proxy-server-%EA%B5%AC%EC%B6%95-with-Nginx CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ + Reverse Proxy server ๊ตฌ์ถ• with Nginx ์œ„์™€ ๊ฐ™์ด React์—์„œ ์™ธ๋ถ€ api๋กœ ์š”์ฒญ์„ avoc-o-d.tistory.com fetchํ•˜์‹ค ๋•Œ, CORS ์—๋Ÿฌ๊ฐ€ ๋‚  ์‹œ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”! const convertUrlToFile = ..

[React/JS] ์„œ๋ฒ„์— ํŒŒ์ผ ๊ฐ์ฒด(File Object)/์ด๋ฏธ์ง€ ํŒŒ์ผ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ ๋ณด๋‚ด๊ธฐ - FormData

https://avoc-o-d.tistory.com/85 [React/JS] ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ตฌํ˜„ํ•˜๊ธฐ (ํŒŒ์ผ ์„ ํƒ ๋ฒ„ํŠผ ์ œ๊ฑฐ, ์ปค์Šคํ…€ํ•˜๊ธฐ) ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 1. FileReader๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹ 2. URL API๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹ ๐ŸŒˆ (์ถ”์ฒœ) ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค! 00. - ํŒŒ์ผ ์„ ํƒ ๋ฒ„ํŠผ ์ œ๊ฑฐ ์šฐ์„ , input type="file" avoc-o-d.tistory.com ์œ„๋Š” ํŒŒ์ผ ์—…๋กœ๋“œ์— ๊ด€ํ•ด ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์“ฐ๊ณ  ์žˆ๋Š” ๊ธ€์€, API ์š”์ฒญ์„ ํ•  ๋•Œ Request body์— ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ๋ณด๋‚ด์ค˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค! json์œผ๋กœ๋Š” ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— FormData๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ๋กœ ํ•ฉ์‹œ๋‹ค!..