Vite로 구성한 React Project에 eslint 설정하기
CRA와 다르게 vite는 eslint가 기본설치 되지 않으므로 필요 모듈 설치 및 config작성을 따로 해줘야 한다.
vite로 react proejct 생성
생각보다 간단하다
1 | $ npm create vite@latest |
명령어를 입력하고 나면 다음 이미지처럼 나오는데 키보드로 이동해 선택 해서 만들면 끝

1 | 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. |
answers | return |
---|---|
[1,2,3,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
1 | const makeArray = (arr, length) => { |
a,b,c의 배열 만드는 코드
1 | const makeArray = (arr, length) => { |
arr이 [1, 2, 3, 4, 5]이고 length가 8이라면, […Array(length)]은 [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
를 만들게 되고, i(index)
가 0일때 arr[0 % 5]
는 0이므로 arr의 0번째 인덱스 1
이 들어가게 된다.
다른건 필터하고 높은 값 구해서 answer에 push 해주는 것..
다른사람의 풀이를 보았다.
1 | function solution(answers) { |
간단, 나처럼 배열을 만드는 과정없이 바로 filter를 했다.
vite로 구성한 react앱을 github actions로 빌드하고 aws에 배포하는 과정에서
unauthorized 에러가 계속 뜨길래 빌드된 js 파일을 찾아봤더니
env가 포함되지 않아 apikey를 찾지 못하는 에러가 발생하였다.
github secrets에 apikey를 저장해놓고 actions 과정에 env파일을 생성하고,
secrets에 저장해 둔 key를 삽입해 줄 수 있다.
1 | name: deploy # 해당 workflow의 이름 |
최근 만든 project를 aws에 배포할려고 하는데
계속 이 에러가 떳다..
검색도해보고 gpt한테도 물어봤는데
1 | [ |
이걸 적으라고 한다.. 저장은 되지만 403error 가 뜬다
고민좀하다가…
권한
탭에 있는 버킷 정책
에 작성 해봤다..
그랬더니 잘 된다 🤣
원티드 세션에서 Amazon
으로 서비스를 배포하고, Github Action
으로 자동 배포하는거 까지 배운 내용을 정리한다.
aws에서 s3 서비스를 검색하여 새로운 버킷을 만들어 준다.
버킷 이름을 적어주고
AWS리전은 아시아 태평양(서울)ap-northeast-2
로 선택을 해주었다.
다른 옵션은 딱히 건들지 않고,
퍼블릭 액세스 차단 설정을 풀어주지 않으면 웹페이지가 403뜨면서 접속 할 수가 없다.
버킷을 만들기를 하고 나면 리스트에 버킷이 생성 된다.
만든 버킷으로 들어가 속성
탭 가장 아래에 정적 웹 사이트 호스팅
에서 편집을 해준다.
인덱스 문서에서 index.html
을 entry 파일로 지정해준다.
그리고 나서 권한
탭으로 들어가 버킷 정책
을 작성 해준다.
1 | { |
Resource
부분에는 "arn:aws:s3:::<자신의 버킷이름>/*"
으로 작성 해줘야한다.
그리고 나서 객체
탭으로 들어가 빌드한 파일들을 올려주기만 하면 된다.
이러면 배포 자체는 끝난다.
깃헙 action을 통해 자동배포를 할려면 aws에서 access_key를 발급받아야 한다.
사용자 탭에서 보안자격증명
으로 들어가준다.
새 액세스 키를 만들어주면 되는데 주의할 점은 보안 액세스 키
는 처음 생성할때만 확인 할 수 있으므로
키 파일을 다운로드 받아놓거나 다른 곳에 잘 적어놔야 한다.. 아니면 삭제하고 다시 만들어야 함!
원티드 3차 과제 중 무한 스크롤을 구현해야했다
react-query
의 useInfiniteQuery
를 이용해서 만들었다intersectionObserver
를 이용해 감지요소가 화면에 들어오면 api 요청을 하는건 기존에 했던 방식과 비슷하다
1 | const { data, isLoading, hasNextPage, fetchNextPage, isFetching } = useInfiniteQuery( |
useQuery
와 비슷한 리턴값을 갖는다.hasNextPage
는 boolean으로 다음 페이지가 있는지,fetchNextPage
는 말그대로 다음 페이지를 요청해주는 메소드,isFetching
은 현재 api 요청중인지를 boolean으로 리턴해준다
getNextPageParam
의 리턴값이 다음 요청때 쓰일 param을 리턴 시키면 pageParam 에 들어가서 다음 요청 파라미터로 사용된다.
getNextPageParam
의 lastPage를 콘솔로 찍으면 실제 데이터가 들어있다.
여기서 다음페이지를 요청할때 필요한건 page
값이니 이걸 +1 시켜서 리턴해준다
data
를 콘솔로 찍으면 pagePrams
에는 page값이 들어있고pages
에 array로 데이터가 들어있다.
화면에 뿌려지기 위한 데이터는 results 배열에 들어있으므로 이중 배열이 된다
그냥 map을 두번 돌아서 화면에 렌더링 할 수도 있지만flatMap
이란 메소드를 이용해서 작업하였다
1 | const movieResults = useMemo(() => { |
flatMap
은 말그대로 flat
과 map
을 합쳐 놓은거다 각 엘리먼트에 map수행 후, 결과를
flat으로 평탄화 해준다.
private
protected
static
1 | abstract class Department { |
1 | interface ValidUser { |
1 | type Admin = { |
1 | type Combinable = string | number; |
1 | type UnknownEmployee = Employee | Admin; |
1 | { |
outDir
옵션을 ./dist
로 하고 컴파일 하면 폴더 디렉토리까지 그대로 dist
에 생성 된다
주의 할점
rootDir
옵션을 사용하지 않고 src
디렉토리 외부에 다른 ts파일이 있다면
컴파일 했을시 src
폴더 자체도 컴파일에 포함되어 dist
에 들어가게 된다.
compilerOptions
에 rootDir
옵션을 만들어주고 다시 컴파일하면
1 | { |
src
폴더 내부의 파일만 컴파일 되어 dist에 들어 가게 된다
map()
메소드를 이용해서 컴포넌트를 렌더링 하는데
이런 에러가 떴다.
잉 이게 무슨 말이야!
key 값은 넣어줬고….
type이랑 props가 없다는게 무슨 말이야!?
검색을 했는데 내가 원하는 답을 찾기가 어려웠다
의외로 단순한 문제였는데<></>
프래그먼트로 감싸주니 해결되었다.
jsx에서 map
을 이용해서 컴포넌트를 렌더링 할때도 프래그먼트로 감싸주었었나?..
헷갈린다.
typescript
공부를 한다고 ts로만 작성을 하는중인데 사실 이게 맞게 하는건지 잘 모르겠다
파이널프로젝트가 끝나고 조원끼리 사이드 프로젝트를 하기로 했다.firebase
를 이용하기로 해서 공부를 했다.
react를 설치해주고
firebase도 따로 설치 해준다
1 | $ npm i firebase |
firebase 사이트에서 프로젝트를 추가 해준다
프로젝트 만들기가 끝나면 해당 프로젝트로 들어가서
프로젝트 설정에 가서 web으로 앱을 만들어 준다
앱등록이 되면
firebase를 설치하라는 설명과 함께 firebaseConfig
가 나온다
이 config를 react에 붙여 넣어줄거다
이메일로 회원가입을 할 수 있게 설정 해준다
src
하위에 firebase
디렉토리를 만들어주고 index.ts
를 생성 해준다
1 | // src/firebase/index.js |
그럼 firebase 설정 끝 생각보다 간단하다.
Resister.tsx를 만들어주고
간단하게 input과 회원가입 버튼을 만들어 준다
1 | import React from "react"; |
submit 이벤트를 만들어서 input의 밸류를 받아온다
1 | import React from "react"; |
firebase에서 제공하는 메서드인 createUserWithEmailAndPassword()
이용해서 회원가입을 할 수 있다.
1 | import React from "react"; |
createUser()
라는 함수를 만들어서 submit이벤트 안에서 id
와 pw
를 인수로 넘겨 주면서 실행한다.
createUserWithEmailAndPassword()
는 3개의 매개변수를 받는다.
auth에는 firebase에서 제공하는 getAuth()
를 넣어주면된다
두 번째 , 세 번째에는 id와 pw를 넣어준다
createUserWithEmailAndPassword()
는 promise를 반환하기 때문에
비동기 처리를 해줘야한다.
createUserWithEmailAndPassword()
에 id와 pw는 type이 string이어야 하는데,
formData로 id와 pw를 가져왔더니 데이터 type이 string이 아니여서 string으로 타입변환을 해주어야 한다.
그런데도 계속 에러가 떠서 봤더니 type에 null도 있어서 그런거 같다.
1 | const res = await createUserWithEmailAndPassword( |
id와 pw에 !를 붙여 null, undefined가 아니라고 단언 해준다!
Non-null assertion operator란?
접미에 붙는 느낌표(!) 연산자인 단언 연산자는 해당 피연산자가 null, undeifined가 아니라고 단언해준다.
아이디와 비밀번호를 치고 회원가입을 하면 firebase에서 회원가입이 된걸 확인 할 수 있다.
router를 이용해서 redirect를 시켜 주기만 하면된다!