프리온보딩 코스 시작 이후 가장 규모가 큰 과제였다. 4일 동안 5명의 팀원이 '애자일하게' 협동하여 구현 요구 사항을 충족하는 것이 목표.
애자일 소프트웨어 개발 방법론의 핵심은 작동하는 소프트웨어의 작은 구성 요소를 신속하게 제공하여 고객의 만족도를 개선하는 것입니다. (출처 Red Hat)
애자일 방법론의 적용을 위해,
프리온보딩 사전 과제 때도 모달 컴포넌트를 만들긴 했는데, LoginModal, SearchModal 이런 식으로 필요한 곳마다 새로 만들었었다... 😅 이번에는 다른 팀원도 갖다 쓸 수 있도록, props에 children이나 style 요소를 전달하도록 만들어 보았다. 그런데 이 모달을 사용할 때마다 열고 닫는 기능을 위해 부모 컴포넌트에 state를 설정해야 했다. 팀원 분이 useModal이라는 hook를 작성하는 아이디어를 내서 문제를 해결했다. "custom hook는 보통 기능과 화면 구성의 분리를 위해 작성한다"는 멘트와 함께... 오우 멋있다...
React에서 stateful DOM components를 다루는 두 가지 방식이 있다.
// Controlled:
<input type="text" value={value} onChange={handleChange} />
input value가 submit하는 시점에만 필요하거나 validate되어도 무방하다면 Uncontrolled component로도 가능은 하지만, Controlled component를 추천한다고.
....??? 으아니 value는 전달 안하고 onChange만 전달했는데 내 코드 어떻게 돌아간 것인가...? 빨리 코드 고치러 가야겠다. 😱 여러분 회고가 이렇게 중요합니다...
그리고 처음에는 input들을 감싸는 form 태그를 사용했다가 브라우저 기본 validation 디자인을 사용하지 않으려고(...그리고 아래에 언급할, 다음 주소검색 창을 띄우다가 뜬 오류를 해결하려고) 모두 제거했는데, 시멘틱 마크업을 준수하는 것이 좋다!
브라우저에서 기본으로 제공하는 디자인이 아니라 자체 디자인으로 값 유효성 검사 결과를 보여줘야 한다고 form 태그를 버리면 안 된다.
프론트엔드 개발자로서 늘 쓰임새에 맞는 태그를 사용하여 시멘틱(semantic) 마크업을 준수해야 브라우저에서 웹 페이지를 정확히 분석할 수 있다.
요구명세서에 '회원가입 정보 중 주소는 다음 우편번호 api를 사용하여 입력받아도 무방하다'는 내용이 있어서, 회원가입 페이지 담당인 내가 이 부분도 하게 되었다.
다음 우편번호 서비스 가이드 문서를 읽으며 '리액트 다음 우편번호 api'를 검색해보았는데, 죄다 react-daum-postcode를 사용했다는 정보 뿐이었다.
굳이 라이브러리를 쓸 이유가 없을 것 같아서 npm 사이트에 들어가서 해당 라이브러리 소스 코드를 열어보았다. 오..? 생각보다 간단하잖아....?! 라이브러리를 소스 코드를 보니 리액트에서 사용하는 방식을 알 수 있어서 내 필요에 맞게 코드를 작성할 수 있었다. 라이브러리를 열어보고 필요한 부분만 습득하는 경험이 나름 뿌듯.
근데 멀쩡히 잘 돌아가던 코드가 회원가입 페이지 컴포넌트 안에 들어가니, 창에 입력한 내용이 넘어가지 않는 문제가 발생했다. 보아하니, 문제가 일어나는 시점에 url 끝에 '?'이 붙는다...? 🤔 아... 이런. form 태그 안에 다음 api 호출하는 컴포넌트가 들어가 있어서 선택 버튼이 눌리는 순간 submit이 된 것이었다. 해결방법으로, button type을 "button"으로 만들고 form 태그를 모두 없애버렸다...ㅋㅋㅋ (단-순) 이제 와서 보니 에러를 고치고 돌아가게는 만들었지만, controlled component나 form에 대해 제대로 이해하지 못한 채였구나. 리팩토링이 필요하다..!!!
오늘의 교훈: 회고는 중요하다