Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KDT5_김성은_6조 #74

Open
wants to merge 27 commits into
base: main
Choose a base branch
from
Open

KDT5_김성은_6조 #74

wants to merge 27 commits into from

Conversation

kse-seong-eun
Copy link

@kse-seong-eun kse-seong-eun commented May 10, 2023

6조 김성은
영화 검색 사이트

2023.5.6 [18:50] ver
'결과물 보기'

  • 언어 : JS
  • 번들러 : Webpack
  • 스타일 : Scss
  • 배포 : netlify

❗ 필수

  • 영화 제목으로 검색이 가능해야 합니다!
  • 검색된 결과의 영화 목록이 출력돼야 합니다!
  • 단일 영화의 상세정보(제목, 개봉연도, 평점, 장르, 감독, 배우, 줄거리, 포스터 등)를 볼 수 있어야 합니다!
  • 실제 서비스로 배포하고 접근 가능한 링크를 추가해야 합니다.

❔ 선택

  • 한 번의 검색으로 영화 목록이 20개 이상 검색도록 만들어보세요.
  • 영화 목록을 검색하는 동안 로딩 애니메이션이 보이도록 만들어보세요.
  • 무한 스크롤 기능을 추가해서 추가 영화 목록을 볼 수 있도록 만들어보세요.
  • 영화 상세정보가 출력되기 전에 로딩 애니메이션이 보이도록 만들어보세요.
  • 영화 상세정보 포스터를 고해상도로 출력해보세요. (실시간 이미지 리사이징)
  • [△] 차별화가 가능하도록 프로젝트를 최대한 예쁘게 만들어보세요.
  • 영화 개봉연도로 검색할 수 있도록 만들어보세요.
  • 영화 포스터가 없을 경우 대체 이미지를 출력하도록 만들어보세요.
  • 영화와 관련된 기타 기능도 고려해보세요.

문제점 ❎

  1. API 불러오는 코드의 문제로 제대로 된 값이 나오지 않아 부가적인 기능들 구현이 어려워짐.
  • classList.add('hide') // classList.remove('hide') 적용이 안됌.
    1. 영화 검색 로딩 애니메이션 [수정 완료 : API로딩 함수 pageMax 문제 ]
    2. 검색 더보기 버튼
  • 영화를 검색하고 'view more'버튼으로 다음 페이지를 불러는것 까지는 작동. 이후에 같은 영화 목록이 무한대로 불러와짐 [수정 완료 : 증가함수 코드 문제 ]
  • 영화 상세페이지 내 감독, 장르 데이터 연동 안됨 [수정 완료:오타]
  • 영화 검색 시 포스터, 제목, 출시년도 중 년도 데이터 못읽음 -> undefined [수정 완료:오타]

아쉬운 점 💦

  1. 코드를 완벽하게 이해하고 사용하지 못함.
  2. Netlify 업로드 문제
  • 깃허브 래퍼지토리 연결을 통한 배포링크는 에러 발생함. (build 결과물인 dist폴더를 직접 넷리파이에 업로드해 배포용 url 생성)

배운 점 ✅

  • 비동기 통신의 이해
  • component의 개념과 사용법
  • 번들러의 개념과 사용법
  • JS 문법, 리액트 문법 개념 맛보기

구조

  • 진입점 : main.js
  ______________   _________     _________    __________________________
  | index.html |--| main.js |---|  App.js |--| TheNav.js, TheFooter.js |
  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯   ¯¯¯¯¯¯¯¯¯  |  ¯¯¯¯¯¯¯¯¯    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
                              | ___________    __________   __________________________________________________________
                              ㄴ| index.js |---| Home.js |--| TheHeader.js, Search.js, MovieList.js, MovieListMore.js |
                                ¯¯¯¯¯¯¯¯¯¯¯ |  ¯¯¯¯¯¯¯¯¯¯   ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
                                            |  __________
                                            |-| About.js |
                                            |  ¯¯¯¯¯¯¯¯¯¯
                                            | ___________
                                            ㄴ| Movie.js |

@kse-seong-eun kse-seong-eun changed the title KDT5_김성은_6조 [재업] KDT5_김성은_6조 May 10, 2023
Copy link
Member

@iamidlek iamidlek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다.
전체적으로 잘 구현해 주셨습니다.
UI도 보기 좋게 잘 구현해 주신 것 같습니다.
readme도 잘 작성해 주시고
commit 도 잘 나누어서 작성해 주셔서 좋습니다.

commit message 작성은 조금 더 고려가 되면 더욱 좋을 것 같습니다.
함수 명이나 로직을 조금 더 확인하면 좋을 것 같습니다.
검색 전에 view more 버튼이 나와있어 어색한 것 같습니다.

Comment on lines +17 to +21
this.el.innerHTML = `
<div class="movies"></div>
<div class="loading hide"></div>
`
const moviesEl = this.el.querySelector('.movies')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

innerHTML로 붙이고
다시 querySelector로 찾는 것은 좋지 않은 것 같습니다.
createElement 하시거나 Template strings으로 필요한 요소를 만든 후에
한번에 붙이는 것이 좋을 것 같습니다.

</span>
<img src="${movie.poster === 'N/A' ? 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/No_Preview_image_2.png/1200px-No_Preview_image_2.png?20200726064257' : movie.poster}" onerror="this.onerror=null;)" alt="이미지를 불러올 수 없습니다.">
`
moviesEl.append(movieEl)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반복적으로 append 하는 것은 좋지 않은 것 같습니다.
요소를 전부 만든 후에 한번에 붙여주는 방법이 권장됩니다.

movieStore.subscribe('pageMax', () => {
const { page, pageMax } = movieStore.state
pageMax <= page ? this.el.classList.remove('hide') : this.el.classList.add('hide')
console.log(pageMax, page)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인이 끝난 후에는 console.log 지워주세요

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 알겠습니다!

export default class MovieListMore extends Component {
constructor() {
super({})
movieStore.subscribe('pageMax', () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구조상 pageMax 값이 동일하더라도
할당이 이루어져 재렌더링이 일어나지만
의미적으로는 page 의 변화를 바라보고 있어야 할 것 같습니다.

현재 구조에서는 아래처럼 될 것 같아요.

Suggested change
movieStore.subscribe('pageMax', () => {
movieStore.subscribe("page", () => {
const { page, pageMax } = movieStore.state;
if (page === 1) {
this.el.classList.remove("hide");
return;
}


const btnClickHandler = async (page) => {
movieStore.state.page += 1
await totalPages(movieStore.state.page)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

totalPages 함수가 movieStore 안에 있는데
movieStore.state.page를 굳이 빼서 더해주는 이유가 있을까요?

또한 영화 검색 결과를 더 가져오는 요청인데 totalPages 는 이름이 어색한 것 같습니다.

Copy link
Author

@kse-seong-eun kse-seong-eun May 16, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아니요! 특별한 이유는 없습니다. 코드 작성 다시 살펴보고 수정해두겠습니다!
함수명은 함수 역할에 맞게 수정하겠습니다 :)

}

this.el.innerHTML = `
<div style="background-image: url(${bigPoster})"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

인라인 스타일을 주지 않고 구현 가능한 방법은 없을까요?

export default store
export async function requestAll(searchText, year = '', page = 1) {
const s = `&s=${searchText}`
const y = `&y=${year}`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

인자로 제대로 값을 받는 경우가 없는 것 같습니다.

method: 'GET'
})
//로딩끝
store.state.loading = false
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

try 문 내에 로딩 끝을 내시면
요청 실패하여 catch로 가게되면 무한히 로딩 컴포넌트만 보일 것 같아요.

store.state.loading = false

if (data.Response === 'True') {
store.state.pageMax = data.totalResults < 20 ? 1 : Math.ceil(data.totalResults / 10)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

계산이 문제가 있어 보이는데 < 20 이 맞나요?

}

//영화 전체 페이지 계산
export async function totalPages(page) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

페이지 계산이 아닌 requestAll 함수가 불리면서 요청이 발생합니다.
두 함수 이름이 동작과 맞지 않는 것 같습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants