Skip to content

umcondo/mangwon_running_mate

Repository files navigation

망원 런닝 메이트


프로젝트 소개

  • Vanilla JavaScript를 이용해 마포구의 러닝코스를 추천하는 사이트를 만들어 보았습니다.
  • Live Demo에서 전체적인 작동을 확인할 수 있습니다.
  • 리액트 변환은 리액트에서 진행중입니다.
  • 이 프로젝트는 마포구 청년 일자리 사업단의 지원으로 제작되었습니다.

mobile Demo


개발기간 : 2022.04.11 ~ 2022.05.25 개발인원 : 1인

  • 기획/디자인 : umcondo
  • 개발 : umcondo

개발환경 및 사용툴

  • HTML, CSS, Vanilla JS
  • Visual Studio code
  • Git, Github
  • Netlify
  • Kakao map API, Kakao SDK
  • webpack 5

주요 기능

  • 3가지 선택지를 사용자에게 주고 니즈에 맞는 러닝코스 추천
    - 답변을 List에 저장
    - List 요소들에 따른 결과 데이터 제공
    
  • 카카오지도를 활용한 러닝코스 데이터 제공
    - 카카오 API 활용
    - 현 위치버튼
    - 거점 오버레이
    - 오버레이 숨기기 버튼
    - 출발, 시작 마커 생성
    
  • 러닝코스에 대한 요약 제공
    - 경로, 코스길이, 소요시간, 유의사항, 코스설명
    
  • 추천 결과 공유
    - 링크 복사
    - 카카오톡 공유
    

진행과정

  • 1차(~2022/4/24)
    - 기획, 와이어프레임
    - 기초적인 웹사이트 구현
    
  • 2차(~2022/5/11)
    - 스토리보드 수정
    - 반응형 웹 구현
    - js로직 함수화
    - css클래스, 주석등 전체적 리팩토링
    - 웹사이트 최적화
    
  • 3차(~2022/5/22)
    - 레이아웃 수정
    - 각종 버그, 오류 수정
    - 리액트 변환(최적화 미구현)
    
  • 발표(2022/5/25)
    - 발표자료 준비 및 프로젝트 진행과정 정리
    
    https://umcondo.github.io/ 개인블로그에 정리해 놓았습니다.

알게된 점

  • source code style

    - 주석
      - 함수, 페이지별 설명, 한줄 주석, 여러줄 주석의 분리
    - css
      - class naming, file 배치
    - js
      - 변수 naming, 통일성
      - 가독성
    
  • git

    - git은 버전관리 프로그램이므로 한 커밋당 하나의 기능 구현을 해야함
    - 이전 커밋 합치기
      - rebase -i, squash
    - 커밋 되돌리기
      - 이전 커밋들 지워짐 reset --soft, --mixed, --hard
      - 이전 커밋들 놔두고 새로 커밋 생성 revert
    - 뭔가 빠뜨리고 커밋했을때
      - --amend
    - 커밋을 덮어쓰고 싶을때
      - push -f
    
  • css

    - 반응형
      - media 쿼리, flex
    - 브라우저마다 다른 렌더링 방식에 대한 경험
      - 폰트마다 다른 렌더링
    - 애니메이션
      - keyframe을 이용해 각 부분별 크기, 위치 조정
    
  • JS

    - 로직 함수화
    - DOM API
      - DOM 조작
        - appendChild(노드객체) -> append(노드객체 or 텍스트), prepend
        - innerText(css에 종속적이므로 느림) -> textContent
        - innerHTML로 노드들을 일일이 추가하면 그때마다 렌더링을 다시해야한다.
        - createElement로 요소들을 넣어 노드를 새로 만들어 추가하는 것은 렌더링을 한번만 하면 되므로 더 좋다.
    - event
      - event
        - 브라우저 화면내에서 일어나는 사건
      - eventhandler
        - event 발생 시 실행되는 코드
      - eventbubbling
        - event 발생 시 브라우저가 해당요소뿐만 아니라 부모요소를 거쳐 최상위 요소까지 eventhandler가 있는지 확인하는 것
      - eventbubbling을 중단하는 법
        - e.stopPropagation()를 부모요소에 추가한다.
    - 배열, 객체
      - json형태로의 데이터 객체 화
    
  • React

    - 컴포넌트 단위로 UI제작 편함(재사용성, 수정편함)
    - 가상돔 사용으로 브라우저 리소스를 덜 사용 -> 렌더링 최적화
    - JSX를 사용해서 dom조작, html, js를 같이 쓰기 더 편함
    - SPA에 적합하고 CSR을 사용한다. 서버 부하를 줄이고 서버와의 할일을 분리하여 더 효율적인 앱관리 가능
    
  • 브라우저

    - 렌더링 과정
      - html 로드 -> html파싱, css 로드, css 파싱 -> dom 트리, cssom 트리 형성 -> 렌더 트리형성 -> 렌더링
    - 최적화
      - dom 조작, 파일용량줄이기, 파일 link 순서
      - 파싱과정을 최적화하기위해 html, css, js파일의 분리, inline 형식 최대한 배제
    - 호환성
      - 사파리, 크롬, 파이어폭스, 오페라, 모바일 버전, IE는 제외
    

이슈

1) 해결

** 의도하지 않았으나 생긴 것 **

- 이슈 : 사파리에서 애니메이션 결과페이지가 setTimeout 시간이 끝나기 전에 생김
- 진단 : 화면이 로딩되는 동안 애니메이션을 보여주려고 로직을 짰는데, 사파리 브라우저에서 오류 발생
- 해결 : 애니메이션 페이지 보여주고 2초 후 결과페이지를 display:block 하는 방식으로 변경
- 이슈 : 반응형 크기 줄이면 상단의 요소들이 잘리는 현상
- 진단 : 부모요소의 flex, justify-content: center로 인한 오류
- 해결 : 부모요소의 justify-content를 기본(flex-start)으로 주고 justify-content를 기본(flex-start)으로 주고,
하위 요소(item)에 flex-grow: 1로 함
- 이슈 : 웹폰트, 이미지가 늦게 로딩되는 현상
- 진단 : 렌더링 완료보다 이미지 다운로드가 느림
- 해결 : html link태그로 preload를 사용
- 이슈 : 가독성을 위해 css 파일을 분리했으나 렌더링이 늦어짐
- 해결1 : import 방식으로 css 파일 병합
- 진단 : 병렬적 css다운로드가 안되어 렌더링이 늦어짐
- 해결2 : 병렬적 css 로딩을 위해 html link 태그 방식 사용
- 이슈 : 전체 화면의 height를 100vh로 했을때 모바일 하단에 여백이 생김
- 진단 : 모바일은 기본 푸터를 가짐
- 해결 : height를 100%로 바꿔서 해결
- 이슈 : 높이가 작은 핸드폰에서 결과페이지가 잘림
- 진단 : 기본적인 핸드폰 주소창 등으로 인해 결과내용이 가려져서 안보임
- 해결 : 미디어쿼리로 height:700px 이하일때 height를 130%로 설정
- 이슈 : 마포sns로고 사이의 공백
- 진단 : 인라인 요소 사이 공백, 즉 태그 사이 줄바꿈으로 인한 공백을 브라우저가 읽어버려서 나타나는 현상
- 해결 : 부모요소 flex, gap으로 해결,
- 이슈 : css hover가 핸드폰에서 두번 클릭되는 등의 오류 발생
- 진단 : 핸드폰은 터치방식이라 마우스의 hover를 지원하지 않음
- 해결 : media쿼리의 hover,pointer를 활용하여 핸드폰에서는 hover를 실행되지 않도록 함

** 의도했으나 의도대로 되지 않은 것 **

- 이슈 : 공유하기 링크복사 후 URL에 붙여놓고 이동 시,  결과페이지가 아닌 시작페이지를 보여줌
- 진단 : html를 하나로 개발하여 결과페이지가 따로 나누어 지지 않음
- 해결 : react에서 router를 이용해 결과페이지 url을 domain/result로 설정
- 이슈 : 원격저장소의 이전 commit을 정리하기 위해 rebase 사용했으나 commit이 정리되지 않고 새로 생겨버림.
- 진단 : rebase에 대한 이해부족
- 해결 : reset –hard로 오류로 새로 생긴 commit들을 삭제, rebase -i HEAD~n, squash를 이용해
	예전 commit들을 합치고, push -f 을 이용  원격 저장소 commit을 정리

미해결 오류

- 이슈 : 파이어폭스 폰트 깨짐
- 진단 : 브라우저 호환성
- 이슈 : 버튼에 글자 입력시 상, 하단 여백간격이 균일하지 못함
- 진단 : 폰트 자체적으로 상, 하단 여백을 가짐
- 해결 : 버튼 상, 하단 패딩을 다르게 함
- 문제 : 크롬 데스크톱 브라우저에선 해결되었으나 다른 브라우저나 모바일에선 해결되지 않음
- 이슈 : 공유하기, 링크복사 로직에 대한 정확한 이해 부족
- 진단 : execCommand API, kakao 공유하기 SDK
- 이슈 : 카카오맵으로 현재 위치 받아오는 기능이 실시간으로는 지원되지 않음
- 진단 : 웹의 한계인지 추가적인 학습필요, 리액트를 이용한 네이버지도 및 어플에선 실시간 위치가 구현되어 있음
- 이슈 : 카카오맵에서 맵 확대 후 거점 숨기기를 하면 맵을 축소 했을때 다른 거점들이 숨겨지지 않음
- 진단 : 로직의 한계

느낀점

  • 아쉬운점이 많지만 점진적인 목표를 통해 조금씩 조금씩 스스로 생각하는 것을 구현해나가면서 보완해나가는 것이 재밌었습니다.
  • 제가 이 앱을 쓴다고 생각하고 접근하니 최적화에 대한 생각들도 자연스럽게 할 수 있었습니다.
  • 오류들을 해결하기 위해 미디어쿼리, dom조작, 브라우저 렌더링 방식등 더 깊숙하게 알아보면서 이론을 실제 기술로 적용해 나가는 것이 재밌었습니다.

아쉬운점

  • 2차때 보완할 점, 리액트로의 전환 등 생각했던 것들을 모두 완성할 수 없었던 것이 아쉽습니다.
  • 온전히 과업에 집중하지 못했던 것은 둘째치고, 우선순위를 정하지 못하고 세부 계획을 세우지 못했습니다.
  • 제대로 알지못하고 구현만을 위해 쓰인 코드들이 있습니다.
  • css, js 문법과 원리, 브라우저 동작원리에 대해 더 공부해야한다는 것을 느꼈습니다.
  • 리액트로의 변환은 어떻게 했으나 어떤 점에서 최적화가 되었고, 얼마나 성능이 좋아졌는지, 어떻게 최적화해 나가야할지 스스로에 대한 질문에 답할 수 없었습니다

개선점

  • 과업은 끝이 났지만 앞으로 공부하면서 서비스를 보완하고 싶습니다.
  • 컨텐츠
  - 카카오맵에서 거점 클릭시 카카오지도로 이동과 결과코스와 관련된 사진
  - 결과코스와 관련된 사진
  - 실시간 현위치 버튼 구현
  - 다른 SNS(facebook, twitter 등) 공유하기 추가
  - 식수대, 화장실, 편의점, 샤워장 등 편의시설 정보 추가
  - 마포 API 활용
  • 학습
  - 브라우저 동작원리
  - 렌더링 원리, 브라우저 호환성
  - JS 및 DOM 조작
  - Git
  - React

8월 개선점

  • 성능 최적화
  - webpack 5 추가, html,js,css file minimize, js,css file 난독화
  • 크로스 브라우징
  - webpack 이용 babel 추가
  • 버그 수정
- 이슈 : 결과페이지 스크롤 이용 시, 카카오맵이 확대되거나 축소됨
- 진단 : 카카오맵 스크롤, 드래그 옵션 true
- 해결 : map.setDraggable(false); map.setZoomable(false); 옵션 추가
- 이슈 : 결과 애니메이션 로딩 시 제목이 세로로 보인 후 위치가 재조정됨
- 진단 : position: absolute로 속성으로 인해, 이미지가 로딩되기 전에 잘못된 위치에 렌더링됨
- 해결 : position: relative로 변경 후 bottom 속성 변경
- 이슈 : 버튼에 글자 입력시 상, 하단 여백간격이 균일하지 못함
- 진단 : 폰트 자체적으로 상, 하단 여백을 가짐
- 해결 : line-height:0 으로 하여 폰트 여백을 없애고 버튼 자체의 패딩을 추가함
- 이슈 : 해결이 안됨, 맥북 크롬에선 잘 나오고 맥북 사파리에서는 잘 안나옴, 데스크탑 윈도우 크롬에선 잘 안나옴. 폰트 자체적 문제로 보임
  • 이미지 lazy loading을 적용했는데, 로딩이 늦게되어서 UX를 헤친다고 판단하여 안쓰는 것으로 했습니다.
  • 이미지 파일 용량도 크지 않아 lazy loading효과도 미미하므로 UX를 더 우선시 해야겠다고 생각했습니다.
  • 웹팩을 설정하면서 좋은 기능들(압축, 난독화, 모듈 번들링, 바벨설정)을 편리하게 쓸 수 있는 것을 알게 되었습니다.
  • 추후 코드 스플리팅, 이미지 용량 감소 등 웹팩플러그인을 공부하여 사이트를 더 최적화하려 합니다.

9월 개선점

- 이슈 : 버튼에 글자 입력시 상, 하단 여백간격이 균일하지 못함
- 진단 : 폰트 자체적으로 상, 하단 여백을 가짐
- 해결 : 애플 산돌 고딕에서 Pretendard로 폰트 변경. 상, 하단 여백이 거의 비슷한 폰트로 설정함. <(less-than sign)도 상 하단 여백이 비슷한 emoji로 변경

About

마포와 관련된 싱글페이지 웹사이트 만들기

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published