⛏️
공부방
  • README.md
  • 프로젝트
    • ft_transcendence
      • 설계
        • 0. 프론트 디자인
        • 1. BackboneJS 뷰 객체
        • 2. API 설계
        • 3. 레일즈 라우팅 구현
        • 4. DB 설계
        • 5. 채널 설계
    • slab-saver
    • react-payment
  • 공부
    • HTML, CSS
      • GRID
      • emmet
      • position
      • CSS Unit
        • 단위 정리
        • 기준을 정해보자
        • em의 정확한 기준은 뭐야?
      • flex
      • NAVBAR 실습
      • 유튜브 화면 만들어보기
    • SQL
      • 이론
        • 1강 데이터베이스
        • 2강 다양한 데이터 베이스
        • 3강 데이터베이스 서버
      • 명령어
        • DB 관리
        • TABLE 관리
        • Constraints
        • SQL 명령어 - 1
        • SQL 명령어 - 2
        • SQL 명령어 - 3
        • SQL 명령어 - 4
        • SQL 명령어 - 5
    • Ruby
      • 루비 객체와 클래스
      • 곡괭이
        • Chapter2. Ruby.new
        • Chapter3. 클래스, 객체, 변수
        • Chapter4. 컨테이너, 블록, 반복자
        • Chapter5. 기능 공유하기
        • Chapter6. 표준 타입
        • Chapter8. 메서드 파헤치기
    • Python
      • 유용한 링크
    • RubyOnRails
      • 아직 정리하지 못한 것들
        • RSPEC 을 이용한 테스트 완전 자동화
        • 레일즈 이니셜라이징 과정
        • 액션케이블 구체적으로 정리하기
        • 웹팩으로 자바스크립트 모듈 관리하기
      • ACTIVE JOB
        • 액티브잡의 기본
        • 실전! 액티브 잡을 이용한 스케쥴링
        • 서버를 껏다 키면 스케쥴링 된 이벤트가 사라진다!
      • ACTION CABLE
        • 액션케이블 Consumer를 이용해서 문제 해결
        • 액션케이블 연결 순서
      • ACTIVE STORAGE
      • 모델
        • validation
          • seeds 데이터 validation 스킵
          • validation 검사가 save, update, create 모든 경우에 일어난다
          • validator 클래스
          • 커스텀Validation
          • validates format(정규표현식)
        • 액티브레코드 find의 다양한 활용
        • 한 레코드에 동시 접속 막자!! with_lock
        • 레일즈 where 사용법
        • 레일즈에서 모델 관련 이슈
        • 모델이름바꿀때명심할것
        • 모델의 includes 메서드
        • 연관 모델을 다른 이름으로 설정하고 가져오기
      • 기본 상식
        • form으로 전달되는 params를 분석해보자
        • StrongParameter 쿼리 배열 받기
        • view helper로 디버깅 하는 방법
        • css 파일을 수정했는데 적용이 안된다?
        • StrongParameter 일반데이터와 객체 데이터 한번에 받기
        • wrap-parameter body가 두 번씩 날라오는 이유
        • 컬렉션 map에서 요소 스킵하는법
        • CASE를 이용해서 정렬(일반적인 정렬 X)
        • 문자열(정규표현식)
        • TIME ZONE 설정하기
        • 커스텀exception
      • RSPEC으로 모델 테스트하기
      • 한 눈에 읽는 루비 온 레일즈
      • Perfect RubyOnRails
        • Chapter1. 소개
        • Chapter2. RubyOnRails 기본
        • Chapter3. 스캐폴딩
        • Chapter7. 라우팅
        • Chapter8. 테스트
    • Javascript
      • var, let, const 차이
      • 브라우저 동작 원리
      • 디바운싱과 쓰로틀링
      • Tagged Template Literal(styled-components)
      • IntersectionObserver 를 사용해서 스크롤 이벤트의 부하 줄여주기
      • EVENT LOOP
        • 자바스크립트에서 어떻게 비동기적인 실행이 가능한걸까?
        • 이벤트 루프의 동작
        • setTimeout이 실행되면 어떤 동작이 일어날까?
        • 블록은 실행이 보장된다
        • 콜스택에 있는 블록이 보장된다는 점을 이용해서 브라우저 죽이기
        • setTimeout 무한반복으로 브라우저는 죽을까?
        • Promise 무한반복으로는 브라우저를 죽일 수 있을까?
        • RAF는 그럼 뭐야?
      • forEach는 반복도중 멈출 방법이 throw 밖에 없다!
      • 임시
        • 정리할 것 목록
          • 자바스크립트 기본 문법
        • 이벤트 임시 정리
      • 유용한 링크
      • arrow function 을 이용한 bind 이슈 해결
      • preventDefault - passive
      • CRITICAL-RENDERING-PATH
      • setInterval에 클로져 개념 사용하기
      • 오디오 문제 이슈
      • 자바스크립트의 식과 문
        • 식과 문이란 무엇인가...
        • 식
          • 1. 기본값과 래퍼객체
          • 2. 참조값과 가비지컬렉팅
        • 식을 조금 더 자세히 알아보자
      • prototype, [[Prototype]] 차이
      • export, import 학습
      • ESlint
      • 아주아주기본
        • Chatper1. 기본
        • Chapter2. 타입
        • Chapter3. 연산자
        • Chapter4. 제어문
        • Chapter5. 배열
        • Chapter6. 함수
        • Chapter7-1. 객체
        • Chapter7-2. 객체
        • Chapter8. 표준객체
        • Chapter9. DOM
      • 이벤트 위임
      • 이벤트가 버블링 되서 root 까지 가다보면... 부모의 부모의 ... 모든 click 이벤트를 발동시키는거 아니야?
      • classList
    • BackboneJS
      • Backbone Model 프로토타입에 메서드 구현하기
      • BackboneJS의 각 요소의 역할과 책임을 확실히 이해하자
      • Window 이벤트를 listenTo로 감시하기
      • 뷰 자신이 자신을 지워야 할 때를 감지하려면 어떻게 해야하는가?
      • 백본 VIEW의 remove와 jquery의 remove 는 다르다!
      • 백본 컬렉션 URL에 쿼리 붙이기
      • index.html.erb와 BackboneJS의 결합
      • 백본 모델과 컬렉션에서 fetch 를 통해 JSON 가져오기!
      • 모델은 urlRoot, 컬렉션은 url
      • ISSUE
      • Absolute Beginner
        • Part1
        • Part2
        • Part3
        • Part4
    • 문제풀이
      • 01. 유효한 팰린드롬(leetcode: 125)
      • 02. 문자열 뒤집기(leetcode: 344)
      • 03. 로그파일 재정렬(leetcode 937)
      • 04. 가장 흔한 단어(leetcode: 819)
      • 05. 그룹 애너그램(leetcode: 49)
      • 06. 가장 긴 팰린드롬 문자열(leetcode: 5)
      • 07. 두 수의 합(leetcode: 1)
      • 08. 빗물 트래핑
      • 09. 세 수의 합(leetcode: 15)
    • BlackCoffeeStudy
      • level1
        • 1주차
    • express
      • Untitled
      • 구글 애널리틱스 연결하기
      • passport를 활용한 로그인
      • express-init 명령어 사용
      • ec2와 DBeaver
      • mariadb 설치
      • sequelize 설치 및 사용법
        • sequelize 설치
        • sequelize-cli 사용법
        • 모델 간 연관관계 맺기
        • Hook 사용하기
      • express-ejs-layout 활용하기
      • Bootstrap
      • npm install로 설치한 모듈 ejs에서 사용하기
      • 미들웨어
    • cypress
      • window.alert 테스트는 어떻게 하지?
      • 상수를 어디에 저장할건가?
      • before()와 beforeEach()
    • aws
      • aws로 프로젝트를 배포해보자!
      • nginx로 리버스프록시 서버를 만들자
      • github actions 로 푸쉬되면 자동으로 업데이트 하는 기능 만들어보기
    • react
      • Drag & Drop 를 이용해서 리스트 요소 순서 바꾸기
      • CRA에서 CRACO 사용하지 않고 절대경로 import(NODE_PATH)
      • useEffect내에서 state의 dependency 문제
      • IntersectionObserverAPI로 무한스크롤 구현
      • react-testing-library
        • 기본
        • react-router-dom 에서의 에러
        • event 발생시키기
        • Integration testing하기
        • async하게 렌더링 되는 요소 잡기
        • Mocking 하기
      • CRA로 만든 앱에서 절대경로로 import 해오기(alias하기)
      • 커스텀 훅 만들기
    • 타입스크립트
      • 조건부타입 (Conditional types)
      • Generics
      • Keyof 타입 오퍼레이터
      • Indexed Access Types
      • 타입 챌린지
        • easy
          • 00. Awaited
          • 01. Concat
          • 02. Exclude
          • 03. First Of Array
          • 04. If
          • 05. Includes
          • 06. Pick
          • 07. Readonly
          • 08. Length
          • 09. Tuple to Object
        • mediun
          • 01. Absolute
    • Firebase
      • 파이어스토어 규칙
    • 기타
      • 협업 프로세스
      • UUID
      • 구글애널리틱스 설치하기
      • 드림코딩 강의
        • 포트폴리오
          • CSS
            • nth-child
            • CSS 팁
          • 자바스크립트
            • 1. 스크롤에 따른 navbar 의 색 변경하기
            • 2. navbar 버튼을 누르면 해당 페이지로 스크롤링 되게 만들자
            • 3. 스크롤 다운 하면 arrow-up 버튼 나오게 하기
            • 4. project 필터링 구현
            • 5. project 필터링에 transition 효과 넣기
      • GIT
        • 기본 사용법 정리
        • git remote update - remote 브랜치 가져오기
  • 기타
    • 이것저것
      • 독서
        • 클린코드
          • Chapter0. 나는 왜 클린코드 책을 읽는가?
          • Chapter1. 클린코드
          • Chapter2. 의미있는 이름
          • Chapter3. 함수
          • Chapter4. 주석
          • Chapter5. 형식 맞추기
      • 용어
      • IDE
        • RubyMine
          • 실전이 중요!
          • 1. Editor Basic
          • 2. Navigation
          • 3. Completion
          • 4. Refactoring
          • 5. Code Assistance
      • MAC에서 살아남기
        • Alfred - Spotlight 업그레이드
        • Vimium
        • BetterTouchTool - 트랙패드
        • 구름 입력기 - ESC, `
        • Spectacle - 화면 분할
    • 원티드 프리온보딩
      • 1주차
        • 월요일
        • 목요일
      • 2주차
      • 3주차
      • 4주차
      • 5주차
      • 6주차
    • 일기장
      • 2020
        • December
          • 20201208(화)
          • 20201209(수)
          • 20201210(목)
          • 20201211(금)
          • 20201214(월)
          • 20201215(화)
          • 20201216(수)
          • 20201217(목)
          • 20201218(금)
          • 20201219(토)
          • 20201221(월)
          • 20201222(화)
          • 20201223(수)
          • 20201224(목)
          • 20201226(토)
          • 20201228(월)
          • 20201229(화)
          • 20201230(수)
          • 20201231(목)
      • 2021
        • January
          • 20210101(금)
          • 20210102(토)
          • 20210105(화)
          • 20210106(수)
          • 20210107(목)
          • 20210108(금)
          • 20210109(토)
          • 20210112(화)
          • 20210113(수)
          • 20210114(목)
          • 20210115(금)
          • 20210117(일)
          • 20210118(월)
          • 20210119(화)
          • 20210120(수)
          • 20210121(목)
          • 20210125(월)
          • 20210126(화)
          • 20210127(수)
          • 20210128(목)
          • 20210129(금)
        • February
          • 20210201(월)
          • 20210202(화)
          • 20210203(수)
          • 20210204(목)
          • 20210205(금)
          • 20210207(일)
          • 20210208(월)
          • 20210209(화)
          • 20210217(수)
          • 20210218(목)
          • 20210219(금)
          • 20210220(토)
          • 20210222(월)
          • 20210223(화)
          • 20210224(수)
          • 20210226(금)
          • 20210228(일)
        • March
          • 20210302(화)
          • 20210303(수)
          • 20210304(목)
          • 20210305(금)
          • 20210306(토)
          • 20210308(월)
          • 20210309(화)
          • 20210310(수)
          • 20210311(목)
          • 20210312(금)
          • 20210313(토)
          • 20210315(월)
          • 20210316(화)
          • 20210317(수)
          • 20210318(목)
          • 20210319(금)
          • 20210322(월)
          • 20210323(화)
          • 20210324(수)
          • 20210325(목)
          • 20210327(토)
          • 20210329(월)
          • 20210330(화)
          • 20210331(수)
        • April
          • 20210406(화)
          • 20210407(수)
          • 20210408(목)
          • 20210409(금)
          • 20210410(토)
          • 20210412(월)
          • 20210413(화)
          • 20210414(수)
          • 20210415(목)
          • 20210416(금)
          • 20210417(토)
          • 20210419(월)
          • 20210420(화)
          • 20210421(수)
          • 20210422(목)
        • July
          • 20210728(수)
Powered by GitBook
On this page
  • 이번주 정리
  • 1번째 과제
  • 1. 입력 form
  • 결과필드s (ResultFileds)
  • 결과필드 (ResulfField)
  • 느낀점
  • 2번째 과제
  • 드래그 앤 드랍
  • UUID
  • 이번주에 배운거

Was this helpful?

  1. 기타
  2. 원티드 프리온보딩

4주차

Previous3주차Next5주차

Last updated 3 years ago

Was this helpful?

이번주 정리

4주차 과제는 솔라커넥트에서 나온 과제였다. 1번째 과제는 정렬 알고리즘을 활용하는 과제였고, 2번째 과제는 어느정도 완성되어 있는 todo-list 에 기능을 추가하는 과제였다.

개인적으로 둘다 재미있었다.

1번째 과제

해당 과제에서는 타이머, 정렬 알고리즘을 제외한 부분을 구현했다. 흠.. 이렇게 보니 과제의 핵심인 시간과 정렬 알고리즘과는 조금 동떨어진 부분을 맡은거같다.

  • 입력 form

  • 유효성 체크

  • 정렬 결과 필드

  • 로딩 스피너

  • 테스트

전체 구조는 아래처럼 되어있다. 구조가 간단해서 아래 코드만 보면 된다.

export default function SolarApp() {
  const [sorted, setSorted] = useState([]);

  const handleSubmit = value => {
    setSorted(quickSort(value));
  };

  return (
    <SolarAppContainer>
      <Timer format={TIME_FORMAT.KO} />
      <Form handleSubmit={handleSubmit} />
      <ResultFields value={sorted} />
      <Timer format={TIME_FORMAT.EN} />
    </SolarAppContainer>
  );

Form 컨테이너는 입력에 대한 책임을 진다.

ResultFields 는 들어온 입력값에 대한 출력을 담당한다. (ResultFields 하위로 ResultField 가 있다. )

1. 입력 form

form 컴포넌트의 역할은 아래와 같다.

  1. 입력을 받을 수 있어야한다.

  2. validation 체크를 할 수 있어야한다.

  3. 에러메시지를 보여줄 수 있어야한다.

  4. submit 이벤트가 발동하면 특정 함수를 실행해야한다.

입력을 받을 수 있어야한다.

입력값은 input 에 들어가는 value 로써 form 에서 state 로 관리하게 구현했다.

validation 체크를 할 수 있어야한다.

validation 체크에 대해서는 생각을 많이했다. 내가 생각하는 유효하지 않은 입력은 아래와 같다.

  1. 숫자가 아닌 문자가 들어오는 경우 (정규표현식으로 가능)

    • '-' 가 맨 앞에 오는 경우는 마이너스를 의미하므로 괜찮다.

  2. 굉장히 큰 숫자 (또는 굉장히 작은 숫자)

    • Number.MAX_SAFE_INTEGER

  3. , 가 연속해서 나오는 경우 (정규표현식으로 가능)

    • 1, 2, 3, ,,,, 4, 5, 6,

  4. 마지막이 , 로 끝나는 경우 (정규표현식으로 가능)

여기서 1, 3, 4번 같은 경우는 졍규표현식을 사용해서 충분히 해결할 수 있다. 아래의 expression 을 사용하면된다. /(^(\s*-?\d+,)*(\s*-?\d+$))/ . 문제는 2번의 굉장히 큰 숫자다. Number.MAX_SAFE_INTEGER 의 값은 9007199254740991 다. 숫자의 길이를 체크하는거면 상관없지만, 그 범위를 체크하려고 하니 너무 막막해서 포기해버렸다. 따라서 정규표현식을 사용하는게 아니라 입력받은 문자열을 split, map, filter 를 통해 체크하는 방법으로 해결했다. 나중에 정규표현식으로 해결해보고싶다.

그리고 validation 을 언제할건가? 이건 두가지 선택지가 있다.

  1. 매번 글자가 들어올 때 마다 validation 검사를 한다.

  2. 모든 글자가 들어오고 submit 을 하면 검사를한다. (선택)

1번이 가장 좋겠지만, 문제는 매번 글자가 들어올 때 마다 검사를 하면 입력이 굉장히 길어지는 경우에 성능상에 문제가 생긴다.(다시 생각해보니 debounce 를 사용하면 됐을거같다...) 특히 지금은 유효성체크가 split -> filter -> map -> filter 를 하다보니 더더욱 심하다. 아마 성능좋게 정규표현식으로 구현했으면 어느정도 타협이 가능했겠지만, 그러기에는 시간이 부족했다.

결국 2번째 방법을 선택했다.

에러메시지를 보여줄 수 있어야한다.

에레메시지를 보여주는 방법도 고민을 많이했다. 보여주는 방법에 대한 선택지는 아래와 같다.

  1. input 의 커스텀에러메시지

  2. alert 창을 통해 에러메시지 보여주기

  3. modal 을 구현해서 에레메시지 보여주기

  4. input 창의 아래에 error message 를 보여주기

1번의 경우는 입력할 때 마다 검사를 해야하므로 기각 2번과 3번은 이런 경우에는 사용자 경험이 좋지 않아 기각! 최종적으로 4번을 선택했다.

4번의 경우 에러메시지가 계속 남아있으면 보기 좋지 않다. 따라서 일정 시간 이후에 자동으로 없어지게 구현했다. setTimeout 을 사용했다. setTimeout 을 사용하면 항상 문제가 이전에 실행된 setTimeout 이 남아있을 수 있다는 것이다. 따라서 useEffect 에서 clear하게 구현해줬다.

useEffect(() => {
  if (!errorMessage) return;
  const timer = setTimeout(() => {
    setErrorMessage('');
  }, TIMER.LOADING);
  return () => {
    clearTimeout(timer);
  };
}, [errorMessage]);

아래처럼 일정 시간 이후 에러메시지가 사라지게 된다.

결과필드s (ResultFileds)

결과필드의 역할은 아래와 같다.

  1. 정렬되서 들어온 값을 하위 컴포넌트인 ResultField 에 넘겨준다.

  2. 역순으로 정렬된 값을 3초뒤에 두번째 ResultField 에 넘겨준다.

역할이 아주 단순하다. 그냥 값을 넘겨주기만 하면 된다. 물론 여기서 함정이 2번인 3초뒤에 건네준다. 3초뒤를 구현하기 위해서 useEffect 를 사용해줬다. Form 때와 마찬가지로 timer 가 남아있는 상황에서 또 실행하게 된다면 clear 하게 만들었다.

useEffect(() => {
  if (!value.length) return;
  setIsLoading(true);

  const timer = setTimeout(() => {
    setReversedValue([...value].reverse());
    setIsLoading(false);
  }, TIMER.POPUP);

  return () => {
    clearTimeout(timer);
  };
}, [value]);

결과필드 (ResulfField)

역할은 인자로 들어온 값을 출력해주면 된다. 만약 로딩중이라면 로딩 컴포넌트를 보여준다.

느낀점

과제는 너무 단순했다. 하지만, 설계하는 과정에서 어떤 형태로 만드는게 가장 좋은 방법인지에 대해 많은 고민을 했다. App 컴포넌트에서 모든 로직을 처리하고 하위 컴포넌트는 단순히 출력값만 보여주게 만들어야 할까? 또는 각 컴포넌트마다 역할과 책임을 부여해서 스스로 state 를 관리하게 만들어야할까?

개인적으로 이번 프로젝트는 뎁스가 적기 때문에 첫번째 방법인 App 컴포넌트에서 모든 로직처리를 담당하고, 하위 컴포넌트에서는 출력만하면 된다고 생각한다.

  1. form 은 정말 입력만 받고 submit 이 발생하면 값을 solarApp 에 보낸다.

  2. solarApp 은 유효성체크를 하고 통과하면 정렬을 한다. (모든 로직을 여기서 처리)

  3. 정렬된 값을 결과 필드에 보내준다.

  4. 3초 뒤에 두번째 결과필드에 값을 보내준다.

평소라면 이렇게 했겠지만, 이번에는 각 컴포넌트마다 역할을 갖게 만들었다. 이렇게 만들어서 엄청 두꺼워 지는 컴포넌트 없이 각 컴포넌트가 고루 어느정도의 규모를 갖게 됐다. 아직 경험이 일천해서 어떤게 좋은지 아직도 모르겠다.

2번째 과제

2번 과제는 todo list 를 만드는 과제다. 자바스크립트 공부할 때 구현했던 경험이 있어서 재밌게 진행했다. 솔직히 말하면 css 는 흠.. 이쁘게 만들지 못했다. 그래도 내가 중요하게 생각하는 부분에 대해서는 어느정도 구현했다. 내가 중요하게 생각하는건 당연하다고 생각되는 건 당연히 있어야한다. 다. todo list 에 당연히 있어야하는게 뭘까?

  1. 입력을 할 수 있어야한다.

  2. 수정할 수 있어야한다.

  3. 각 todo 의 순서를 바꿀 수 있어야한다. (드래그 앤 드랍)

이번 과제에서 조금 걸리는게 있는데, 완료 목표일만 만든게 아니라 시작일까지 같이 만든 점이다. 이렇게 만든 이유는 todo 는 오늘 할 일 뿐만 아니라 내일 할일, 모래에 할 일 등 나중에 할 todo 도 만드므로 시작일도 중요하다고 생각했다. 따라서 시작일을 만들게 되었고, RangePicker 를 사용하면서 moment 를 설치하게 되었다. (과제에서는 아무것도 설치하지 말라고 했다.) 그리고 코드 구현도 조금은 엉성한거 같다. 하하하하하...

드래그 앤 드랍

만족하는 점은 드래그 앤 드랍 을 구현했다는거다. 이전부터 한번 구현해보고 싶다라는 생각을 가지고 있었는데, 과제 마무리 하려고 할 때 딱 생각나서 아슬아슬하게 구현했다. 아래 링크에 정리해놨다.

커스텀훅의 형태로 구현했다. 나는 코드를 분리하는걸 좋아한다. 따라서 커스텀훅은 나에게 아주 좋은 도구다. useDragAndDrop 을 커스텀훅으로 만듦으로써 다른 프로젝트를 할 때 조금의 수정만을 통해서 DnD 기능을 사용할 수 있게 되었다.

여기서 궁금하게 있다. 얼마전 유튜브 영상에서 어떤 개발자의 이런 말을 들었다.

나는 예전에 모든 로직을 커스텀훅을 만듦으로써 분리했다. 하지만 요즘 생각은 커스텀훅으로 로직을 분리시키면 코드의 응집성이 나빠지므로 옛날과 다르게 그렇게 만들지 않는다.

그러면 나도 재사용성을 고려하지 않는다면, 커스텀훅으로 로직을 분리하면 안되는건가? 나는 그래도 커스텀훅을 만드는게 좋아보인다. 뭐 경험이 쌓이다 보면 생각이 달라질 수 있겠지

UUID

이번 과제할 때 유일성을 보장해줄 무언가가 필요했다. 왜냐하면 todo 의 id 값을 줄 때 배열의 길이를 기반으로 주는게 문제가 있었기 때문이다. 처음에는 시간을 기반으로 id 를 만드려고 했다. 하지만 엄청 빠른 시간내에 todo 를 만들면 문제가 생길 수도 있겠다라는 생각이 들어서 현재시간 + 랜덤값으로 최종 결정을 했는데... 갑자기 떠오른게 UUID 였다. 솔직히 UUID 가 뭔지 잘 몰랐지만 이게 무적에 가까운 랜덤값을 생성해 줄 수 있다는 사실은 알고 있었다. 따라서 이참에 과제에도 적용하고 새로운 지식도 쌓을겸 정리하고 구현해봤다.

정리는 아래 링크에서 볼 수 있다.

이번주에 배운거

정규표현식을 어느정도 할 수 있게 되었다.

var, let, const 의 차이점에 대해 알게 되었다.

드래그 앤 드랍 을 정리하고 구현했다.

UUID 에 대해 정리했다.

아 그리고 2번째 과제는 타입스크립트로 구현했다. 솔직히 말하면 다른 기능구현에 급급해서 타입스크립트를 타입스크립트 답게 사용하지 못했다! 반성한다.

타입스크립트 처음 사용할 때 이런걸 왜 쓰지 싶었다. 무엇을 하든간에 타입을 지정해주는게 정말 어렵고 귀찮았다.하지만 생각해보면 이렇게 타입을 지정해줌으로 인해서 굉장히 많은 효용을 느낄 수 있다. 이 효용이라는게 팀프로젝트를 할 때만 얻을 수 있는게 아니라 개인프로젝트를 할 때에도 얻을 수 있다. 간단한 예로 vscode 로 프로젝트를 진행할 때 타입스크립트를 사용하면 (원래 자바스크립트로 할 때는 뜨지 않는) 자동 완성이 뜨게 된다. 앞으로의 과제에서 열심히 사용해야겠다.

var, let, const 차이
Drag & Drop 를 이용해서 리스트 요소 순서 바꾸기
UUID
깃허브 레파지토리 보러가기
배포 사이트 보러가기
깃허브 레파지토리 보러가기
배포 사이트 보러가기
Drag & Drop 를 이용해서 리스트 요소 순서 바꾸기
UUID
에러메시지