본문 바로가기
나/끄적

200314

by ehei 2020. 3. 15.

프로그래머스에서 적당한 챌린지가 나와 도전해보았다. 이번에는 웹프론트엔드이다.

https://programmers.co.kr/competitions/131/2020-web-fe-first

 

순수 자바스크립트로 한다고 해서 Learning JavaScript를 조금 읽었다. 물론 다 보지는 못했다. 어쨌든 이전에 웹 개발 경험이 있던 분이 언급했던 여러 용어가 그제서야 이해가 되었다. package.json, ES6, Babel 등등.

 

그리고 어제는 시험 날짜였다. 배우자의 도움으로 토요일 4시간을 할당받았다. readme.md를 읽은 첫 느낌은 당혹이었다. 이걸 할 수 있을까... 약간의 장애 후에 코드를 볼 수 있었다. 이번에는 가상 머신처럼 웹에서 Visual Studio Code를 실행하고 터미널을 띄워 빌드도 한다... 조금 불편하지만 무리없이 진행할 수 있었다. 아쉬운 점이라면 코드를 내 저장소에 올리기 불가능하다는 것 정도? 일일이 복사해와야 하는데 욕심을 내고 시간에 쫓겨 놓치고 말았다. 그나마 readme.md는 클라우드 문서에 복사해놓아서 남았다.

 

과제를 완료한 느낌을 적자면, 일단 순수 자바스크립트라는 말에 너무 현혹된 것 같다. 이건 내가 웹프론트엔드 경험이 없어서일 것이다. node.js로 웹사이트 구현하는 쪽으로 공부를 했으면 좀더 나았을지도 모르겠다. 그리고 생각보다 구현 - 테스트를 반복하는 과정에 시간을 많이 뺏겼다. 아쉬운 점이다. 이것도 뭐 아는 것이 부족해서 비롯된 일이다. 그래도 대충 완성은 했다. 완료했다는 건 여전히 기쁜 일이다. 허나 다음에는 좀더 준비를 잘 하고 도전해야겠다.

 

접은 글은 readme.md. 밑줄 친 부분은 처리한 부분이다. 코드가 없어 정말 아쉽다.

 

더보기

과제 설명

  • thecatapi 에서 크롤링한 데이터를 이용해 이미지를 검색하는 베이스 코드가 주어집니다.

  • 베이스 코드는 모두 ES6 클래스 기반으로 작성되어 있으며, 이 코드에는 여러 개의 버그가 존재합니다. 요구사항을 잘 읽고, 버그를 하나씩 해결해주세요.

수행 기술

  • JavaScript(ES6)

요구사항

중요 말머리로 ‘필수’ 가 붙은 요구사항은 반드시 수행해주세요.

HTML, CSS 관련

  • 현재 HTML 코드가 전체적으로 <div> 로만 이루어져 있습니다. 이 마크업을 시맨틱한 방법으로 변경해야 합니다.

  • 유저가 사용하는 디바이스의 가로 길이에 따라 검색결과의 row 당 column 갯수를 적절히 변경해주어야 합니다.

    • 992px 이하: 3개

    • 768px 이하: 2개

    • 576px 이하: 1개

  • 다크 모드(Dark mode)를 지원하도록 CSS를 수정해야 합니다.

    • CSS 파일 내의 다크 모드 관련 주석을 제거한 뒤 구현합니다.

    • 모든 글자 색상은 #FFFFFF , 배경 색상은 #000000 로 한정합니다.

    • 기본적으로는 OS의 다크모드의 활성화 여부를 기반으로 동작하게 하되, 유저가 테마를 토글링 할 수 있도록 좌측 상단에 해당 기능을 토글하는 체크박스를 만듭니다.

이미지 상세 보기 모달 관련

  • 디바이스 가로 길이가 768px 이하인 경우, 모달의 가로 길이를 디바이스 가로 길이만큼 늘려야 합니다.

  • 필수 이미지를 검색한 후 결과로 주어진 이미지를 클릭하면 모달이 뜨는데, 모달 영역 밖을 누르거나 / 키보드의 ESC 키를 누르거나 / 모달 우측의 닫기(x) 버튼을 누르면 닫히도록 수정해야 합니다.

  • 모달에서 고양이의 성격, 태생 정보를 렌더링합니다. 해당 정보는 /cats/:id 를 통해 불러와야 합니다.

검색 페이지 관련

  • 페이지 진입 시 포커스가 input 에 가도록 처리하고, 키워드를 입력한 상태에서 input 을 클릭할 시에는 기존에 입력되어 있던 키워드가 삭제되도록 만들어야 합니다.

  • 필수 데이터를 불러오는 중일 때, 현재 데이터를 불러오는 중임을 유저에게 알리는 UI를 추가해야 합니다.

  • 필수 검색 결과가 없는 경우, 유저가 불편함을 느끼지 않도록 UI적인 적절한 처리가 필요합니다.

  • 최근 검색한 키워드를 SearchInput 아래에 표시되도록 만들고, 해당 영역에 표시된 특정 키워드를 누르면 그 키워드로 검색이 일어나도록 만듭니다. 단, 가장 최근에 검색한 5개의 키워드만 노출되도록 합니다.
  • 페이지를 새로고침해도 마지막 검색 결과 화면이 유지되도록 처리합니다.

  • 필수 SearchInput 옆에 버튼을 하나 배치하고, 이 버튼을 클릭할 시 /api/cats/random50 을 호출하여 화면에 뿌리는 기능을 추가합니다. 버튼의 이름은 마음대로 정합니다.

  • lazy load 개념을 이용하여, 이미지가 화면에 보여야 할 시점에 load 되도록 처리해야 합니다.

스크롤 페이징 구현

  • 검색 결과 화면에서 유저가 브라우저 스크롤 바를 끝까지 이동시켰을 경우, 그 다음 페이지를 로딩하도록 만들어야 합니다.

코드 구조 관련

  • ES6 module 형태로 코드를 변경합니다.

    • webpack , parcel 과 같은 번들러를 사용하지 말아주세요.

    • 해당 코드 실행을 위해서는 http-server 모듈을(로컬 서버를 띄우는 다른 모듈도 사용 가능) 통해 index.html 을 띄워야 합니다.

  • API fetch 코드를 async , await 문을 이용하여 수정해주세요. 해당 코드들은 에러가 났을 경우를 대비해서 적절히 처리가 되어있어야 합니다.

  • 필수 API 의 status code 에 따라 에러 메시지를 분리하여 작성해야 합니다. 아래는 예시입니다.

 const request = async (url: string) => {

    try {

      const result = await fetch(url);

      return result.json();

    } catch (e) {

      console.warn(e);

    }

  }

 

  const api = {

    fetchGif: keyword => {

      return request(`${API_ENDPOINT}/api/gif/search?q=${keyword}`);

    },

    fetchGifAll: () => {

      return request(`${API_ENDPOINT}/api/gif/all`);

    }

  };

 

  • SearchResult 에 각 아이템을 클릭하는 이벤트를 Event Delegation 기법을 이용해 수정해주세요.

  • 컴포넌트 내부의 함수들이나 Util 함수들을 작게 잘 나누어주세요.

테스트 관련(가산점 요소)

  • Test suite와 각 test 의 목적을 이해하기 쉽게 기술해주세요. 예를 들어,

isNumber test (x)

isNumber 함수는 number type 의 argument 를 받으면 True 를 리턴합니다. (o)

 

  • 각 컴포넌트 내부에 있는 함수들이나, Util 함수들을 테스트 할 수 있게 분리합니다.

  • 조건문이 있는 함수의 경우, edge case에 대한 테스트를 준비합니다.

테스트 코드 내에서 각 테스트마다 반복적으로 필요한 부분을 life cycle 함수를 이용해 관리하도록 합니다.

' > 끄적' 카테고리의 다른 글

200401  (0) 2020.04.01
200330  (1) 2020.03.30
회사를 추억하며 #1  (0) 2020.03.03
200224  (0) 2020.02.24
200219  (0) 2020.02.19