uheeking_의 등록된 링크

 uheeking_로 등록된 네이버 블로그 포스트 수는 41건입니다.

[React] react ToDo 리스트 생성하기 [내부링크]

간단하게 todo리스트를 생성하고 하면서 배운 점들을 서술하고자 한다. todo앱 todo리스트 생성하기 1) input창에 쓴 글 반영하기 여기에 input창에 글을 쓰면 todo리스트가 생성되게 해야 한다. const [text, setText] = useState(""); const onChangeHandler = (event) => { setText(event.target.value); }; <input type="text" onChange={(event) => onChangeHandler(event)} placeholder="해야 할 일을 입력하세요." value={text} /> <input type="submit" value="입력" /> input을 만들어 입력한 글을 input창으로 변하게 해야 한다. 그럴려면 value에 useState로 선언한 변수가 들어가야 한다. 그리고 계속적으로 input창이 변하기 때문에 onchange이벤트를 넣어줘야 한다. 그리고 이를

[React] react 게시글 작성해보고 구현하기 [내부링크]

table 태그를 사용하여 디자인을 구성하였다. 게시글에 대한 데이터는 db에 저장하였다. 그리고 게시글을 등록했을 경우 페이지가 이동되면서 게시판에서 내가 쓴 글을 볼 수 있도록 구현하였다. 아래는 내가 꾸민 게시판 글쓰기 페이지이다. 구현한 사이트 게시판 게시글 생성하기 게시판을 구성할 때 필요한 것은 사진을 참조해서 보면 맨 위에서부터 글 제목, 작성자, 내용, 비밀번호와 비밀글 설정, 개인정보 수집 및 동의 등이 필요했다. 이메일의 경우는 비회원과 회원을 구분하지 않으므로 비회원도 글을 작성할 수 있도록 하였다. 그래서 이는 꼭 필요한 항목이 아니기에 없어도 되고, 작성하지 않아도 alert창이 뜨지 않게 구성하였다. useInput 생성 코드가 너무 길어서 커스텀하여 useInput과 useInputRef를 구성하였다. //useInput import { useState, useCallback } from 'react'; // initValue = null해둔다 export

[React] react 모바일 페이지 구현하기 [내부링크]

홈페이지는 나혼자 구현해서 시간이 없기에 모바일까지 코드구현하는데 시간이 소요된다. 사이트를 보고자 하는 사용자를 위하여 모바일 페이지에서 데스크톱으로 이동하여 사이트를 이동할 수 있도록 모바일 페이지에서 데스크톱 페이지로 이동하라는 문구를 구현하고자 하였다. 1. react-device-detect 설치 npm i react-device-detect react-device-detect를 설치하여 모바일에 보일 화면을 만든다. 2. 모바일에 보일 화면 준비 import React from "react"; import styled from "styled-components"; const Outer = styled.div` display: flex; justify-content: center; `; const Inner = styled.div` position: absolute; top: 50%; transform: translateY(-50%); text-align: center; m

[React] 부모 컴포넌트에서 자식 컴포넌트에 값 전달하기 [내부링크]

navigate도 많이 쓰고 여러가지 쓰는데 부모 컴포넌트에서 자식 컴포넌트에 값 전달하는 방법도 있을 것 같아, 찾아보다가 정리하게 되었다. props의 개념 상위 컴포넌트에서 하위 컴포넌트로 값을 전달하는 수단. 하위 컴포넌트에서 상위 컴포넌트가 전해준 값에 접근을 할 수 있게 한다. 하위 컴포넌트에서 상위 컴포넌트로 값을 전달할 수 없다. props의 사용 1. 상위 컴포넌트에서 하위 컴포넌트로 값 전달 1) 상위 컴포넌트(부모 컴포넌트) function 함수=()=>{ const [변수, set변수] = useState('') } const 상위페이지이름 =()=>{ <하위페이지이름 value={변수} /> } 2) 하위 컴포넌트(자식 컴포넌트) <p>전달 받은 값 : {props.value}</p> 값이 전달되는 방식 상위 컴포넌트에서 넘겨주고자 하는 값을 선언한다. (useState를 사용한다.) 받고자하는 하위 컴포넌트에 value값을 넣어 넘겨준다. 하위컴포넌트에서 p

[순천] 네이버 체크인 챌린지 #4 그릭요거트를 왜 돈 주고 사먹냐고요? [내부링크]

제목처럼 나는 맨 처음에 그릭요거트를 돈 주고 사먹는 사람이 아니었다. 왜냐면 세상에 맛있는 게 많고, 그릭요거트를 굳이 돈주고 사먹을 필요성을 못 느꼈기 때문이다. 그런데 어느 한 계기로 인해 그릭요거트를 밖에서 사먹게 되었다. 나는 요거트에 관심이 많은데, 그 이유가 장이 예민하기 때문이다. 장이 예민하면 밖에서 먹을 음식을 선택할 때 신중하게 된다. 잘못 선택해서 먹으면 탈도 나고 장도 꼬인다. 특히 저녁에 밥을 많이 먹거나 일반식을 먹으면 다음날까지도 영향을 받는다. 그러다보니 먹을 것에 관하여 매우 예민하다. 그래서 중요한 일이 있는 전날 밤에는 꼭 저녁에 요거트를 먹고 자야 했다. 그래야 다음날 배가 안 아프지 않고, 약속이나 업무에도 지장을 안 받아 항상 그렇게 먹는 습관을 아직도 들이고 있다. 그러던 와중에 순천시청년센터에서 주최한 잡튜터링을 보게 되었다. 그릭요거트의 창업에 대한 도움과 만들기를 할 수 있다고 하여 참여하게 되었다. 그동안 요거트가 물려서 어떻게 다르

[React] 로그인 시간 설정하기 [내부링크]

로그인을 구현하기만 하면 될 줄 알았더니 몇일간 로그인이 유지된다는 말을 듣고 수정해야겠다는 생각이 들어 홈페이지를 봤다. 그런데 나는 매번 로그인하고 로그아웃을 해서 몰랐던 것 같다. 그래서 localstorage에 로그인 정보를 입력하고 그에 대한 값을 삭제하지 않아 계속 로그인이 유지되는 것이었다. 이에 대해 글을 써보려고 한다. LocalStorage 홈페이지를 구성하다보면 cookie나 session등 저장소를 저장하게 된다. 이도 하나의 종류이며 만료시간은 존재하지 않는다. 그러나 Javascript를 사용하여 TTL(Time to Live)을 추가하여 일정 시간이 경과한 후 localStorage의 항목을 무효화할 수 있다. 만료시간 설정 후 저장 function setWithExpiry(key, value, ttl) { const now = new Date() // `item` is an object which contains the original value // a

[React] PropTypes 개념 알아보고 활용하기 [내부링크]

1. 사용 이유 공식문서에 따르면 앱이 커짐에 따라 타입체킹을 통해 많은 버그를 잡을 수 있습니다. 일부 어플리케이션에서 Flow나 TypeScript같이 어플리케이션 전체에서 타입체크를 할 수 있는 자바스크립트 확장을 사용할 수도 있습니다. 하지만 이런 것들을 사용하지 않는다면 React에서 빌트 인 타입 체킹이 가능합니다. 컴포넌트의 props에서 타입을 체크하고싶다면 특별한 propTypes 속성을 할당할 수 있습니다. 위의 같은 이유가 대표적이다. 자바스크립트의 유연한 특성 때문에 작성이 편한 반면, 파일이 많아지면 생산성이 떨어진다는 점 때문에 타입스크립트를 많이 사용한다. 자바스크립트를 이용해 앱을 개발해야 하는 상황에서는 이러한 문제점을 피하기 위해 PropTypes를 활용하는 것을 권장한다. PropTypes는 부모로부터 전달받은 prop의 데이터 type을 검사한다. 자식 컴포넌트에서 명시해 놓은 데이터 타입과 부모로부터 넘겨받은 데이터 타입이 일치하지 않으면 콘솔에

[서울] 네이버 체크인 챌린지 #5 춘식이가 이끈 카페 [내부링크]

공미학 마포홍대점 서울특별시 마포구 양화로 162 카카오프렌즈 3층 이 블로그의 체크인 이 장소의 다른 글 영업시간 : 매일 11:00 - 23:00 0507-1374-3349 이번에는 춘식이를 영접하면서 공미학 마포홍대점을 간 후기를 쓰고자 합니다. 같이 간 친구가 춘식이 덕후여서 우연한 기회에 공미학 마포홍대점에 들리게 되었습니다. 공미학 마포홍대점은 카카오 프렌즈샵 3층에 위치해 있습니다. 1. 깨끗한 미관 처음에 카카오 프렌즈샵 안에 위치해 있어 카페 품질을 크게 기대하지 않았습니다. 그런데 웬걸 생각보다 카페가 엄청 깨끗하고 좋았습니다. 그래서 카페에 들어갔을 때 보고 "오 평타이상 치는데?"라고 생각했습니다. 그래서 둘러보니 디저트가 미쳤습니다. 이건 두번째에서 좀 더 서술하도록 하겠습니다. 안에는 포토존처럼 나무가 비치되어 있고, 원목으로 하여 인테리어가 깔끔하다는 인상을 주었습니다. 또한, 좌석배치도 테이블을 많이 배치해 두어 사람들도 많이 포용할 수 있게끔 디자인되어

[React] useReducer 개념 살펴보기 [내부링크]

reducer : 현재 상태와 액션 객체를 파라미터로 받아와서 새로운 상태를 반환해주는 함수이다. function reducer(state, action) { // 새로운 상태를 만드는 로직 // const nextState = ... return nextState; } reducer 에서 반환하는 상태는 곧 컴포넌트가 지닐 새로운 상태가 되게 된다. action : 업데이트를 위한 정보이다. 주로 type값을 지닌 객체 형태로 사용되기도 한다. useReducer useReducer를 쓸려면 reducer의 구조를 알아야 되서 살펴보았다. useReducer()함수는 첫번째 인자로 넘어오는 reducer 함수를 통해 컴포넌트의 상태(state)가 행동(action)에 따라 어떻게 변해야하는지를 정의한다. reducer 함수는 switch 분기문을 이용하면 이해하기 쉽게 작성할 수 있다. 아래는 useReducer의 구조이다. const [state, dispatch] = useRe

[순천] 네이버 체크인 챌린지 # 신대에서 뭐 먹지? [내부링크]

순천에 신대지구에 안 사시는 분이라면 신대지구에서 뭐 먹지라는 고민을 할 것이다. 그렇다면 내가 쓰는 루틴대로 한번 방문해보는 건 어떨까? 생각이 들어 밥집과 카페를 추천하고자 글을 쓴다. 1. 밥집 : 코우텐동 코우텐동 전라남도 순천시 해룡면 매안4길 3-11 101호 코우텐동 이 블로그의 체크인 이 장소의 다른 글 영업시간 : 월화목금토일 11:00 - 21:00 15:00 - 17:00 브레이크타임 14:30 라스트오더 수요일은 정기휴무 0507-1330-5072 1) 신대지구 맛집 근처의 연향3지구에는 맛집이 그리 많지 않다. 그래서 신대에 자주 오게 되는데, 신대하면 텐동집이 떠오른다. 코우텐동은 이전에 갈 때 웨이팅이 길고 조금 힘들었는데, 지금 가시는 분들이라면 먹기 수월할 것이라는 생각이 든다. 왜냐하면 확장이전을 해서 매장이 커지고 동선도 수월해져 접근성이 훨씬 더 높아졌기 때문이다. 혹시 바테이블을 좋아하시는 분들이라면 더욱 마음에 들 것이다. 또한 데이트하는 분들

[React] Redux(리덕스)란 무엇인가? [내부링크]

: 상태관리 라이브러리 redux 등장배경 MVC패턴 형식으로 state가 변화되면 Model, View, Controller에 이벤트가 발생하고 값이 변화하는 구조였다. 이를 양방향 데이터 흐름이라고 한다. 이는 복잡하며 데이트 흐름이 한번에 판단하기 힘들다. 이러한 단방향 데이터 흐름이 있다.즉 redux이다. redux는 MVC패턴의 단점을 개선하는 것이 목적이다. redux의 유무 리덕스를 사용하면 컴포넌트들의 상태 관련 로직들을 다른 파일들로 분리시켜서 더욱 효율적으로 관리 할 수 있으며, 글로벌 상태 관리를 쉽게 할 수 있다. Redux의 3가지 원칙 리덕스 사용을 위해서는 다음의 3가지 원칙을 지켜야 한다. 단일 스토어 : 하나의 애플리케이션 내부에는 하나의 스토어를 만들어 사용해야 한다. 여러 개의 스토어를 만들어 사용이 가능하지만 상태 관리가 복잡해지기 때문에 권장되지 않는다. 스토어 내부에는 앱 상태와 리듀서 및 내장 함수가 포함되어 있다. 읽기 전용 상태 : 리덕

[광주] 네이버 체크인 챌린지 # 뭐라구요? 광주가 노잼도시라고요? [내부링크]

광주에 사는 친구들이랑 이야기해보면 광주는 노잼도시라고 한다. 그런 말을 처음 들어봐서 의문을 가지면 친구들은 광주에서 놀게 없다고 한다. 글을 읽고 있는 당신도 인정한다면 당신은 광주에서 무엇이 열리고 무엇을 하는지 아직 모르기 때문이다. 국립아시아문화전당 광주광역시 동구 문화전당로 38 이 블로그의 체크인 이 장소의 다른 글 운영시간 : 화목금일 10:00 - 18:00 수토 10:00 - 20:00 매주 월요일은 정기휴무 1899-5566 www.acc.go.kr 1. 매월 열리는 전시 매달 다른 주제로 전시가 개최되며, 최근에는 '몰입 미감' 전시가 열렸었다. 이 전시는 인스타그램에서도 많이 떠서 아마 들어보신 분들도 계실 것 같다. 앤서니 브라운의 행복극장이 열렸었다. 또한, 일상첨화라는 전시도 현재 열리고 있다. 이 글을 읽고 있으시는 분들도 이미 이러한 전시를 방문한 적이 있을 것이다. 하지만 만약 아직 방문한 적이 없다면, 한 번쯤 방문하여 다양한 예술 작품을 감상해보

[React] SWR의 개념 알아보기 [내부링크]

개념 SWR은 vercel에서 제작한 모듈이며, 데이터를 가져올 때 쓰인다. vercel의 SWR 공식문서 "SWR"이라는 이름은 HTTP RFC 5861(opens in a new tab)에 의해 알려진 HTTP 캐시 무효 전략인 stale-while-revalidate에서 유래되었습니다. SWR은 먼저 캐시(스태일)로부터 데이터를 반환한 후, fetch 요청(재검증)을 하고, 최종적으로 최신화된 데이터를 가져오는 전략입니다. SWR을 사용하면 컴포넌트는 지속적이며 자동으로 데이터 업데이트 스트림을 받게 됩니다.그리고 UI는 항상 빠르고 반응적입니다. 장점 단 한 줄의 코드로 프로젝트 내의 데이터 가져오기 로직을 단순화할 수 있다. 빠르고, 가볍고, 재사용 가능한 데이터 가져오기 내장된 캐시 및 요청 중복 제거 실시간 경험 SWR은 더 나은 경험을 구축할 수 있도록 속도, 정확성, 안정성의 모든 측면을 다룹니다. 빠른 페이지 네비게이션 인터벌 폴링 데이터 의존성 주의할 점 useS

[React] SWR을 활용하기 [내부링크]

글을 쓰다가 글의 길이 길어져 활용하는 부분은 다른 페이지로 만들어 작성하고자 한다. SWR 활용하기 우선은 파일을 새로 만든다. 아래의 코드를 작성하여 새로운 react 파일을 만든다. npx crate-react-app {생성하고자 하는 파일 이름} 폴더 셋팅 폴더 셋팅한 모습 위와 같이 폴더를 셋팅하였다. pages/Main.js import React from "react"; const Main = () => { return <div>Main</div>; }; export default Main; pages/Detail.js import React from "react"; const Detail = () => { return <div>Detail</div>; }; export default Detail; pages/index.js export { default as Main } from "./Main"; export { default as Detail } from "./Det

[광주] 네이버 체크인 챌린지 #6 비오는 날 혼자 있고 싶다고? [내부링크]

최근 비가 많이 내려, 일정이 있어 광주시립사직도서관 근처를 가게 되었다. 그 곳에는 다양한 커피집들이 밀집되어 있었는데, 그 중에서도 육각커피가 눈에 띄어서 커피를 맛보고 솔직한 리뷰를 적어보려 한다. 육각커피 광주광역시 남구 제중로47번길 2 이 블로그의 체크인 이 장소의 다른 글 매일 09:00 - 20:00 / 19:30 라스트오더 062-671-8241 http://instagram.com/6kcoffee 1. 조용한 분위기의 카페 비오는 날 방문한 이 카페는 생각보다 조용한 분위기를 가지고 있었다. 이건 시간과 그 날의 날씨에 따라 다르겠지만, 나의 경우에 개인적으로 이런 조용한 공간을 선호하기에 오히려 좋았다. 혼자 느끼는 고요함과 사색의 즐거움을 추구하시는 분들에게 이 카페를 추천한다. 성급하게 추천한다는 것이 아니라 비오는 날의 경우 혼자 집에 있으면 사색에 사색이 겹겹이 쌓여 지극히 부정적인 생각을 하기 마련이다. 그런데 밖에 나와서 맛있는 커피라도 마시면서 사람

[React] location.href 와 location.replace, navigate 비교하기 [내부링크]

react에서 페이지 이동할려고 했을 때 이를 검색한 적이 있다. 각각마다 차이점이 존재하여 이에 대해서 서술해보고자 글을 적게 되었다. 개념 자바스크립트에서 페이지 이동 location.href : 새로운 페이지로 이동 location.replace : 새로운 페이지로 이동 react에서 페이지 이동 navigate : 새로운 페이지로 이동 차이점 1. 이전 페이지 이동 1) location.href와 location.replace location.href는 객체의 속성이며, loaction.replace()는 메서드(함수)로 작동된다. href는 페이지를 이동하는 것이기 때문에 뒤로가기 버튼을 누른 경우 이전 페이지로 이동이 가능하지만, replace는 이동한 페이지를 현재 페이지로 덮어 씌우기 때문에 이전 페이지로 이동이 불가능하다. href는 일반적인 페이지 이동시 이용을 하면 되고, replace의 경우는 보안상의 이유로 덮어씌운다. 2) navigate navigate("

[React] 제어&비제어 컴포넌트 알아보기 [내부링크]

모르는 개념을 알게되어서 적게되는 글이며, 항상 react에서 겪는 오류들이 줄어들었으면 하는 바람에 쓰는 글이다. 개념 1) 제어 컴포넌트 HTML에서 <input>, <textarea>, <select>와 같은 폼 엘리먼트는 일반적으로 사용자의 입력을 기반으로 자신의 state를 관리하고 업데이트합니다. React에서는 변경할 수 있는 state가 일반적으로 컴포넌트의 state 속성에 유지되며 setState()에 의해 업데이트됩니다. 폼을 렌더링하는 React 컴포넌트는 폼에 발생하는 사용자 입력값을 제어합니다. 이러한 방식으로 React에 의해 값이 제어되는 입력 폼 엘리먼트를 “제어 컴포넌트 (controlled component)“라고 합니다. 2) 비제어 컴포넌트 모든 state 업데이트에 대한 이벤트 핸들러를 작성하는 대신 비제어 컴포넌트를 만들려면 ref를 사용하여 DOM에서 폼 값을 가져올 수 있습니다. react 공식문서에서 인용하여 개념을 작성하였다. 제어와

[광주] 블로그 체크인 챌린지 #1 나만의 자주 가는 동네 카페 [내부링크]

블로그를 하면서 매번 뜨는 탭을 본 적이 있을 것이다. 매번 떠서 귀찮아서 닫았다. 그러다가 궁금해서 찾아보다가 이렇게 블로그에 글을 쓰는 계기가 되었다. 오늘은 나만의 숨은 맛집을 소개하고자 한다. 숨은 맛집도 아니고 그냥 동네 카페이다. 나는 사진을 잘 찍는 편이 아니다. 귀찮아서 잘 안 찍는다. 플러스 사진 찍을 때마다 셔터 소리가 나서 눈치가 보여서 안 찍게 된 이유가 크다. 이 말을 하는 이유는 카페 사진이 별로 없음을 설명하고자 한다. 1. 내가 자주 가는 이 카페의 특별함은 친절한 사장님에게서 비롯된다. 친절한 서비스는 나에게 매우 중요한 가치 중 하나이다. 항상 따뜻한 인사로 맞아주신다. 요즘처럼 삭막해진 세상에서 활기찬 인사는 사람이 살아가는데 위안이 된다. 인터넷 검색해서 다른 맛집이나 카페를 찾아가면 사람이 너무 많아 사람들이 떠드는 소리에 인사 소리가 묻히거나, 알바생들이 카운터에서 그냥 본채만채 가도 '어서오세요.'라고 안 하는 곳도 종종 봤다. 그런데가 어디

[React] useMemo()와 React.memo, useCallback() 비교하기 [내부링크]

1. 성능 향상을 위한 Memoization React.memo와 useCallback(), useMemo의 개념을 이해하기 위해서는 Memoization의 정의를 알아야 한다. 정의는 다음과 같다. 결과를 캐싱하고, 다음 작업에서 캐싱한 것을 재사용 하는 비싼 작업의 속도를 높이는 자바스크립트 기술 이전 값을 메모리에 저장해 동일한 계산의 반복을 제거해 빠른 처리를 가능하게 하는 기술 캐시에 초기 작업 결과를 저장하여 사용함으로 써 최적화 할 수 있다. 만약 작업을 다시 수행해야 한다면, 어딘가에 저장되어진 동일한 결과를 단순히 반환 해준다. 메모이제이션(Memoization) 자주 사용되는 값을 받아오기 위해 반복적으로 계산을 해야 하는 상황에서, 특정 값을 캐싱하는 것을 말한다. 해당 값이 또 필요할 때마다 메모리에서 꺼내서 재사용한다. 2. React.memo React.memo는 Higher-Order Components(HOC)이다. Higher-Order Compone

[여수] 블로그 체크인 챌린지 #2 당신은 녹진한 콘파냐를 먹어본 적이 있는가 [내부링크]

나른 전라남도 여수시 소라면 죽림2길 27-3 이 블로그의 체크인 이 장소의 다른 글 영업시간: 월화수목금토 10시부터 21시 50분까지 일요일: 10시부터 18시까지 연락처: 0507-1403-7034 콘파냐 가격: 6300원 친구가 추천해준 카페가 인생카페가 되어본 적이 있는가. 나는 있다. 이 글을 통해 내 인생 카페를 추천하기 위해 글을 쓰고자 한다. 나는 이전에 친구가 라디오에 사연이 당첨되어 나른 카페 쿠폰이 생겼다고 해서 가게 되었다. TMI. 친구가 당첨된 라디오는 박성언의 음악식당이다. 정말 재미있는 프로그램이라고 한다. (친구왈) 처음에 나른 카페에 방문했을 때, 입구를 찾기 어려웠다. 그래서 한 바퀴를 돌았는데, 주차한 차들로 인해서 입구가 가려져 안 보인 거였다. 그래서 만약 나른을 방문하게 된다면 문을 못 찾을 수 있으니 카페 주변 사진을 확인하시고, 방문하시는 것을 추천한다. 카페 내부로 들어가면 아름다운 우드한 인테리어 맞이해준다. 그래서 '되게 아늑하구나

[React] 페이지네이션(Pagination) 구현하기 [내부링크]

데이터 가져오기 페이지네이션을 하기 위해서는 데이터가 있어야 한다. 우선은 데이터가 없으므로 게시물 데이터는 JSON Placeholder라는 인터넷에 공개된 API를 통해 가져온다. fetch('<https://jsonplaceholder.typicode.com/todos/1>') .then(response => response.json()) .then(json => console.log(json)) 이렇게 데이터를 가져온다. 사이트를 참고하면 이렇게 fetch를 사용해서 가져온 데이터는 아래와 같은 데이터로 가져와진다. { "userId": 1, "id": 1, "title": "delectus aut autem", "completed": false } 게시물 목록 구현 import { useState, useEffect } from "react"; import styled from "styled-components"; import Pagination from "./Paginat

[순천] 네이버 체크인 챌린지 #3 한입가득 연어롤 냠냠 [내부링크]

신대초밥 전라남도 순천시 해룡면 매안2길 7 이 블로그의 체크인 이 장소의 다른 글 운영시간 : 월화수목금토일 11:00 - 22:00 15:00 - 17:00 브레이크타임 21:00 라스트오더 수요일은 정기휴무 연락처 : 061-727-1191 오늘은 자주 방문하는 신대초밥에 대해서 이야기하고자 한다. 초밥에 대해 이야기할려고 하니 배가 고프다. 그만큼 자주 생각나는 맛집 중 하나로, 자주 찾게 되는 곳이다. 신대초밥은 이름 그대로 초밥을 전문으로 하는 곳이다. 이곳에서 특히 추천하고 싶은 메뉴는 연어롤이다. 이유를 서술해가면서 글을 쓰고자 한다. 1. 거대한 주먹 연어롤 우선 신대초밥은 다른 곳들과 같이 점심특선을 운영하고 있다. 점심특선은 다른 때보다 아침에 밥을 못 먹고 왔을 때 점심 때 기다려서 먹는 그 맛이 더욱 맛있게 느껴진다. 신대초밥의 가격대는 점심 모듬초밥이 11,000원이며, 내가 추천하는 연어롤 14,000원이다. 연어롤의 가격이 조금 높게 느껴질 수 있겠지만,

[React] react 상품 위시리스트 구현하기 [내부링크]

로그인 if(localStorage.getItem("user_id") === null){ alert('로그인 후 위시리스트에 등록 해주세요.') navigate('/user/login') } 처음에 상품을 위시리스트에 담기 위해서는 로그인을 하도록 페이지이동을 하였다. 로그인이 되어 있는지 알기 위해서 로컬 스토리지에 로그인한 정보를 담아두었기 때문에 이를 가져온다. 그래서 이 정보가 null이라면 로그인이 되지 않았다는 의미로, 로그인 페이지로 로그인을 하게 하였다. 로그인이 되었다면 바로 상품이 위시리스트에 담기게 하였다. 위시리스트에 담기 axios .post(`http://localhost:3001/wish_list/wish`, { user_no: localStorage.getItem("user_id"), product_no: product.product_no, }) .then((result) => { console.log(result); setHeart(!heart); al

[React] Crypto로 암호화하기 [내부링크]

단방향 암호화와 양방향 암호화 crypto는 단방향 암호화 방식이고, bcrypt는 양방향 암호화 방식이다. 단방향은 암호화할 수는 있어도 복호화해서 원래의 비밀번호를 알 수 없고, 양방향은 복호화해서 원래의 비밀번호를 알 수 있다. 그러나, Bcrypt는 Blowfish 알고리즘을 사용하기 때문에 해싱이 느리고 해싱에 엄청난 비용이 든다. 만약 해커가 브루트 포스같은 공격을 해대면 서버에 엄청난 부하가 가해진다. 암호화 복호화 단방향 가능 불가능 양방향 가능 가능 해시(hash) 해시(hash) : 해시 함수에 의해 얻어지는 값 해시 함수(hash function) : 해시 알고리즘(hash algorithm)이라고도 하며, 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수 키(key) : 매핑 전 원래 데이터의 값 해시 값(hash value) : 매핑 후 데이터의 값 해싱(hashing) : 매핑하는 과정 해시 알고리즘 다양한 종류의 해시 알고리즘이 있으며, 알고리즘

[React] Crypto로 로그인하기 [내부링크]

비밀번호가지고 로그인 password : 로그인 인증할 때의 사용자가 입력한 비밀번호 userSalt : DB에 저장되어있는 사용자의 salt userPassword : DB에 저장되어있는 사용자의 암호화된 비밀번호(해시 값) 단방향 암호화이므로 복호화를 할 수 없다. 따라서 비밀번호 암호화했을 때의 비밀번호와 salt를 가지고 동일한 방법으로 암호화를 진행하여 나온 값과 비교한다. 이때 salt는 비밀번호를 생성했을 때의 값과 똑같은 값을 사용해야 한다. 그렇지 않으면 일치하지 않는다. 만약 일치한다면 true, 일치하지 않는다면 false를 반환하도록 한다. 최신 코드 export const verifyPassword = async (password, userSalt, userPassword) => { const key = await pbkdf2Promise(password, userSalt, 99999, 64, "sha512"); const hashedPassword = key

[React] 페이지 이동시 값 넘겨주기 [내부링크]

useHistory() import { useHistory } from "react-router-dom"; const test = useHistory(); 처음에 이 방법을 이용하여 사용하고자 했는데, 계속적으로 오류가 나서 찾아보았다. stackflow를 들어가서 해결점을 찾게 되었다. 내가 참고한 글이 오래된 글이었으며, 지금은 useHistory대신에 useNavigate를 사용한다는 것이었다. react-router-dom 6버전에서부터 교체 된 것 같았다. useNavigate() 내가 구현하고자 하는 기능은 버튼 클릭시 페이지가 이동된다. 그리고 이동시에 값도 같이 넘겨주도록 기능을 설계하고자 하였다. import { useNavigate } from 'react-router-dom'; const navigate = useNavigate(); 모듈을 불러오고, let [inputValue, setInputValue] = useState(""); const test = us

[React] useEffect 개념 제대로 알기 [내부링크]

항상 react를 쓰는데 인터넷강의로 너무 간략하게 배우다보니 이에 대한 개념이 적립되지 못해 이제야 이 개념을 적립하고자 정리한다. 개념 useEffect() 함수는 React component가 렌더링 될 때마다 특정 작업(Sied effect)을 실행할 수 있도록 하는 리액트 Hook이다. 여기서 Side effect는 component가 렌더링 된 이후에 비동기로 처리되어야 하는 부수적인 효과들을 말한다. 이러한 기능으로 인해 함수형 컴포넌트에서도 클래스형 컴포넌트에서 사용했던 생명주기 메서드를 사용할 수 있게 되었다. 클래스형 컴포넌트에서는 생명주기 메소드를 사용할 수 있었는데, 이를 함수형 컴포넌트에서도 사용할 수 있게 되었다. 즉, 라이프사이클 훅을 대체할 수 있게 되었다. 라이프 사이클 componentDidMount: 컴포넌트를 만들고, 첫 렌더링을 다 마친 후 실행. componentDidUpdate: 리렌더링을 완료한 후 실행. 즉 render()가 업데이트될 때

[React] Suspense(ft. React v18) 변경사항 제대로 알기 [내부링크]

react가 16에서 알파버전이었다가, 18버전에서는 베타버전이 되었다. 그만큼 안정화가 되었다는 것을 말해준다. 이는 우연히 블로그에서 정보를 찾으려다가 발견한 정보이다. 아직 공부가 많이 필요하다는 것을 많이 느낀다. 그래서 우연히 알게된 이정보에 대해서 공부할려고 찾아보다가 더 많은 부분까지 알게되어 개념은 어느 정도 알겠지만 정리가 안되어, 이 개념을 정리하고자 글을 써본다. 이전에 정리해놓은 글인데 이제야 올립니다. 들어가며, 위에서 말한 것처럼 react의 suspense는 이미 출시되어 있었다. 16버전에서 알파버전이어서 그만큼 불안정했다가, 18버전에는 안정화가 되었다. 여기에서 나오는 개념은 클라이언트 react server개념이 나온다. RSC(React Server Component) 개념 이는 두가지 개념으로 설명할 수 있다. SSR과 CSR로 나뉜다. 1) CSR CSR은 SSR보다 초기 전송되는 페이지의 속도는 빠르지만 서비스에서 필요한 데이터를 클라이언트(

[React] code-splitting 코드스플리팅 알아보기 [내부링크]

앞 전에 suspense를 정리하였다. suspense가 기반되어야 쓸 수 있는 코드에 대해서 정리해보고자 한다. code-splitting 영어 단어 그대로 코드를 나눈다는 것이다. 왜 이것이 필요할까? 앱이 커짐에 따라 번들도 커지게 된다. 특히 큰 third-party라이브러리를 포함하는 경우에 번들에 포함된 코드를 주의깊게 확인해야 한다. 실수로 커진 앱으로 인해 로드시간이 오래 걸리는 문제를 방지한다. 큰 번들로 묶이지 않으려면 번들을 code splitting 하는것이 좋다. code splitting 기능은 런타임시 동적으로 로드할 수 있는 여러 번들을 만들 수 있는 Webpack 및 Browserify와 같은 번들러에서 지원되는 기능이다. code splitting을 하면 사용자가 현재 필요로하는 것들만 lazy-load할 수 있다. 이 말이 무슨 말이냐면 우리가 맨 처음 들어가는 페이지의 리소스만 다운받고, 페이지 이동시 그 페이지 리소스만 다운받게 한다는 말이다.

[React] useRef() 개념 쌓아보기 [내부링크]

개념 useRef는 리렌더링 하지 않는다. 컴포넌트의 속성만 조회&수정한다. → 개인적인 견해로 여러 글을 보았는데 위의 문장이 제일 useRef()를 잘 설명해주는 것 같다. 사용 useRef함수는 current속성을 가지고 있는 객체를 반환한다. 인자로 넘어온 초기값을 current속성에 할당한다. 이 current속성은 값을 변경해도 상태를 변경할 때 처럼 React 컴포넌트가 다시 랜더링되지 않는다. 위에서 정의한 것처럼 리랜더링되지 않기 때문이다. React 컴포넌트가 다시 랜더링될 때도 마찬가지로 이 current 속성의 값이 유실되지 않는다. import React, { useState, useRef } from "react"; function ManualCounter() { const [count, setCount] = useState(0); const intervalId = useRef(null); console.log(`랜더링... count: ${count}`);

[React] 페이지 이동시 스크롤 최상단에 위치하기 [내부링크]

페이지 이동시 임의의 페이지 화면이 보여서 눌렀을 때 최상단에 위치하게 하기 위해서 찾아보다가 이글을 정리하게 되었다. useLocation() 처음에 useLocation()을 알아야 하는데 이는 npm install react-router-dom react-router-dom 모듈을 설치하여 임포트해준다. import { useLocation } from 'react-router-dom'; const location = useLocation(); useEffect(() => { console.log(location); }, [ location ]) 그리고 나서 location 변수에 담아 이를 location이 랜더링될 때마다 콘솔에 찍어 보이게 한다. 그리고 콘솔에 보면, hash, pathname, search 등이 보이는데 pathname을 사용해 줄 것이다. 콘솔 로그에 보이는 것 pathname : URL에 도메인다음의 / 부터의 문자열 search : pathname다

[React] Automatic Batching(react v18) 개념 쌓아보기 [내부링크]

개념 배칭(batching)은 업데이트 대상이 되는 상태값들을 하나의 그룹으로 묶어서 한번의 리렌더링에 업데이트가 모두 진행될 수 있게 해주는 것을 의미한다. 한 함수 안에서 setState(업데이트)를 아무리 많이 호출시키더라도 리렌더링은 단 한번만 발생한다. 나오게 된 배경 이전부터 리랜더링과 관련해서 react-17v에서 이벤트 핸들러 내부에서 발생하는 상태 업데이트만 배치처리를 지원했다. 하지만 이벤트 핸들러 내부에 fetch()등 과 같은 콜백을 받아 처리하는 메소드가 존재할 경우 내부의 콜백이 모두 완료된 후에는 Automatic Batching이 처리되지 않았다. 그리고 react-17v에서 업데이트가 동기적으로 일어나지 않았다. 이전 버전과 최신 버전의 비교 1) React-17v import React, { useState } from "react"; import "./App.css"; function App() { // 2가지의 상태 존재 const [number,

[React] startTransition 개념 알아보기 [내부링크]

React18 버전에서 가장 크게 강조된 키워드는 동시성이다. 자바스크립트는 싱글스레드 언어이기때문에 한 번에 하나의 작업만 처리할 수 있다. 화면이 오래 멈춰있다면 사용자 경험은 악화되기 때문에 웹 개발에 있어서 큰 걸림돌이 된다. React는 렌더링 블록킹 문제를 해결하기 위해 동시성을 이용하게 되었다. 개념 해당 기능은 상태 업데이트를 함에 있어서 우선순위를 정하는데 도움을 준다. 리액트에서는 상태 업데이트 대상을 두가지로 나누었으며, 이를 통해 transition이 의미하는 바가 무엇인지 파악할 수 있다. Urgent updates(높은 우선순위) : 버튼 클릭, 키보드 입력과 같이 직관적으로 보았을 때 업데이트가 즉각적으로 일어나는 것을 기대하는 상태 값들 Transition updates(낮은 우선순위) : 사용자가 상태 값의 변화에 따른 모든 업데이트가 뷰에 즉각적으로 일어나는 것을 기대하지 않는 것들 load(로딩) transition, refresh(새로고침) tra

[React] react-router-dom v6 개념 쌓아보기 [내부링크]

업데이트 날짜를 찾아볼려고 했는데 한 2021년 11월쯤 업데이트한 것 같다. 거의 다 최신 버전으로 쓰고 있고 배우기도 그렇게 배워서 정리해야된다는 생각을 못했는데, 여러 모듈을 쓰다보니 이전 버전들을 쓰는 블로그들로 인해 헷갈려서 정리하게 되었다. 업데이트를 하면서 번들 크기가 최적화가 가능해졌다. 70%정도로 줄어든다. React v16.8 React Router v6은 React Hook을 많이 사용하므로 React Router v6으로 업그레이드를 시도하기 전에 React 16.8 이상으로 설치가 되어 있어야 사용이 가능하다. React Router v5는 React >= 15와 호환된다. 내가 글을 쓰고 있는 시점은 react-router-dom은 v6.3.0이다. 설치 npm i react-router-dom 위와 같은 코드를 치면 최신 버전으로 설치가 된다. 이를 package.json에서 확인 가능하다. 달라진 점 1. switch에서 routes로 변경 // v5

[React] 리스트와 key 개념 쌓아보기 [내부링크]

리스트 import React from "react"; const IterationSample = () => { return ( <ul> <li>봄</li> <li>여름</li> <li>가을</li> <li>겨울</li> </ul> ); }; export default IterationSample; 위의 코드를 보면 <li></li>가 반복되는 것을 알 수 있다. 지금은 ul태그 하나 뿐이라 그렇게 문제가 되지는 않아 보인다. 그렇지만 코드가 좀 더 복잡하다면 코드의 양은 더욱 늘어날 것이고, 파일 용량도 쓸데없이 증가할 것다. 코드 관리가 점점 어려워질 것이다. → 이러한 경우는 map()을 사용하여 반복적인 코드를 정리해서 정리하면 된다. import React from "react"; const IterationSample = () => { const names = ["눈사람", "얼음", "눈", "바람"]; const nameList = names.map((name) =>

[React] useEffect와 useLayoutEffect 비교하여 알아보기 [내부링크]

필수 개념 Render: DOM Tree 를 구성하기 위해 각 엘리먼트의 스타일 속성을 계산하는 과정 Paint: 실제 스크린에 Layout을 표시하고 업데이트하는 과정 즉 시각적 변경 사항이 사용자에게 표시되는 것을 말함. 개념 1) useEffect useEffect는 컴포넌트들이 render와 paint된 후 실행된다. 이는 비동기적(asynchronous)으로 실행된다. paint된 후 실행되기 때문에, useEffect내부에 DOM에 영향을 주는 코드가 있을 경우 사용자 입장에서는 화면의 깜빡임을 보게된다. useEffect 흐름 2) useLayoutEffect useLayoutEffect는 컴포넌트들이 render된 후 실행되며, 그 이후에 paint가 되게 된다. 이 작업은 동기적(synchronous) 으로 실행되며, paint가 되기전에 실행되기 때문에 DOM을 조작하는 코드가 존재하더라도 사용자는 깜빡임을 경험하지 않게 된다. useLayoutEffect 흐름 u

[React] props 개념 다지기 [내부링크]

react의 기본 개념이 부족해서 값을 전달하거나 받아오는 것에 한계를 느껴 기본 개념을 정리하다가 글을 쓰게 되었다. 개념 컴포넌트 속성을 설정할 때 사용하는 요소로, 간단히 말하자면 컴포넌트에서 컴포넌트로 전달하는 데이터이다.(단방향 데이터의 형식의 흐름을 갖는다) properties의 줄임말이다. props는 읽기 전용으로, 함수 컴포넌트나 클래스 컴포넌트 모두 컴포넌트의 자체 props를 수정해서는 안된다. 모든 React 컴포넌트는 자신의 props를 다룰 때 반드시 순수 함수처럼 동작해야한다. 순수함수 → 입력값을 바꾸려 하지 않고 항상 동일한 입력값에 대해 동일한 결과를 반환하기 때문 function sum(a, b) { return a + b; } 순수함수 → 자신의 입력값을 변경하기 때문 function withdraw(account, amount) { account.total -= amount; } 사용방법 프로퍼티에 문자열을 전달할 때는 큰 따옴표(””)를 사용

[React] Context()알아보고 활용하기 [내부링크]

context()에 대해서 정리하는 이유는 많이 보았기에 궁금해서 찾아보다가 너무 유익해서 정리하고자 한다. context()는 언제 쓰는가 여러 글 봤었는데 유튜브의 영상이 잘 설명되어 있어서 맨아래에 첨부해놓는다. react로 개발을 하다보면 props를 가져와서 쓰고 싶은 경우가 생긴다. 즉 하위 컴포넌트에서 상위 컴포넌트의 데이터를 가져오고 싶은 것이다. 나의 경우는 navigate와 location을 많이 사용했었다. 또한, redux를 사용하지 않아서 아직은 상태관리에 많은 어려움을 겪고 있다. 그러던 와중 context()를 알게 된 것이다. 위에서도 말한 것 같이 데이터를 전역적으로 사용하고 싶을 때 context()를 쓴다. Context 저장하기 1) React.createContext() 만들기 Context 를 만들 땐 다음과 같이 React.createContext()라는 함수를 사용한다. 이는 import { createContext } from "react

[React] 이미지 업로드, custom hook, 페이지 이동, props 관련 정리 [내부링크]

1. 이미지 업로드 const onClickImageUpload = useCallback(() => { imageInput.current.click(); }, [imageInput.current]); <input type="file" multiple hidden ref={imageInput} /> <Button onClick={onClickImageUpload}>이미지 업로드</Button> 2. hook으로 저장하여 커스텀 훅으로 사용 여기서 거의 핸들러 빼고 setter만 넣어서 value와 setter만 리턴하는 경우로 많이 쓴다. import { useState, useCallback } from 'react'; export default (initValue = null) => { const [value, setter] = useState(initValue); const handler = useCallback((e) => { setter(e.target.value); }, [

[React] StrictMode 개념 다지기 [내부링크]

우연히 글을 보다가 정리해두면 좋겠다 싶어서 정리하게 되었다. 정리하게 된 계기 React18 + StrictMode에서는 개발모드에서 data fetching이 최소 두 번이상 일어날 수 있다. 이러한 글을 계속 보았지만 왜 그런지 모르고 그냥 그런가보다하고 넘어갔다. 우리가 react를 이용하여 웹 사이트를 구현하고자 할 때 app.js는 기본적으로 생성된다. ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); 위와 같이 app.js가 생겼는데, 이를 아래와 같이 바꾸면 두번이나 재랜더링이 되지 않는다. ReactDOM.render( <App />, document.getElementById('root') ); 개념 공식문서에 따르면 strictmode는 StrictMode는 애플리케이션 내의 잠재적인 문제를 알아내기 위한 도구입니다. Fragment 와

[React] useState() 개념 다지기 [내부링크]

우연히 글을 보다가 useState()가 비동기방식이라는 것을 알 수 있었다. 근데 react 코드를 짜면서 느낄 수 있는 부분들이 많아 놀랍지는 않았지만, 개념으로 확인시켜주니 좋았다. 그래서 비동기방식으로 처리할 때 불편함이 있어 동기 방식으로 처리하는 방식을 알고자 정리하게 되었다. 개념 const로 선언하는 이유는? 변수의 재할당을 막기 위해서 let을 사용하면 변수의 재선언이 가능해지기 때문에, 이를 방지하고 setState를 사용한 변수 변경만을 허락하기 위해서 const로 선언 state를 사용하는 이유 변수는 변경되어도 자동으로 화면이 바뀌지 않는다. setState를 사용시 state가 변경되면 자동으로 화면이 바뀌기 때문에 state를 사용한다. 비동기 방식 우선 개념에 대해서 보면, 동기 방식은 동시에 발생하여 요청을 받으면 응답을 받아야 다음 동작이 수행된다. 반면 비동기 방식은 종료여부에 상관없이 다음 작업을 실행한다. state는 값이 변경되면 리렌더링이 발