머리가 나빠 몸을 고생시킴

2024년 1월 4일 목요일

Today I Learned

날짜

2024년 1월 4일 목요일

내용

목표 없는 노력만큼 바보 같은 것도 없다. 그럼 나는 꽤 바보다.

매일 노션에서 Todo 작성하고, 업데이트하면서 볼 수 있는 문구다. 근데 내가 그렇다. 조금 더 정확히 말하자면 목표가 있었는데 잘못된 목표였다. 그래서 아예 바보까진 그렇고 약간 바보라고 하겠다. 그래도 얻은 것은 있으니까…

index.html만 화면이 안나타나서 어제부터 머리를 쥐어뜯었다. 문득 어떤 화면이 떠야 정상일까 궁금해서 로컬에서 index.html을 크롬으로 열어봤는데 아무 것도 안뜬다. 안 뜨는게 문제가 아니였다. 로컬에서 확인해보니 루트 경로로 들어가서 index.html로 가도 결국 메인 랜딩페이지(home/main)이 뜨게 된다.

뭔가 크게 헛돌고 있다는 느낌이 들어 가장 원론으로 돌아와 다시 상황을 짚어봤다.

  1. Google Search Console에서 테스트 서버의 사이트맵을 찾지 못한다.
  2. URL 검사 결과
    1. 테스트 서버의 루트 경로와 사이트맵 경로는 통과한다.
    2. 랜딩페이지들(home의 하위 경로들)은 통과하지 못한다. Not Found 404가 뜬다.

이 확인 과정에서 새로운 문제를 확인했는데, 랜딩페이지로 직접 들어가면 화면이 올바르게 뜨지만, 개발자 도구에선 404 오류가 발생한 후 화면이 로딩된다. 요청의 header에 에러에 관한 메시지가 담겼는데 CloudFront에서 해당 key를 찾을 수 없다고 나온다(cloudfront the specified key does not exist.). 그래서 문제의 원인은 CloudFront가 S3의 버킷에서 키를 못찾고 있다고 판단했다.

버킷을 확인해보니 index.html 객체와 main.js 객체는 루트 디렉토리에 잘 있었다. 로컬에서 코드를 좀 더 살펴본 결과, 루트 경로로 들어오면 HomeComponent 로 보내지고, 거기서도 메인 랜딩페이지에 관련된 컴포넌트로 보내진다. 그래서 main.js는 있어도 메인 랜딩페이지와 관련된 모듈이 없어서 문제가 될 수도 있겠다고 생각했다.

테스트 서버의 버킷에는 특정 모듈들이 존재하지 않는 것처럼 보였다. 알아볼 수 있는 이름들 중 존재하는 모듈을 모두 확인해보니 랜딩페이지와 관련된 모듈은 아예 없었다. 그럼 누락됐거나, 내가 잘못된 버킷을 보고있거나 둘 중 하나였다. 확실히 어떤 버킷을 봐야 할지, 애초에 이 버킷에 어떻게 들어오는지 알고 싶어 ci-cd 설정을 들여다 보니, dev 브랜치가 변경되면 어떤 버킷에 업로드된다. 그 버킷 이름은 Repository에서 secret으로 관리되서 확인할 수가 없었다.

이 과정이 모~~~두 헛수고였는데 애초에 객체 내에 파일들은 사람이 볼 수 없는 형태로 되있는게 많다. 내 눈에 안보인다고 없는게 아니였다. 그리고 테스트 서버의 브랜치가 업데이트 될 떄마다 잘 알아서 올라가고 있었다. 그리고 랜딩페이지에 접속할 때만 404가 뜨는게 아니였다. 슈퍼관리자던, 관리자 페이지던 다 그랬다. 심지어 실서버조차.. 그래 뭐 전체 시스템을 공부한셈 쳤다..

그럼 404가 뜨는데도 불구하고 원하는 페이지가 렌더링 되는 이유는 뭘까. SPA(Single Page Application)이라서 그렇다. SPA는 서버로부터 완전한 새로운 페이지를 불러오지 않고 현재의 페이지를 동적으로 다시 작성함으로써 사용자와 소통하는 형태를 말한다. 그리고 우리 서비스가 그렇다. 서버와 통신이 실패하더라도 클라이언트 쪽에서 라우팅을 처리한 덕이었다.

잘 모르던 개념이라 열심히 찾아보니, SPA는 SEO 등록이 꽤 복잡했다. SPA는 한 페이지 내에서 동적으로 다른 페이지들을 불러오다보니, 다른 여러 페이지가 등록되지 않고 맨 처음 index.html이 불러와지는 루트 경로만 URL 검사에서 통과했던 것이었다. 드디어 실마리를 찾았다… 그래서 해결방법을 고민했다.

테스트서버, 실서버의 404 문제는 내 깜냥이 안되니 SEO라도 제대로 등록하자. 루트 경로만 잘 등록하고 메타데이터를 이용해보자.

마침 딱 오늘, 저번주에 색인 등록해놓은 페이지들이 검색창에 뜨는걸 확인했다.

AlphaReview라고 붙여서 검색하면 위에서 25번째 정도 사이트로 뜨고, Alpha Review로 검색하면 안뜬다.. 저 밑에 써있는 Description에 얼마나 키워드를 잘 넣느냐에 따라 상단 노출에 유리하다. 테스트서버를 기준으로 잘 설정해보고 실서버에도 적용할 수 있겠다.

머리가 나쁘면 몸이 고생한다.

매 주 고객들에게 주간 리뷰에 관해 리포트 메일을 발송하도록 로직을 작성했다. 발송 시간을 한국 시간을 기준으로 일관적으로 발송하도록 했는데, 매주 월요일 아침 출근한 고객이 메일을 확인하는 것이 당연히 모양새는 더 좋다. 그렇다면 샵마다 현지시간에 맞춰 보내도록 로직을 바꿔야 하는데, 각 shop에게 보낼 내용과 시간을 DB에 저장해야 한다고 생각해서 DB에 새로운 테이블을 만드려고 했다.

이에 대해 귀중한 조언을 받았는데, 원래 스크립트를 매주 월요일 1번 실행한 것을 월요일에 1시간 간격으로 24번 실행하면 되는 문제였다. 단, 매번 shop의 현지 시간이 오전 8시 30분부터 9시 30분 사이인지 확인하는 로직만 추가하면 됐다. 현지시간이 이때보다 전이면, 좀 더 나중에 cron이 실행될 떄 보내게 될 것이고, 이떄라면 시간에 맞춰 현지시간 8시 30분~ 9시 30분 사이에 보내게 되고, 이때 이후라면 이미 이전 실행때 보내졌으니 중복될 가능성도 없다. 좀 더 차분히 다양한 방법에 대해 생각했어야 했다.

회고

불쌍한 내 몸. 머리를 원망하렴.