1. 주제 정하기

    - 내가 만들고 싶어 하는 게 무엇인지 생각하기

    - 내가 사용할 것을 만들어야 배움의 깊이가 훨씬 깊습니다.

    - 아무거나 정하는 것 보단 현실에서 있는 문제를 찾고 그 문제를 해결한 경험을 높게 쳐줌 아무거나 하지말자!

 

2. 내가 하고 싶은 게 뭔지 어떻게 아나요?

    - 가장 쉽게 시작할 수 있는 것은 나의 생활에서 바꿀 수 있는 것을 찾아보는 것입니다. 요즘 내 감정은 어떤가요?

    - ex) 내 하루 루틴이 어떤가요?

 

3. 구체적으로 접근하기

    - 5-WHY 기법을 통해 아이디어를 찾아보자!

       1. 처음 시작은 내 일상 속에서 찾아보기

       2. 문제를 기술로 해결할 수 있는지 아닌지 생각하기

 

    - 불편한 상황이 잘 기억나지 않아요… 어떡하죠?

       1. 평소에 메모하는 습관이 중요합니다.

       2. 불편한 것을 느꼈을 때, 그 순간 왜 불편한지 메모!!

 

ex) 5-WHY 기법

불편함을 느낀 상황 왜 불편 했나요? 왜 그랬던 것 같나요? 왜 그랬던 것 같나요? 기술로 해결이 가능한 문제인가요?
         

 

기본적으로 프로젝트의 전반적인 이해가 필요할 때 듣기 좋아 보여서 샀는데 아직 1일 차지만 내용이 너무 좋네요!! 개발자가 되고 싶어서 사이드 프로젝트를 아무거나 일단 하면서 기술적 레벨업을 해야 해!!!라고 생각한 저에게 잘못된 방향성이란 걸 꺠우치게 된 날인 것 같습니다!!

 

흠... 정리할게 많네요...

 

오늘의 목표 : 사이드 프로젝트 주제 정하기 및 5-WHY기법을 통해 기술적으로 해결이 가능한지 알아보기!

 

지금 듣고 있는 강의 : https://fastcampus.co.kr/dev_online_spdutch

 

사이드 프로젝트 : 10개 기술스택으로 구현하는 풀스택 서버리스 프로젝트 with React | 패스트캠퍼

언어와 프레임워크만 배운다고, 완성된 프로젝트만 따라한다고 내가 원하는 서비스를 개발할 수 있을까요? 서비스 구현 외에도 기획과 유지 보수, 적정 기술을 선택하여 문제를 해결하는 방법

fastcampus.co.kr

기억에 남는 일

1. 로그인 토큰 관리

2. FullCalendar를 사용한 데이터 집어넣기

3. 의사전달의 명확성

 

메인 프로젝트는 나에게 있어서 진화를 시켜줬다!

원래 코드를 치는 것을 재밌어하는 사람이었습니다. 하지만 요즘 들어 점점 지쳐가고 있었습니다. 하지만 지쳐가고 있을 때 메인 프로젝트를 시작하게 되는 데 프로젝트를 하면서 사람과 소통을 하고 Figma를 짜면서 구상을 해 나아가는 게 너무 재밌었습니다. 그리고 난 뒤 결과물을 보는 데 와... 이게 내가 만든 사이트구나 싶고 너무 뿌듯하고 너무 기분이 좋았습니다. 그리고 난 뒤 메인이 끝난 지금은 약간의 공허함이 있는 것 같습니다. 매일 많이 잘 때는 4~5시간 적게 잘 때는 2~3시간 자고 한 달 동안 개발만 하다가 갑자기 끝나니 먼가 기분이 묘하더라고요.... 그리고 코딩에 재미를 다시 찾게 된 것 같아요! 그래서 저는 메인 프로젝트가 저에게 있어서 진화를 시켜준 계기가 되었다고 생각합니다!!!!

 

배운 거

1. 로그인 토큰 관리 

 개발을 하면서 처음으로 로그인 관련 토큰 관리하는 로직을 처음으로 만들어 봤는 데 처음에 접근할 때 겁부터 먹었던 것 같아요... 이유는 토큰이 뭔지도 모르겠고... 토큰을 관리하라고 하는데 맨날 게시판 CRUD만 만들다가 관리하라고 하니... 뭔지 모르겠던 거죠.. 아.. 먼산 같은 토큰.... 이였죠 하지만 구글 신은 항상 답을 알고 있고 그 답을 찾아 로컬 스토리지, 세션 스토리지, 쿠키를 알게 되었죠!!! 알게 된 저장소를 통해 관리하는 법을 알게 되어 다음에 로그인 로직을 만들면 더 잘할 수 있을 것 같다는 생각을 품으며 이번 프로젝트가 막을 내린 것 같습니다.

참고 : 로컬 스토리지는 사이트를 나가도 저장소에 남아있고, 세션 스토리지는 사이트를 나가면 저장소가 비어있게 돼요! 

 

2. FullCalendar에 데이터 집어넣기

 맨 처음 풀 캘린더 라이브러리에 데이터를 어떻게 집어넣을까를 많이 고민한 것 같아요!! 구글 신의 검색이 없었다면 300년은 걸렸겠지만 구글 신은 항상 정답을 알고 있죠... FullCalendar에 데이터를 집어넣을 때 events라는 곳에 배열로 집어넣으면 되는 거였죠! 그래서 배열로 내가 넣고 싶은 데이터를 배열화시켜 넣는 로직을 만들어 넣었어요!

<FullCalendar
              viewClassNames="calendar"
              dayCellClassNames="calevent"
              defaultView="dayGridMonth"
              plugins={[dayGridPlugin]}
              contentHeight="600"
              locale="ko"
              events={datelist}
            />

3. 의사전달의 명확성

서로가 생각의 차이가 존재하고 프로젝트의 각오도 달라서 눈치를 보면서 말을 했었습니다. 하지만 뒤로 갈수록 의사전달의 명확성이 있어야 서로가 피곤하지 않게 작업을 할 수 있을 것 같아서 안되는 거랑 되는거 그리고 같이 언제까지 어느 정도 할지 등.. 프로젝트에는 상대와 나의 의사소통이 가장 중요하단 걸 깨닫게 된 것 같아요!! 그래서 다음 프로젝트에는 더 명확하지만 쿠션어로 전달할 수 있게 하려고 노력할 겁니다!! 물론 이번 프로젝트도 좋았지만 아쉬운 거죠!!

 

이번 프로젝트로 저는 성장했다고 생각합니다. 그리고 이제부터는 매일 블로그를 쓸려고 노력할 겁니다... 아마?

'코드스테이츠' 카테고리의 다른 글

코드스테이츠 잡서칭 1일차  (2) 2022.12.08
기술면접 준  (2) 2022.10.19
CORS 에러를 해결하는 방법 및 proxy 기능  (1) 2022.10.13
[Deploy] CI/CD  (0) 2022.10.12
Lighthouse  (0) 2022.10.07

JavaScript

  • Hoisting과 Temporal Dead Zone이 어떻게 연관되어 있는지 설명하세요.

브라우저 렌더링

  • 브라우저 렌더링 방식에 대해 설명하세요.
  • 리플로우와 리페인트에 대해 설명하세요.
  • 반응형 웹은 무엇이고 장단점에 대해 설명하세요.
  • 자바스크립트 엔진의 콜 스택이 무엇인지 설명할 수 있나요?

번들링과 웹팩

  • 번들링은 왜 필요한가요.

   

번들링이 왜 필요한가요?

번들이란 묶는다는 뜻으로 뭔가를 묶는 작업이라는 것을 이름에서 유추할 수 있습니다. 

번들링이란 모듈들의 의존성 관계를 파악하여 그룹화시켜주는 작업을 뜻합니다. 모듈이란 분리된 파일입니다.

 

그렇다면 파일을 모듈로 분리한 이유는 무엇일까요? 그것은 작업의 효율성을 위해서입니다. 스크립트의 크기가 점점 커지고 복잡해지면서 단순히 하나의 파일이나 클래스로만 관리하기에는 그 복잡하기 때문입니다. 그렇기 때문에 머리, 가슴, 팔, 다리를 따로 떼어서 모듈로서 작업을 할 필요가 생겼습니다.

 

분리된 모듈들은 연계성을 띄어야하기 때문에 모듈 내부에는 import로 외부 모듈의 기능을 가져오고 export로 외부 모듈에서의 접근을 허용하여 모듈의 기능을 내보냅니다.

 

모듈 import와 export 외에도 번들링이 필요한 이유는 여러개의 파일을 브라우저에서 로딩한다면 네트워크가 그만큼 소모되어 속도가 저하 될 수 있고 모듈 간의 변수 충돌 등의 위험성이 존재하기 때문입니다.

 

번들러(bundler)란, 웹 애플리케이션을 구성하는 모든 자원을 하나의 파일로 묶는 도구를 의미합니다.

번들러를 사용하게 되면, 아래와 같은 장점등을 얻습니다.

1. 모듈 단위의 코드 작성

2. 네트워크 병목 완화 (최적화)

3. 웹 개발 작업 자동화

 

React

  • Virtual DOM이 무엇이고, Virtual DOM이 어떤 면에서 좋은가요?
  • Class Component와 Function Component의 차이점이 무엇인가요?
  • React Hook의 사용 규칙에 대해 설명하세요.

운영체제

  • Node.js는 싱글 스레드인가요?
  • JavaScript는 싱글 스레드입니다. 어떻게 싱글 스레드 방식으로 비동기 호출을 할 수 있는 지에 대해 설명할 수 있나요?
  • Event Loop에 대해 설명할 수 있나요?
  • 가비지 컬렉션이란 무엇이며, 가비지 컬렉션을 가진 언어에는 무엇이 있나요?

자료구조

  • Stack과 Queue의 차이점은 무엇인가요?

스택(stack)이란 쌓아 올린다는 것을 의미한다.

따라서 스택 자료구조라는 것은 책을 쌓는 것처럼 차곡차곡 쌓아 올린 형태의 자료구조를 말한다.

 

📌 스택의 특징

스택은 위의 사진처럼 같은 구조와 크기의 자료 정해진 방향으로만 쌓을수 있고,

top으로 정한 곳을 통해서만 접근할 수 있다.

top에는 가장 위에 있는 자료는 가장 최근에 들어온 자료를 가리키고 있으며,

삽입되는 새 자료는 top이 가리키는 자료의 위에 쌓이게 된다.

스택에서 자료를 삭제할 때도 top을 통해서만 가능하다.

스택에서 top을 통해 삽입하는 연산 'push' , top을 통한 삭제하는 연산 'pop'이라고 한다.

 

따라서 스택은 시간 순서에 따라 자료가 쌓여서 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다

구조적 특징을 가지게 된다.

 

이러한 스택의 구조를 후입선출(LIFO, Last-In-First-Out) 구조이라고 한다.

  • Tree와 Graph의 차이점은 무엇인가요?
  • 이진 탐색 방법에 대해 설명할 수 있나요?

'코드스테이츠' 카테고리의 다른 글

코드스테이츠 잡서칭 1일차  (2) 2022.12.08
메인 프로젝트 회고  (1) 2022.12.07
CORS 에러를 해결하는 방법 및 proxy 기능  (1) 2022.10.13
[Deploy] CI/CD  (0) 2022.10.12
Lighthouse  (0) 2022.10.07

CORS 정책이 필요한 이유

다른 도메인에서 API를 요청해서 사용 할 수 있게 해주려면 CORS 설정이 필요하다는 것

CORS 교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제입니다.

 

프론트엔드 개발자가 백엔드 개발자에게 프론트엔드 개발 서버 도메인을 허용해달라고 요청을 해야하고, 백엔드 개발자는 응답 헤더에 필요한 값들을 담아서 전달을 해줘야 합니다. 서버에서 적절한 응답 헤더를 받지 못하면 브라우저에서 에러가 발생하기 때문입니다.

 

 

 

Proxy

proxy를 통해 백엔드 서버로 요청을 우회하여 보내게 됩니다. 그러면 백엔드 서버는 응답을 React 앱으로 보내고, React 앱은 받은 응답을 백엔드 서버 대신 브라우저에게 전달합니다.

원래는 브라우저가 중간관리를 했는데 Proxy를통한 우회하여 요청/응답을 하여 Cors에러가 안나온다!

'코드스테이츠' 카테고리의 다른 글

메인 프로젝트 회고  (1) 2022.12.07
기술면접 준  (2) 2022.10.19
[Deploy] CI/CD  (0) 2022.10.12
Lighthouse  (0) 2022.10.07
리액트가 번들링이 필요한 이유  (0) 2022.09.27

전통적인 개발 프로세스 VS 모던 개발 프로세스

  워터폴 애자일
장점 - 프로세스가 길고 순서가 잡혀 있으므로 팀의 규모에 상관 없이 따르기 쉬움
- 개발 주기가 정해져 있으므로 새로운 프로젝트를 안정적으로 시작 가능
- 요구 사항이 확정되어 있으므로 프로젝트를 실행하기 수월하며, 개발 목표를 자주 변경하지 않아도 됨
- 프로젝트의 전 과정에 필요한 예산 및 자원이 초기에 확정되어 예상 결과와 리스크를 통제하기 훨씬 쉬움
- 빠르면서 유연한 개발 과정
- 짧고 반복적인 스프린트로 구성되어 있어 품질에 초점을 맞출 수 있으므로 빠르게 결함을 인지하고 수정 가능
- 스프린트를 통한 짧은 반복 과정으로 개발 과정 중에 신속히 제품 변경 가능
단점 - 개발이 순차적으로 진행되므로 앞 단계가 완성되지 않으면 다음 단계로 넘어갈 수 없어 개발 속도가 느리고 유연성이 떨어짐
- 테스팅 단계에 이르러서 이슈가 발견되는 경우가 왕왕 있음
- 개발 요구 사항이 초기에 확정되므로 범위 변경이 자유롭지 못함
- 스프린트에 대한 경험이 있으며 빠른 반복 작업에 익숙한 스크럼 마스터가 필요함
- 고객이 수많은 변경 사항을 검토해야만 하는 번거로움 발생
- 팀원이 잘 조직되어 있지 않거나 자립성이 떨어지는 경우 애자일론을 채택할 시 문제가 발생

 

  워터폴 애자일
이런 상황에 적합 - 높은 예측 가능성과, 순차적인 프로젝트 타임라인, 사전 확정 예산이 필요한 경우
- 프로젝트 팀의 경험이 적은 경우
- 요구사항이 간단하거나, 타임라인이 긴 프로젝트를 수행하는 경우
- 요구사항이 간단하거나, 타임라인이 긴 프로젝트를 수행하는 경우
- 프로젝트가 완벽히 수행될 때까지 결과물을 기다리는 것보다 결과물에 대해 빠른 피드백이 필요한 경우
이런 기업 및 팀에 적합 - 개발상의 변경이나 리스크에 덜 민감한 기업 및 팀
- 제한적인 시간과 자원 탓에 협업이 자유롭지 못한 고객을 둔 기업 및 팀
- IBM, 시스코, AT&T, 마이크로소프트와 같이 크고 복잡한 회사들이 프로세스를 간소화해 변화에 더욱 신속하게 대응하고자 할 때
- 고객 및 외부 관계자와 정기적으로 긴밀한 협업을 수행하는 프로젝트 팀

 

DevOps

  Dev(개발팀) Ops(운영팀)
특징 - 잦은 배포 및 업데이트
- 애플리케이션을 통해 새로운 기능(리소스)제공
- 프로덕션 앱의 안정성 확보
- 인프라 관리
- 모니터링 및 제어

 

DevOps 특징

DevOps는 개발에서 운영까지 하나의 통합된 프로세스로 묶어내고 사용하는 툴과 시스템을 표준화하여 의사소통의 효율성을 확보하고 일련의 작업들을 자동화합니다.

 

CI/CD란

"CI"는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미합니다.

"CD"는 지속적인 서비스 제공(Continuous Delivery) 및/또는 지속적인 배포(Continuous Deployment)를 의미합니다.

 

CI/CD의 단계

- 지속적 통합(Continuous Integration, CI) : Code - Build - Test

  • Code : 개발자가 코드를 원격 코드 저장소 (Ex. github repository)에 push하는 단계입니다.
  • Build : 원격 코드 저장소로부터 코드를 가져와 유닛 테스트 후 빌드하는 단계입니다.
  • Test : 코드 빌드의 결과물이 다른 컴포넌트와 잘 통합되는 지 확인하는 과정입니다.

- 지속적 배포(Continuous Delivery/Deployment, CD)

     지속적인 서비스 제공(Continuous Delivery) 및 지속적인 배포(Continuous Deployment)를 의미하며 Release - Deploy - Operate단계를 거친다.

  • Release : 배포 가능한 소프트웨어 패키지를 작성합니다.
  • Deploy : 프로비저닝을 실행하고 서비스를 사용자에게 노출합니다. 실질적인 배포 부분입니다.
  • Operate : 서비스 현황을 파악하고 생길 수 있는 문제를 감지합니다.

 

'코드스테이츠' 카테고리의 다른 글

기술면접 준  (2) 2022.10.19
CORS 에러를 해결하는 방법 및 proxy 기능  (1) 2022.10.13
Lighthouse  (0) 2022.10.07
리액트가 번들링이 필요한 이유  (0) 2022.09.27
간단한 웹앱 번들링 사용  (3) 2022.09.26

사이트를 검사하여 성능 측정을 할 수 있는 도구인 Lighthouse를 소개합니다. Lighthouse는 다양한 지표를 이용하여 웹페이지의 성능 검사를 해줄 뿐만 아니라 그에 대한 개선책도 제공해줍니다.

Lighthouse는 구글에서 개발한 오픈소스로서 웹 페이지의 품질을 개선할 수 있는 자동화 툴입니다. Lighthouse는 성능, 접근성, PWA, SEO 등을 검사하며 이를 이용해 사용자는 어떤 웹페이지든 품질 검사를 할 수 있습니다.

Lighthouse는 Chrome DevTools부터 CLI, 노드 모듈 등 다양한 경로를 통해 사용할 수 있습니다. 검사할 페이지의 url을 Lighthouse에 전달하면 Lighthouse는 해당 페이지에 대한 여러 검사를 실행합니다.

그 후, 위 이미지처럼 검사 결과에 따른 리포트를 생성하고 개발자는 해당 리포트를 통해 점수가 낮은 지표에 대해 개선을 꾀할 수 있습니다. 또한 각각의 지표가 왜 중요한지, 어떻게 개선할 수 있는 지에 대한 레퍼런스도 리포트에서 참고할 수 있습니다.

 

Lighthouse 시작하기

Lighthouse를 이용할 수 있는 방법은 다양합니다. 여러분의 개발환경에 가장 친숙한 방법을 골라 Lighthouse를 실행할 수 있습니다.

 

Chrome 개발자 도구에서 실행하기

  1. 크롬에서 검사하고 싶은 페이지의 url을 입력합니다.
  2. 개발자 도구를 엽니다.
  3. lighthouse 탭을 클릭합니다.
  4. Generate report를 클릭합니다. Categories에서 특정한 지표만 선택하여 검사할 수도 있습니다.
  5. 대략 30-60초간 검사가 실행됩니다. 그 후 아래와 같이 리포트가 해당 페이지의 개발자 도구내에 생성됩니다.

'코드스테이츠' 카테고리의 다른 글

CORS 에러를 해결하는 방법 및 proxy 기능  (1) 2022.10.13
[Deploy] CI/CD  (0) 2022.10.12
리액트가 번들링이 필요한 이유  (0) 2022.09.27
간단한 웹앱 번들링 사용  (3) 2022.09.26
웹 표준 & 접근  (0) 2022.09.07
function solution(s) {
    const l = s.length;
    if(l !== 4 && l !== 6) return false;
    
    // return s.split('').map(Number).filter(isNaN).length === 0;
    return Number(s) === parseInt(s);
}

/*
NaN 특징:
-특별한 숫자형 value, (typeof NaN // 'number')
-'잘못된 입력으로 계산할 수 없음'을 의미하는 값임
-Number('a'), Math.~(), 'a'/2 ... 등 함수의 결과 혹은 연산 결과로 등장한다
 + Number.NaN 즉, 전역객체 Number의 프로퍼티이다 (console.dir(Number) // { NaN: NaN }) -> 브라우저에 내장된 변수이다.


*NaN은 판별에 주의해야함*
1) isNaN(NaN) // true 
2) NaN === NaN // false 
  *** [1,2,NaN,4].indexOf(NaN) // -1  <-> [1,2,NaN,4].includes(NaN) // true

따라서 자료구조에서 NaN를 구별해야하는 로직에서는 콜백함수를 통해 isNaN() 함수를 사용하는 것이 바람직해보임. (고차함수: forEach, find, findIndex)
(typeof NaN === 'number' // true)


3줄요약
1. 숫자형 데이터에는 숫자가 아닌 값을 나타내는 특별한 값이 존재. NaN
2. 배열 메소드 중에 NaN을 판별하지 못하는 메소드가 존재함
3. NaN의 판별은 함수 isNaN()을 사용할 것
*/
리액트가 번들링이 필요한 이유

리액트는 점점 복잡해지는 프론트엔드 개발의 여러 문제를 해결하기 위해서 자연스럽게 생겨나게 되었습니다. 2010년대 초중반 당시 주류였던 앵귤러는 하나의 프레임워크로서 정형화되고 체계화된 프론트엔드 개발 경험을 제공해서 많은 환영을 받았습니다. 다만, 프레임워크라는 점 때문에 기본적으로 필요한 코드의 양이 많았고, 배우는데 필요한 시간도 오래 걸렸고, 번들 사이즈가 커지고 성능 문제도 점점 커져나가고 있었습니다.

리액트는 당시 앵귤러의 단점을 보완할 수 있는 대체재로서 뷰와 함께 거론되기 시작했습니다. 리액트가 주목받던 이유 중 하나가 “프레임워크가 아니고 라이브러리"라는 점 때문이었습니다. 프론트엔드 개발에 꼭 필요한 점 말고는 코드를 추가하지 말고, 더 필요한 것이 있으면 개발자가 설치하라는 의견을 제시했습니다.

 

Learn Once, Write Anywhere

We don’t make assumptions about the rest of your technology stack, so you can develop new features in React without rewriting existing code.

리액트 개발진은 개발자가 어떤 기술 스택을 사용할지 미리 가정하지 않습니다. 그래서 개발자가 새로운 코드를 다시 작성할 필요 없이 기능을 추가할 수 있습니다.

당시에 앵귤러의 갑작스러운 버전 변경과 논란과 겹쳐서 리액트의 이런 자유도는 많은 프론트엔드 개발자들의 관심을 받게 되었습니다. 반대로 이런 특성 때문에 생기는 문제도 많아지는데요, “리액트"만 알아서는 개발하기가 어렵다는 점입니다. 코드스테이츠 프론트엔드 부트캠프에서도 지금까지 react, react-dom, react-scripts, create-react-app, react-router-dom, storybook, styled-component등 많은 부가 라이브러리를 설치하고 활용법을 교육한 것만 봐도 알 수 있습니다.

이렇게 알아야 하는 점이 많아지다 보니, 리액트 개발진은 이런 문제를 한 번에 해결할 수 있는 create-react-app이라는 툴 체인을 개발하여 초급 리액트 개발자가 쉽게 리액트에 접근할 수 있도록 했습니다. 리액트를 “간단하게" 시작하기 위해 create-react-app에서 사용되는 툴 목록은 어마어마합니다. create-react-app의 큰 부분인 react-scripts에 사용되는 라이브러리 목록만 봐도 알 수 있습니다. (여기서도 웹팩이 사용된다는 점은 재밋는 포인트입니다.)

{
	// ... 
  "dependencies": {
    "@babel/core": "^7.16.0",
    "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
    "@svgr/webpack": "^5.5.0",
    "babel-jest": "^27.4.2",
    "babel-loader": "^8.2.3",
    "babel-plugin-named-asset-import": "^0.3.8",
    "babel-preset-react-app": "^10.0.1",
    "bfj": "^7.0.2",
    "browserslist": "^4.18.1",
    "camelcase": "^6.2.1",
    "case-sensitive-paths-webpack-plugin": "^2.4.0",
    "css-loader": "^6.5.1",
    "css-minimizer-webpack-plugin": "^3.2.0",
    "dotenv": "^10.0.0",
    "dotenv-expand": "^5.1.0",
    "eslint": "^8.3.0",
    "eslint-config-react-app": "^7.0.1",
    "eslint-webpack-plugin": "^3.1.1",
    "file-loader": "^6.2.0",
    "fs-extra": "^10.0.0",
    "html-webpack-plugin": "^5.5.0",
    "identity-obj-proxy": "^3.0.0",
    "jest": "^27.4.3",
    "jest-resolve": "^27.4.2",
    "jest-watch-typeahead": "^1.0.0",
    "mini-css-extract-plugin": "^2.4.5",
    "postcss": "^8.4.4",
    "postcss-flexbugs-fixes": "^5.0.2",
    "postcss-loader": "^6.2.1",
    "postcss-normalize": "^10.0.1",
    "postcss-preset-env": "^7.0.1",
    "prompts": "^2.4.2",
    "react-app-polyfill": "^3.0.0",
    "react-dev-utils": "^12.0.1",
    "react-refresh": "^0.11.0",
    "resolve": "^1.20.0",
    "resolve-url-loader": "^4.0.0",
    "sass-loader": "^12.3.0",
    "semver": "^7.3.5",
    "source-map-loader": "^3.0.0",
    "style-loader": "^3.3.1",
    "tailwindcss": "^3.0.2",
    "terser-webpack-plugin": "^5.2.5",
    "webpack": "^5.64.4",
    "webpack-dev-server": "^4.6.0",
    "webpack-manifest-plugin": "^4.0.2",
    "workbox-webpack-plugin": "^6.4.1"
  },
  "devDependencies": {
    "react": "^18.0.0",
    "react-dom": "^18.0.0"
  },
  "optionalDependencies": {
    "fsevents": "^2.3.2"
  },
  "peerDependencies": {
    "react": ">= 16",
    "typescript": "^3.2.1 || ^4"
  },
  "peerDependenciesMeta": {
    "typescript": {
      "optional": true
    }
  }
}

반대로, 사용자에게 최적의 번들을 제공하기 위한 전문 프론트엔드 개발자들은 이런 create-react-app의 거대한 라이브러리 목록을 줄이고자 직접 웹팩을 설치하여 하나씩 리액트와 그에 필요한 라이브러리 설정을 하기 시작했습니다. 자기에게 필요한 부분만 콕 집어서 개발하고자 했던 것이죠.

리액트는 프론트엔드 라이브러리로서 최소한의 기능을 제공하고자 가볍게 만들어졌지만, 시간이 지나면서 아이러니하게도 개발자의 다양한 니즈를 충족시키기 위해 더 많은 라이브러리를 필수적으로 사용해야만 했고, 개발자가 필요한 이런저런 라이브러리를 골라서 번들링 할 수 있는 웹팩이 필요하게 되었습니다.

리액트 개발에 꼭 필요한 라이브러리

react, react-dom

너무나 당연한 이야기지만, 리액트 컴포넌트와 Hooks, 라이프 사이클에 대한 정보가 모두 들어있는 리액트와 이 리액트 코드를 브라우저에 보여줄 수 있는 react-dom은 꼭 필요합니다.

babel

React를 학습하기 전, JSX부터 배워야 했었습니다. 그런데, 브라우저에서 JavaScript는 읽을 수 있지만 JSX는 읽을 수 없습니다. 그렇다면 지금까지 React를 JSX로 작성해왔는데 어떻게 브라우저에서 내가 만든 React 애플리케이션을 볼 수 있었을까요? create-react-app에 포함되어 있는 babel이 jsx를 js로 변경해주어 번들링을 해줬기 때문입니다. 참고로 babel은 JSX를 JavaScript로 변경하여 entry에서 불러올 수 있게 만들어줬기 때문에 로더의 일종으로 볼 수 있겠습니다.

css-loader

create-react-app으로 만들어진 애플리케이션을 보면 import 'aaa.css' 와 같이 입력해도 CSS가 적용되던 것을 알 수 있습니다. 우리가 배웠던 css-loader가 필요하다는 것을 쉽게 알 수 있습니다.

리액트 개발에 도움이 되는 라이브러리

react-hot-reloader

react-hot-reloader는 webpack-dev-server처럼 저장할 때 마다 변경사항을 개발 환경에 적용해주는 라이브러리입니다. 추가적인 특징이 있다면 react-hot-reloader는 리액트 상태를 유지시켜줍니다.

eslint

eslint는 JavaScript로 개발 시 자주 접하는 에러를 방지하기 위한 린터입니다. eslint 역시 많은 config와 plugin이 있는데, 이를 잘 조합하면 리액트에서 자주 접하는 에러를 미리 발견하는데 도움이 됩니다.

prettier

prettier는 JavaScript로 개발 시 통일성 있게 코드 형식을 맞출 수 있게 도와주는 툴입니다. eslint와 조합해서 통일된 코드 형식까지 강요할 수도 있습니다.

'코드스테이츠' 카테고리의 다른 글

[Deploy] CI/CD  (0) 2022.10.12
Lighthouse  (0) 2022.10.07
간단한 웹앱 번들링 사용  (3) 2022.09.26
웹 표준 & 접근  (0) 2022.09.07
REDUX 데이터 흐름, FLUX 패턴  (2) 2022.09.01

+ Recent posts