Skip to content

Latest commit

 

History

History
184 lines (124 loc) · 8.79 KB

README.md

File metadata and controls

184 lines (124 loc) · 8.79 KB

unsplash-clone-app

사진 공유사이트 Unsplash("https://unsplash.com/")의 Open API를 사용하여 클론한 웹 사이트 입니다.

시간당 api 요청 횟수의 제한이 있어서 사이트 접속시 원활하지 않을 수 있습니다.

1. 사용한 기술

    "react": "^17.0.1",
    "react-scripts": "^4.0.0",
    "react-dom": "^17.0.1",
    "react-router-dom": "^5.2.0",
    "use-react-router": "^1.0.7",
    "history": "4.10.1",
    "redux": "^4.0.5",
    "react-redux": "^7.2.2",
    "redux-devtools-extension": "^2.13.8",
    "reduxsauce": "^1.2.0",
    "redux-saga": "^1.1.3",
    "axios": "^0.21.0",
    "immer": "^9.0.1",
    "lodash": "^4.17.20",
    "prop-types": "^15.7.2",
    "qs": "^6.9.4",
    "react-loading-skeleton": "^2.2.0",
    "classnames": "^2.2.6",
    "styled-components": "^5.2.1",
    "styled-media-query": "^2.1.2"

2. 대표기능

  • 토픽 추천
  • 사진 검색
  • 컬렉션 검색
  • 사진 상세페이지
  • 웹사이트 반응형

3. 상세기능


3.1. 토픽 추천


🔗 코드 바로가기

  • 추천하는 토픽 주제를 노출합니다.
  • 스크롤 메뉴를 구현하여 주제의 갯수 상관없이 볼 수 있습니다.


🔗 코드 바로가기

  • 토픽 페이지는 토픽에 대한 설명 및 api 상태, 큐레이터, 해당 토픽의 갯수를 나타내고 있습니다.
  • 사진 컨텐츠는 masonry grid를 구현하여 나타내었습니다.

3.2. 사진 검색


🔗 코드 바로가기

  • 검색 페이지 역시 masonry grid를 구현하여 사진 컨텐츠를 노출합니다.
  • infinite scroll을 구현하여 특정 스크롤에 닿게 되면 다음 페이지에 대한 컨텐츠를 불러옵니다.
  • infinite scroll은 현재 시간당 api 요청 수 제한으로 인하여 부득이하게 3페이지까지만 불러올 수 있도록 설정하였습니다.
  • 컨텐츠의 데이터에서 사전에 정의되어있는 너비와 높이를 이용하여 로딩중일때 미리 박스를 만들어주었고 컨텐츠의 테마 컬러로 배경을 주어 스크롤 하는 도중 빈 화면이 노출되지 않도록 구현하였습니다.
  • 또한 컨텐츠 이미지에 lazy loading을 구현하여 한번에 이미지를 불러오지 않고 해당 영역이 노출되기 직전 이미지를 불러오도록 하였습니다.


🔗 코드 바로가기

  • 검색시 연관된 키워드를 노출하였습니다.
  • 스크롤 메뉴를 공통으로 사용하여 재사용성을 높였습니다.


🔗 코드 바로가기

  • 사용자가 원하는 조건에 따라 검색 결과를 보여줄 수 있도록 control 메뉴를 구현하였습니다.
  • 검색어가 변해도 기존 조건을 그대로 사용할 수 있도록 하였습니다.


🔗 코드 바로가기

  • 데이터가 로딩중일때 빈화면이 보이지 않도록 skeleton grid를 구현하였습니다.


🔗 코드 바로가기

  • 검색결과가 없는 경우에는 empty component를 구현하여 보여주었습니다.

3.3. 컬렉션 검색


🔗 코드 바로가기

  • 컬렉션 페이지는 해당 키워드의 컬렉션을 노출합니다.
  • 마찬가지로 infinite scroll을 재사용하여 다음 컨텐츠를 불러옵니다.
  • 컬렉션에 등록된 컨텐츠가 1개만 있는 경우 비어있는 이미지를 회색 배경으로 보이도록 하였습니다.
  • 또한 태그는 3개만 보여지도록 구성 하였습니다.


🔗 코드 바로가기

  • 컬렉션 페이지도 마찬가지로 로딩중일때 skeleton grid 사용하여 노출해주었습니다.

3.4. 사진 상세페이지


🔗 코드 바로가기

  • pc 사이즈 너비의 화면에서는 이미지를 클릭했을때 상세페이지가 레이어 팝업 형태로 나타나도록 하였습니다.
  • 반대로 모바일 너비에서의 화면에는 이미지 클릭시 바로 일반 상세페이지로 이동하게 됩니다.
  • 팝업이 열릴때 pushState를 사용하여 실제로 이동하지 않고 주소만 상세페이지 주소로 변경되도록 하였습니다.
  • 이로 인해 팝업이 열려있는 상태에서 새로고침을 하게 되면 일반 상세페이지로 이동합니다.
  • 다만 현재 서버 사이드 렌더링 및 해시 라우터를 사용하고 있지 않아 로컬에서만 작동하고 있습니다.
  • 레이어팝업 바깥쪽을 클릭하게 되면 다시 pushState를 사용해 이전 주소로 변경됩니다.


🔗 코드 바로가기

  • 사진을 누르면 이미지 주소를 바꿔 큰 사이즈의 이미지로 변경되도록 하였습니다.
  • 큰 이미지에서 다시 사진을 누르면 작은 이미지로 돌아오게 됩니다.


🔗 코드 바로가기

  • 연관된 사진 목록에서 이미지를 클릭하게 되면 닫히지 않고 해당 팝업에서 데이터가 변경됩니다.


🔗 코드 바로가기

  • 사진을 올린 사람의 정보를 간단하게 보여주고 연관된 사진 및 컬렉션들을 보여주도록 구현하였습니다.
  • 팝업 상세페이지와 같은 컴포넌트를 사용하여 재사용성을 높였습니다.

3.5. 웹사이트 반응형


토픽 추천



사진 검색
🔗 코드 바로가기

  • 모바일 너비에 화면에서는 controlMenu가 팝업으로 변경되고 버튼을 누르면 레이어 팝업이 나와서 옵션을 변경할 수 있도록 구현하였습니다.


컬렉션 검색



사진 상세 페이지