본문 바로가기

배워서 따라하는 포플/영화 검색 사이트

(13)
Netlify 배포, API 만들기, 변수 구성, 포트 수정 및 배포 Netlify Serverless Functions 본 프로젝트는 SPA 방식으로 작성했으며, imdbAPI 인증키를 노출 우려가 있습니다. netlify의 서버리스 함수를 사용해 해당 단점을 최소화하려고 합니다. netlify-dev 참조 기존에 프로젝트는 바로 브라우저에 배포되는데 서버리스 함수를 사용하면 functions와 함께 netlify dev에 배포후, 브라우저에 배포합니다. Netlify CLI 구성 프로젝트 폴더 안에 netlify.toml파일을 생성한 후, 위와 같이 작성해줍니다. 영화 정보 반환 API 만들기 const axios = require('axios') exports.handler = async function(event) { const payload = JSON.parse..
검색 정보 초기화 및 스크롤 위치 복구 검색 정보 초기화 store폴더 안에 movie.js mutations 내용입니다. _defaultMessage 변수를 만들었고, loading도 false상태로 초기화하는 겁니다. routes폴더 안에 Home.vue 추가된 부분입니다. 페이지를 들어갈 때마다(created), 방금 resetMovies 메소드를 실행합니다. 페이지 전환 시 스크롤 위치 복구 vue router에서 제공하는 기능입니다. routes폴더 안에 index.js파일에 추가하면 됩니다.
부트스트랩 Breadkpoint, 전역 스타일 부트스트랩 Breadkpoint(반응형) 사이트가 작아져도 내용을 온전히 보일 수 있는 것을 반응형이라고 부릅니다. 부트스트랩의 기능을 통해 쉽게 만들 수 있습니다. components폴더 안의 Header.vue의 template 추가부분입니다. 해당 이미지를 클릭하면 toAbout()메소드가 작동되며 about페이지로 이동됩니다. .user { width: 40px; height: 40px; padding: 6px; border-radius: 50%; box-sizing: border-box; background-color: $gray-200; cursor: pointer; position: absolute; top: 0; bottom: 0; right: 40px; margin: auto; trans..
About, 404 Page not found About export default { namespaced: true, state: () => ({ name: 'Skye', email: 'hkim7095@gmail.com', blog: 'https://skye-coding.tistory.com/', phone: '+82-1234-5678', image: '' }) } store폴더 안에 about.js내용입니다. image 경로를 설정하면 됩니다. {{ name }} {{ email }} {{ blog }} {{ phone }} routes폴더 안에 About.vue의 template내용입니다. loading 애니메이션을 추가할 생각입니다. routes폴더 안에 About.vue의 script내용입니다. routes폴더 안에 About.vue의 st..
영화 포스트 로드 이벤트, 예외처리, Nav 경로 일치 및 활성화 이미지 로드 이벤트(Vue 플러그인) MovieItem.vue의 template과 script 추가부분입니다. 영화 검색했을 때 포스터가 로딩될 때까지 로드 애니메이션을 사용할 겁니다. methods를 플러그인 방식으로 관리할 겁니다. export default { install(app) { app.config.globalProperties.$loadImage = (src) => { return new Promise((resolve) => { const img = document.createElement('img') img.src = src img.addEventListener('load', () => { // 완료 resolve() }) }) } } } src폴더 안에 plugins폴더를 만들고 안에 ..
단일 영화 상세 페이지 단일 영화 상세 정보 가져오기 async searchMovieWithId({state, commit}, payload) { if(this.state.loading) return commit('updateState', { theMovie: {}, loading: true }) try { const result = await _fetchMovie(payload) commit('updateState', { theMovie: result.data }) } catch(error) { commit('updateState', { theMovie: {} }) } finally { commit('updateState', { loading : false }) } } movie.js파일 actions부분에 searchMov..
Container 사용자 지정, 에러 메시지 출력, 로딩 애니메이션, Footer Container 너비 사용자 지정, MovieItem영역 회색 배경 $container-max-widths: ( sm: 540px, md: 704px, lg: 924px, xl: 1140px, xxl: 1364px ); src폴더의 scss폴더 안에 main.scss에서 container너비를 위와같이 수정합니다. MovieList.vue의 style부분에서 inner를 꾸며서 movie를 출력하는 곳에 회색 배경을 보여줍니다. 에러 메시지 출력 왼쪽은 MovieList.vue의 state부분 message입니다. 오른쪽은 movie.js의 actions의 searchMovies중 try앞에 추가합니다. 웹페이지 열어줄 때는 먼저 검색하라고 나올 것이고, 검색버튼 클릭 시, message가 오른쪽처럼 ..
영화 아이템 - 기본 출력, 텍스트 말줄임와 배경 흐림 영화 아이템 - 기본 출력 MovieList.vue의 MovieItem부분을 movies로 감싸주고 스타일을 줍니다. {{ movie.Year }} {{ movie.Title }} MovieItem.vue의 template부분입니다. MovieItem.vue의 style부분입니다. 여기까지 기본적으로 출력하는 용도입니다. 영화 소개하는 부분의 길이도 일치하지 않고 기타 스타일도 예쁘게 나오지 않았습니다. 스타일을 좀 더 깔끔하게 나오게 추가 작업이 필요합니다. 영화 아이템 - 텍스트 말줄임 표시와 배경 흐림 처리 movie클래스에 마우스 올리면 border생길 수 있게 :hover::after를 추가했습니다. 배경 흐림 처리는 오른쪽에 backdrop-filter 속성을 사용할 수 있습니다. firefo..
영화 검색 - 기본 검색, 추가 요청, ID중복 제거, 리팩토링 영화 검색 - 기본 검색 import axios from 'axios' export default { namespaced: true, state: () => ({ movies: [], message: 'hello movie', loading: false }), getters: {}, mutations: { updateState(state, payload) { // ['movies', 'message', 'loading'] Object.keys(payload).forEach(key => { state[key] = payload[key] }) }, resetMovies(state) { state.movies = [] } }, actions: { async searchMovies({commit}, payloa..
Vuex(Store) - 개요, 구성 Vuex(Store) 개요 search부분과 하단 결과 표시 부분은 형제요소입니다. search부분에서 apply메소드를 통해 결과를 가지고 오는게 search내부에서 표시되는 겁니다. 부모 자식간에 데이터 통신은 props혹은 emit을 사용할 수 있고, 상위 혹은 하위 component들은 provide혹은 inject을 통해 데이터 통신할 수 있습니다. 형제 component들끼리 Vuex를 사용하면 됩니다. 지금 프로젝트의 구조도입니다. 보다시피 Home과 MovieList는 부모자식임으로 props, MovieList와 MovieItem도 마찬가지로 props를 사용할 수 있습니다. Home에서 MovieList를 건너뛰서 MovieItem에 provide/inject를 통해 데이터 통신 가능합..