오늘 한 일

  • 드디어 프로젝트 결과물 제출 기일이 되었다. 수정사항 반영해서 마지막으로 로컬에서 확인해 보는 중에, 검색 결과에서 [관련순] 버튼을 눌러도 게시글 순서가 바뀌지 않는 원인이 모든 페이지에 들어가는 뉴스 목록 컴포넌트에 무조건적으로 날짜 내림차순 정렬이 적용되어 있기 때문이라는 것을 알게 되었다. 급히 수정했다. 검색 결과를 보여주는 방식은 [최신순]과 [관련순]이 있었는데 이 버튼을 누르면 어차피 서버에서 날짜순과 관련순으로 구분해서 데이터를 넘겨주기 때문에, 검색 결과를 보여주는 창에서는 굳이 프론트에서 날짜 내림차순 정렬을 하지 않아도 됐다. 그래서 검색어를 뉴스 목록에 props로 넘겨주고, 검색어가 있는 경우에는 서버에서 들어오는 데이터에 날짜 정렬을 아예 적용하지 않는 방식으로 해결했다. 마지막 배포 전에 후다닥 해치울 수 있어서 다행이었다.
  • 프로젝트 제출 페이지에 넣을 시연 영상을 찍었다. 찍는 게 서툴러서 몇 번을 다시 찍었는지 모르겠다. 제출하고 보니 우리 조가 첫 번째였다. 지금까지 무엇이 됐든 이렇게 일찍 제출해본 적이 없었는데. 왠지 감격스러웠다.
  • 오늘은 피곤이 극에 달해 몇 시간에 한 번씩 자꾸 잠을 잤다. 아침에도 회의 시간에 맞춰 겨우 일어나고, 점심 먹고 나서 다시 자고, 일어나서 조금 하다가 오후 9시쯤 또 자고 다시 일어나고.

내일 할 일

  • 프론트엔드 깃헙 리드미 파일을 좀 작성해야 할 것 같다. 지금껏 한 번도 작성해보지 않아서 어떤 식으로 적어야 할지 모르겠지만... 지금이 뭔가 남길 수 있는 마지막 기회일 것 같다.
  • 내일은 드디어 마지막, 실전 프로젝트가 시작되는 날이다. 조 편성부터 어떻게 될지 많이 궁금하다. 6주라는 기간이 주어지는 만큼, 지금까지처럼 무리하지 말고... 잠도 줄이지 말고... 긴 호흡으로 꾸준히 잘 버틸 수 있으면 좋겠다.

오늘 한 일

  • 오늘은 주로 CSS 관련 작업만 계속 했다. 메인 페이지의 상단 카테고리 바를 스크롤을 내려도 브라우저 상단에 고정되게 만들었다. 스크롤 높이에 따라 카테고리 바가 고정되거나 고정되지 않는 것을 조정해야 하는 줄 알았는데, 단순히 position: sticky 속성을 주니 해결됐다.
  • 또, 카테고리를 클릭하면 해당 카테고리 아래에 테두리가 생기게 했다. :active 의사 클래스를 사용하면 마우스 클릭 버튼을 누르고 있는 동안 특정 CSS 속성을 활성화하는데, 이걸 유지하는 데에만 신경을 썼었다. 하지만 이것도 해당 카테고리를 클릭하면 들어가 있는 window.location.pathname을 따 와서 이게 카테고리와 일치하는 경우에만 CSS를 주도록 만들었다.
  • 입력한 검색어에 해당하는 검색 결과가 없을 때, 검색 결과가 없다는 걸 알려주는 페이지 하단에 추천 검색어가 뜨는데, 해당 검색어를 클릭하면 그 검색어에 대한 검색 결과 페이지로 넘어가도록 했다.
  • 어제부터 고전하던 로딩 스피너 문제를 드디어 해결했다. 물론 내가 아니라 튜터님이^^; 우리는 어떻게든 해결해보겠다고 이틀 내내 구글에 별 검색어를 다 적어넣으며 샅샅이 찾아봤는데, 그때마다 '아니 로딩 스피너 하나 제대로 붙이는 게 이렇게 어렵다고!?' 라는 말을 하곤 했다. 데이터가 로딩되는 중에는 스피너를 보여주고 싶은데, 꼭 스피너가 나오기 전에 데이터가 로딩되지 않은 미운 컴포넌트가 잠깐 반짝하고 보이는 현상이 있었다. 그래서 루트 컴포넌트인 app.js에 스피너를 넣으려고 시도하던 중이었다. 구글링해서 찾은 내용에 따라 app.js를 함수형 컴포넌트에서 눈에 익지도 않은 클래스형 컴포넌트로 억지로 바꿔가며 끼워 맞추고 있었는데 그러고 나니 끔찍한 혼종(데이터 로딩이 완료되었는데도 스피너가 그 위에서 중첩되어 계속 돌았...다..)이 탄생하고야 말았다. 마침 그때 튜터님이 빛처럼 강림하셔서 뚝딱 해결해주고 가셨다. 구글에서 대충 긁어 온 코드를 갖다붙인 나로서는, 튜터님이 하나하나 코드에 대해 물으실 때마다 내 대답이 시원찮아 너무나 민망했다. 튜터님은 어떤 상황에서 로딩 스피너를 붙이려고 하는 건지 차근차근 생각해보면 어려울 게 없다고 하시면서 토닥여주고 가셨다. 그리고 튜터님이 만들어주신 코드는 먼 길 돌아가려고 했던 내가 생각한 복잡한 코드와는 달리 간결하고 클린한 코드였다ㅠㅠ... 간단하게 생각하는 법을 잘 모르는 나는 갈 길이 무한 스크롤 같다.
  • 오늘은 우리 조 프론트 분에게 리덕스 사용법에 대해 설명해 드렸다. 나도 기본적인 개념은 잘 모르지만, 그래도 데이터가 어떤 방향으로 흐르는지는 알게 되어서 그 덕분에 지금까지 리덕스를 그럭저럭 사용해 왔던 것 같다. 그 방법을 간단하게나마 자료로 만들어 공유해 드렸다. 리덕스가 까다로운 건 분명하지만 부디 너무 어려워하지 않으셨으면 좋겠다. (하지만 나도 어렵지 야호)
  • 지금까지의 수정사항을 모두 반영해서, 며칠간 미루고 미루던 재배포를 했다. 한층 더 완성도가 높아져서 뿌듯하다. ╰(*°▽°*)╯

내일 할 일

  • 자잘한 메뉴들은 우리 팀의 노션 페이지와 연결한다. 하지만 노션 페이지에 개인정보가 있으므로 그 부분은 삭제하거나 다른 페이지를 새로 파야 할 것 같다.
  • footer에 hover 시 애니메이션을 준다. 이건 완전히 추가적인 기능이지만, 시도해보자.
  • 처음에는 숨겨져 있다가 스크롤을 내리면 나오는 프로그레스 바에 상세 페이지 뉴스 제목을 붙인다. 오늘 프론트 분과 같이 여러 차례 도전해봤지만 허탈하게 실패하고 말았다.

오늘 한 일

  • 검색창을 띄우는 버튼을 누르면 검색창으로 페이지 이동이 완전하게 이루어져야 하는데, 자꾸만 검색창이 페이지 가운데에 뜨고 양 옆 부분으로는 다른 컴포넌트가 보이는 기현상이 일어났다. z-index 문제인가 싶어서 검색창을 0까지 내려보기도 했는데 , 그런 식으로 해결되는 문제는 아니었다. 왜냐하면 두 컴포넌트의 url이 겹쳤기 때문이었다...^^ 아무리 관련 있는 컴포넌트라지만 url 분기를 제대로 안 하다니, 순식간에 해결되는 걸 보고 허무와 충격을 동시에 느꼈다.
  • 카테고리 이름을 클릭하면 카테고리별로 뉴스 목록이 나타나는 페이지에서는 카테고리가 달라질 때마다 브라우저 주소창 위 타이틀이 달라져야 했다. 구글링 해서 react-helmet 을 설치하니 컴포넌트별로 메타 태그에도 손을 댈 수 있었다. 사용법도 간단했다. 앞으로도 애용할 것 같다.
  • 사용자가 이메일 주소와 닉네임을 입력하면 해당 데이터를 서버로 넘겨서, 서버에서 메일을 발송하기로 했다. axios를 적용해 작업을 완료했다.
  • 검색창에서 검색어를 입력하면 주소창에 검색어를 들어가게 한 후, 곧바로 검색 결과 페이지로 이동시킨 다음 거기서 그 주소창의 검색어를 다시 따서 서버에 보내 관련 뉴스 목록을 받아오는 axios 코드를 다른 프론트 분과 함께 짰다. 버튼을 클릭하면 최신순과 관련순으로도 받아올 수 있도록 했다.
  • 배포해도 수정은 가능하니 일단 배포를 했다. 백엔드 분들도 데이터가 어떻게 펼쳐지는지를 보고 싶으실 텐데 지금까지 프론트에서 공유해주는 화면만 보셨으니 답답하셨을 것 같다는 생각이 들었기 때문이다. 수고했다는 말을 들을 때마다 프론트가 들이는 시간이 상대적으로 많다는 이유로 항상 공이 프론트에게 많이 돌아가게 되는 것 같아 민망스럽다. 협업해서 함께 만든 건데. 언제나 한결같이 배려해주시는 백엔드 분들 덕분에 수월하게 마무리 되어 가는 중이다.

내일 할 일

  • 다른 프론트 분이 로딩 스피너를 달아주셨는데, 스피너 자체가 조금 늦게 뜨거나 해당 컴포넌트에 데이터를 불러오지 않은 모습을 한번 띄운 후 뜨는 미운 모습을 보여서 다시 함께 방법을 연구해보기로 했다.
  • 카테고리 메뉴는 클릭하면 그 밑에 언더라인이 뜨는데 다른 페이지로 이동하기 전까지는 그게 유지된다. 하지만 내가 구현한 걸로는 마우스 클릭이 유지되는 상태에서만 언더라인이 잠깐 뜨고 사라진다. 이 부분 해결이 필요하다.
  • footer에 마우스를 올리면 글자가 옆으로 흐르는 애니메이션이 적용되어 있다. 구현해보도록 한다.
  • 상세 페이지에서는 프로그레스바가 뜨는데, 스크롤 막대의 위치에 따라 최상단에서는 보이지 않다가 어느 지점에 이르면 나타난다. 이것도 연구하기.
  • 상세 페이지 뉴스 제목 위 카테고리를 클릭하면 해당 카테고리의 뉴스 목록 페이지로 이동하게 한다. 어려울 것 같진 않다.

오늘 한 일

  • 메인 페이지 뉴스 목록 아래에는 '더보기' 버튼이 있어서, 처음에는 목록을 몇 개만 불러오고 그걸 눌렀을 때 추가로 더 붙여서 보여주는 식이다. 버튼을 누를 때마다 다음 목록이 나오는 거니까 페이지 버튼만 없을 뿐, 결국 화면에 나오지 않는 모든 데이터의 목록을 균등하게 나누는 페이지네이션이 필요했다. 주특기 주간 과제로 무한스크롤을 구현할 때 페이지네이션이 너무 어려웠던 기억이 나서, 이번만큼은 강의자료를 보는 대신 구글링을 먼저 했다. 운좋게도 나에게 필요한 수준의 간단한 페이지네이션을 아주 쉽게 설명해 놓은 블로그를 찾았다. 눈으로 쭉 코드만 훑었을 때에도 '이걸로 이게 된다고?' 싶을 정도로 짧았다. 역시 간결한 코드가 좋은 코드인 걸까, 단번에 실행됐다. 따라 치며 이해를 한 후에는 그 코드를 내 방식대로 더 짧게 만들어 보았다.
const CardList = () => {
	const [end, setEnd] = useState(12);     	  // 한 번에 불러올 개수 입력
	const all_news = useSelector(state => state.news.list);
	const news_list = all_news.slice(0, end); 	  // 0부터 (end-1)번째까지 출력

	const loadMoreNews = () => {
		if (end >= all_news.length) {             // 다음 목록이 없으면,
			return;                           // 리턴
		}
		setEnd(end + 12);                         // 다음 목록이 있으면 end를 증가
	};
}
  • 메인 페이지 뉴스 목록에 데이터가 잘 들어오기는 하는데 CSS에 하자가 좀 있어 오늘은 그 부분을 뜯어 고쳤다. 코드가 내 마음에 들게 실행되는 순간만큼 기쁠 때가 또 있을까.
  • 뉴스 목록에 뜨는 날짜들이 뒤죽박죽인 걸 깨닫고 나서는 날짜 내림차순으로 정렬해서 다시 배치했다.
  • 카드 리스트 안에 카드들이 들어있는 형태인데, 각자가 테두리 선을 가지고 있어서 겹치는 부분은 굵어졌다. 구글링을 통해 찾은 border-collapse: collapse; 로도 해결이 되지 않아 box-shadow 속성을 이용하는 방법을 찾아서 적용해봤다. 정석대로 처리한 건 아닌 것 같지만 전혀 생각지 못한 방법으로도 해볼 수 있다는 걸 배웠다.
  • 카테고리 메뉴를 누르면 카테고리별로 서버에서 데이터를 받아와 메인에서와 같은 카드 리스트 안에 담아 띄우도록 구현했다. 

내일 할 일

  • 사용자가 이메일 주소와 닉네임을 입력하면 해당 데이터를 서버에 넘겨주는 axios를 짠다.
  • 검색창 CSS가 알 수 없는 이유로 완전히 뭉개졌다...ㅠ.ㅠ 고치는 것을 시도해봐야겠다.

오늘 한 일

  • 쉬는 날이어서 오늘도 진짜 쉬었다. 지난 프로젝트 때 일요일 쉬었다가 그 후에 너무 바빠졌지만, 그래도 이번에도 쉬었다.
  • 이번에 함께 프론트를 맡은 분은 지난 주에 재정비반에서 복습을 하셨기 때문에 이번 협업 프로젝트의 진행을 낯설어 하셨다. 팀 회의를 진행할 때도 협업의 과정도, 용어도 잘 모르니 회의 내용을 이해하기가 어렵다고 하셨다. 나도 백엔드와의 협업 프로젝트를 처음 시작했던 지난 주에 회의에서 말 한 마디 나올 때마다 스스로에게, 또는 구글에게, 또는 백엔드 팀원분들에게 많은 질문을 던졌었다. 그때로부터 단 1주일 지났을 뿐인데 그 고충을 잊어버리다니. 내가 미처 챙기지 못하고 지나쳐서 죄송했다. 오늘 잠깐 짬이 난 김에 내게도 딱 한 번뿐이긴 하지만 그 협업 경험을 바탕으로 만든 간단한 자료를 노션에 올려 공유하고 설명해드렸다. 그리고 게더의 화면 공유 기능을 이용해, 실습(?) 겸 해서 백엔드에서 주신 API URL을 연결하고 axios를 실제 코드에 적용해 데이터를 불러오는 과정을 보여드렸다. 비록 구멍 나 있는 CSS 때문에 예쁘게 보이지는 않았지만 다행히 생각했던 대로 데이터 자체는 잘 불러올 수 있었다.

내일 할 일

  • 메인 페이지 CSS의 구멍난 부분을 메우고, 메인 페이지의 데이터를 예쁘게 불러올 수 있는지 확인한다.
  • 상세 페이지에 서버를 연결하고 데이터가 예쁘게 띄워지는지 확인한다.

오늘 한 일

  • 애증의 리덕스도 몇 번 써보니 코드를 짜는 데엔 큰 어려움은 없는 것 같다. 다만 리듀서에서 데이터를 스테이트에 반영하는 부분이 좀 부족해 오류 발생이 잦다. 한가할 때 꼭 리덕스에 대해서 다시 공부해봐야겠다. 아니, 이게 아닌데. 오늘 한 일을 써야 하는데... 아주 그냥 의식의 흐름대로 쓰고 있다. 뷰를 잡을 때 단위가 작은 컴포넌트들부터 만들면서 시작하게 되면 처음에는 시간이 많이 걸린다는 단점이 있지만, 뒤로 갈수록 속도가 붙어 뚝딱뚝딱 조립하게 된다. 클론코딩이라 참고할 자료들이 있다는 특수성이 더해진 프로젝트이긴 하지만 말이다. 클론코딩의 장점은, 뷰를 잡고 나면 뿌듯함이 크다는 것이다. 누군가 피땀 흘려 디자인한 아이디어를, 코딩 연습이랍시고 내가 막 갖다 쓰는 게 아닌가 하는 생각도 든다. 아무튼 뷰는 세부적인 부분만 시간 날 때 조금씩 들여다보며 고쳐가면 될 것 같고, api 리스트 중 1, 2번째인 메인 페이지 전체 뉴스 목록 불러오기와 상세 페이지 개별 뉴스 내용 불러오기에 대한 코드를 짰다. 리덕스를 내가 붙이겠다고 하고 시작한 작업이었지만 axios까지 적고 나니 아차 나 혼자 너무 멀리 왔나 싶었다.

내일 할 일

  • 일요일이라 쉬는 날이지만, 마음이 무거워서 하루종일 쉴 수는 없을 것 같다. 아직 구현하지 않은 남은 api 리스트 두 항목도 코드를 완성해봐야겠다.
  • 다만 그 전에, 이번에는 나 혼자 가지 말고 꼭 천천히 함께 이해하며 넘어가자.

오늘 한 일

  • 대망의 클론코딩 주간이 밝았다. 미니 프로젝트 때도 너무나 짧게 느껴졌던 1주일이라는 시간 안에 어떻게 이걸 해내라는 건지는 여전히 의문이지만(그리고 심지어 이 모자란 내가 팀장만 4번째...), 아무튼 우리 조는 뉴닉을 클론코딩의 대상으로 정했다. 스코프는 나중에라도 늘릴 수 있기 때문에 일단은 좁게 잡아야 한다고 해서 메인 페이지에서 전체 기사 목록 보여주고, 카테고리별로 나눠서도 보여주고, 상세 페이지에서 기사 내용 보여주고, 검색창에서 키워드로 검색하면 검색 결과 보여주고... 로그인과 회원가입 기능은 빼고 이 정도만 구현해보는 걸로 결정했다.
  • 깃헙 저장소를 만들었는데 왜인지 로컬 저장소와 연결하는 처음부터 난리난리가 나서 결국 밀어버리고 다시 시작했다. 프로젝트 극초반이라면 사람과 마찬가지로 저장소도 고쳐 쓰지는 말자. 이미 만들어둔 저장소에 미련이 남아 밀어버리기로 결정하기까지 시간이 다소 소요되었지만 밀고 나니 작업의 진행 속도가 붙었다.
  • 아무리 클론코딩할 사이트를 개발자 도구로 뜯어본다고 해도 최대한 비슷하게 구현하는 것은 추가적인 노력이 필요한 것 같다. 최선을 다해 따라하는데 어째 그 모양새가 안 나온다. 그래도 오늘, 그렇게나 멀게만 느껴졌던 반응형 페이지 설정하는 방법을 우연한 기회에 알게 되어 조금 더 완성도가 높은 뷰를 제작할 수 있게 되었다. 원래 쓰던 모듈에서 뭘 더 추가적으로 설치할 필요 없이! 이것만 해도 이번 주간의 충분히 큰 수확이다. (*/ω\*) ~ ♬

내일 할 일

  • 메인 페이지 뷰의 부족한 부분을 마저 채우고 나머지 페이지들의 뷰 잡는 작업도 시작한다. 기초 단위 컴포넌트들을 오늘 거의 만들어 놓아서 메인 페이지만큼 시간이 많이 걸릴 것 같지는 않다.
  • 서버단에서 임시로 쓸 수 있는 api를 넘겨 주시면 연결을 해본다. (어쩌면 임시가 아닐 수도 있다)

+ Recent posts