내일배움캠프/Today I Learned

[TIL 2023.06.01] 영화 검색 페이지 완성! 제출 전 다듬기 (GOE’s CINEMA)

괴코딩 2023. 6. 2. 03:03
 

💻오늘 배운 내용


replace()

str_text.replace("찾을 문자열", "변경할 문자열")

 

정규표현식

str_text.replace(/찾을 문자열/gi, "변경할 문자열")

정해진 규칙을 사용해 모든 문자를 변환할 수도 있고 숫자만 변환하거나 맨 처음, 맨 뒤만 변환할 수 있음

슬래쉬(/) 표시 안에 넣는 텍스트의 따옴표는 없어야함

 

gi의 의미

  • g : 전체 모든 문자열 변경 (global)
  • i : 영문 대소문자를 무시, 모두 일치하는 패턴 검색 (ignore)

특수 기호를 맨처음 적을 때는 항상 역슬래쉬(\) 부분이 정규식 맨 앞에 존재 해야함

 

str_text.replace(/\./gi, "-")

기호의 뜻을 풀어보자면

1] /문자열/ (이제 정규식을 사용할건데)- ’/’ 슬래쉬는 정규 표현식의 시작과 끝을 나타냄.

2] /\/ (\뒤에 올 문자는 특수문자가 아니야, 알았지?)- ‘\’ 특수 문자로 해석되는 것을 방지

3] /\./ (문자열 안에 .(온점)을 찾아서)

4] /\./gi (대소문자를 무시한 전체 모든 문자열을 대상으로 .(온점)을 찾아서)

5] /\./gi, “-” (.을 모두 -으로 바꿔줘)

예시) “I.like.a.pizza”.replace(/\./gi, "-") ⇒ “I-like-a-pizza” 가 된다.

 

[ ] 안에 특수기호를 넣으면 하나하나 개별적으로 변환

"4asdf/.asdf/.fsdd4df".replace(/[/4.]/gi, "@"); => @asdf@@asdf@@fsdd@df

문자열 내의 “/”, “4”, ”.” 요소를 @로 바꿔라는 뜻

만약 "4asdf/.asdf/.fsdd4df".replace(/\/4./gi, "@")라는 식이 있다면

“/4.”의 패턴을 찾아서 @로 바꾸라는 건데 현재 문자열에서 “/4.”가 없기 때문에

"4asdf/.asdf/.fsdd4df" 그대로 반환된다.

 

[ ] 없이 특수기호 여러개를 작성하면 하나의 묶음으로 인식해서 변환

"asdf/.asdf/.fsdddf".replace(/\/./gi, "@"); => asdf@asdf@fsdddf

문자열 내의 “/.” 패턴을 찾아서 @로 바꿔라는 뜻

위의 문자열에서는 해당 패턴이 2번 발견된다.

 

정규식에서 문자가 의미하는 뜻

[a-z] : a ~ z 사이의 문자를 찾음

[abc] : a, b, c 중 하나를 찾음

[^abc] : a, b, c를 제외한 문자를 찾음

 

정규식을 활용한 특정 문자 제거 방법

.replace(' ','') 첫번째 공백 제거

.replace(/\-/g,'') 특정문자 제거1 (-)
.replace(/,/g,'') 특정문자 제거2(,)
.replace(/^\s+/,'') 앞의 공백 제거
.replace(/\s+$/,'') 뒤의 공백 제거
.replace(/^\s+ \s+$/g,'')
.replace(/\s/g,'') 문자열 내의 모든 공백 제거
.replace(/\n/g,'') n개행 제거
.replace(/\r/g,'') 엔터 제거

 

❓발생한 이슈/고민


  1. 깃허브에 이미지 파일 업로드 오류
  2. 인풋창 에 뜨는 x가 보기 싫다.
  3. 브라우저 창 크기를 조정해도 막 이동하지 않고 풀로 붙인듯 위치를 고정하고 싶다.
  4. 페이지 스크롤 하면서 아래로 많이 내려갔다면 한번에 위로 올려줄 top버튼을 만들고 싶다.
  5. error: failed to push some refs to 'https://github.com/HyunseoY/GOE_CINEMA.git'
  6. 404 에러라니 ㅜㅜㅠ
  7. 검색 JS 함수 간결하게 다시 써보자. 너무 정신없이 짜여진 듯

 

💡해결과정


1. 깃허브 업로드만 하면 되는데 png 파일 업로드가 안된다.

왜…왜 untracked….

파일에 제대로 추가가 되지 않아서 인식을 못하나 보다.

파일 Staging Area 상태표시 Working Tree 상태표시  
README   M 내용을 변경했지만 아직 Staged 상태로 추가하지는 않음
Rakefile M M 변경하고 Staged 상태로 추가한 후 또 내용을 변경해서 
Staged 이면서 Unstaged 상태
lib/git.rb A   파일이 생성되어 Staged 상태로 추가까지 한 상태
lib/simplegit.rb M   내용을 변경하고 Staged 상태로 추가까지 한 상태
LICENSE.txt ? ? 추적하지 않는 새 파일

git add .

git commit -m “메세지 입력”

git push

순서로 명령어를 입력하면 해결!


 

2. 인풋창 에 뜨는 x가 보기 싫다면

input 태그의 타입을 search에서 type="text” 변경하면 엑스표 사라진다. 시원~


 

3. 브라우저 창 크기를 조정해도 막 이동하지 않고 풀로 붙인듯 위치를 고정하고 싶다면

 

#btn {
  position: absolute;
  height: 60px;
  width: auto;
  left: calc(70%); /* 가로 중앙 정렬 (버튼 너비의 절반을 뺌) */
  transform: translateY(5%); /* 세로 중앙 정렬을 위한 변형 */
}

 

transform과 calc()을 사용한다면 어렵지 앉은 문제이다.

그걸 몰라서 한 1시간은 요리조리 삽질만 했던 것 같다.

(calc()는 괄호 안의 식을 계산한 결과를 속성값으로 사용하게 해주는 함수)


4. 페이지 스크롤 하면서 아래로 많이 내려갔다면 한번에 위로 올려줄 top버튼을 만들고 싶다 3가지 정도 의 방법을 알아 냈다.

 

  • JS를 사용
const topBtn = document.querySelector('.moveTopBtn');
topBtn.onclick = () => {
  window.scrollTo({ top: 0, behavior: 'smooth' });
};
  • html <a href=””/>로 앵커 만들기
  • top버튼의 태그에 바로 <div class="moveTopBtn" onclick="window.scrollTo(0, 0);">라고만 해도

top기능이 된다.

3개 방법 중 제일 스무스한 동작은 역시 자바스크립트를 활용하는 방법이지만

벌여놓은 코드가 많아서 조금이라도 코드를 더 짧게.. 간결하게 하고 싶었던 나로서는 2번 3번이 좋다..

그래도 이동의 부드러움은 포기 못해서 자바스크립트로 만들었다 ..ㅋㅋ


5. error: failed to push some refs to 'https://github.com/HyunseoY/GOE_CINEMA.git'

원격저장소(github)에 내 로컬(내컴퓨터)에는 없는 파일이 있을 때 내 파일을 push 하면 발생하는 오류다.

즉 원격저장소를 pull 해야한다.

그러고 나서 git push하면 정상적으로 작동한다!

항상 주에 한번씩은 날 괴롭히는 깃..언제쯤 익숙해질까


6. 404 에러….

index.html에서 top_rated.html 넘어갈때만 생기는 문제인 것을 확인

경로설정이 잘못 되어있었다.

<a href="/html/top_rated.html">이 아니라

<a href="./html/top_rated.html">슬래쉬 앞에 .(온점)이 있어야 한다.

사실 둘다 같은 말 아닌가..? 하지만 딱 저기만 문제가 생긴 것을 보면 .을 꼭 찍어줘야 되나보다

우리 깃헙스키…


7. 함수가 너무 보기 불편해서 수정했다.

 

// 검색어를 사용하여 영화를 필터링하는 함수
function searchFilter(data, search) {
  const searchKeywords = search.toLowerCase().split(' '); 
  // 검색어 모두 소문자로 전환
  // 공백을 기준으로 분리하여 배열로 반환하는 문자열 메서드
  // 예시) "Hello, world! This is an example." => ["Hello,", "world!", "This", "is", "an", "example."]

  return data.filter((movie) => {
    const movieTitle = movie.title.toLowerCase().replace(/\\s/g, ''); 
    // 정규 표현식을 사용하여 문자열에서 모든 공백을 제거하는 문자열 메서드
    // 예시) "The Dark Knight" => "TheDarkKnight"
    return searchKeywords.every((keyword) => movieTitle.includes(keyword));
  });
}

 

일단 주석은 다 떼고…ㅎㅎ

.every() 메소드를 사용하니 괜히 복잡하게 돌아가는 것 같아서

searchKeywords 뒤에 .join() 메소드를 추가하여 공백단위로 나열한 배열을 문자열로 바꿔준다.

그리고 영화제목에 searchKeywords 가 포함된다면 해당 영화를 표시하게!

 

// 검색어를 사용하여 영화를 필터링하는 함수
function searchFilter(search) {
  const searchKeywords = search.toLowerCase().split(' ').join('');

  return movies.filter((movie) => {
    const movieTitle = movie.title.toLowerCase().replace(/\\s/g, '');
 
	  return movieTitle.includes(searchKeywords);
  });
} 

 

수정한 코드다. 좀 정리가 된 느낌!

 

📽️ 완성한 나의 페이지


1) 홈 화면 및 인기영화 자동 슬라이드

슬라이드에 마우스 호버 시 슬라이드 멈춤. 마우스 떼면 다시 자동 슬라이딩

2) 카테고리별 영화 페이지

3) 검색 시 실시간 반영되어 결과 도출

띄어쓰기에 상관없이 검색가능/대소문자 구분 없음

4) 하단 푸터

이메일주소에 마우스를 올리면 글자색이 변화한다
하지만 클릭은 안됨.

로고 클릭 시 홈화면으로 이동 

깃허브 아이콘 클릭 시 제작자 깃허브 주소로 이동 

티스토리 아이콘 클릭 시 제작자 블로그로 이동

 

6. 아쉬운점 (추가하고 싶은 기능)

  1. 원래는 영화별로 상세페이지를 모달로 띄워서 더 많은 정보를 표시
  2. 검색어 입력 시 현재 페이지 위치에 상관없이(카테고리에 상관없이) 해당되는 영화를 검색
  3. 검색 실시간 반영이 페이지 자체가 아니라 인풋창 하단에 필터링된 결과값을 리스트로 나타내는게 더 좋았을 듯

 

🧐궁금점과 부족한 내용


javascript 모듈에 대해!?

가독성과 재사용률을 높이는 방법이라고 하는데

시간이 부족해서 자세히 다 공부 못했다. 주말에 더 자세히 봐야지

 

📋레퍼런스


https://nemomemo.tistory.com/77 github 이미지 업로드 오류

https://gurtn.tistory.com/137 top버튼 만들기

https://ninearies.tistory.com/177 replace()

https://eunhee-programming.tistory.com/164 404에러

반응형