1일차
-
github에 이런 저런 설정을 해뒀습니다.
- 위키 페이지를 작성했습니다.
- 커밋할 때 게으르게 스니펫을 활용할 것입니다.
- 브랜치명도 스니펫을 남겼습니다.
- 위키 페이지를 작성했습니다.
-
다행이 직접 구현과 관련없는 라이브러리는 사용할 수 있었습니다.
- Jest & RTL을 활용할 수 있을 것으로 보입니다.
- MSW를 추가로 설치해도 불이익이 없을 것 같습니다.
- 저는 저의 코드에 불신하는 훌륭한 개발자가 되기 위해 필요했습니다.
-
tailwind CSS 를 설치할 것입니다.
- 스타일링을 유지보수할 생각이 없습니다.
처음에는 처음에는 ContextAPI로 작업할 것입니다. 나중에는 Jotai 라이브러리를 직접 구현하는 튜토리얼을 활용해서 만들고 리팩토링을 진행할 것입니다. 리이브러리를 활용하지
Jotai를 DIY로 만드는 튜토리얼이 있었습니다. 라이브러리 설치가 아닌 구현으로 우회하는 것이기 때문에 창의적인 문제 해결이라 생각 됩니다. 물론 저의 추측에 불과합니다.
물론 contextAPI로 전역상태관리도 생각하고 있습니다.
git 히스토리도 잘 체크할 것 같습니다. 일단은 git-flow 전략을 활용할 것입니다.
404 페이지도 제공해야 하기 때문에 실제 제출은 1.0.0 이상이 될 것이라 예상합니다.
2일차
Router 컴포넌트로 라우팅 관심사 분리
- 페이지별로 컴포넌트를 옮겼습니다.
// App.tsx
import { MouseEvent } from 'react';
/**
* @todo 1. 라우트 컴포넌트로 관심사 분리하기
* @todo 2. 버튼 컴포넌트 분리
* @todo 3. 환경변수 설정으로 개발환경, 배포환경 origin 분리하기
*/
function App() {
const handleSignUp = (e: MouseEvent<HTMLButtonElement>) => {
e.preventDefault();
window.location.href = '/signup';
};
const handleSignIn = (e: MouseEvent<HTMLButtonElement>) => {
e.preventDefault();
window.location.href = '/signin';
};
switch (window.location.href) {
case 'http://localhost:3000/signin':
return <div>signin</div>;
case 'http://localhost:3000/signup':
return <div>signup</div>;
case 'http://localhost:3000/':
return (
<div className="flex h-screen items-center justify-center gap-4">
<button
className="box-border flex w-40 border-collapse justify-center self-center rounded border border-green-500 bg-white py-2 text-green-500"
onClick={(e) => handleSignUp(e)}
>
회원가입
</button>
<button
className="w-40 rounded bg-green-500 px-4 py-2 text-white"
onClick={handleSignIn}
>
로그인
</button>
</div>
);
default:
return <div>404page</div>;
}
}
export default App;
하드 코딩되어 있는 http://localhost:3000
이 문제였습니다. 배포하게 되면 origin이 바뀌는데 생각을 너무 짧게 하고 있었습니다.
// Router.tsx
import { Main, NotFound, Signin, Signup } from '../pages';
/**
* @todo 1. 레이아웃을 위한 컴포넌트를 추가합니다. Nav, Header, Footer
*/
function Router() {
switch (window.location.href) {
case window.origin + '/signin':
return <Signin />;
case window.origin + '/signup':
return <Signup />;
case window.origin + '/':
return <Main />;
default:
return <NotFound />;
}
}
export default Router;
import Router from './router/Router';
function App() {
return <Router />;
}
export default App;
- 앱은 이제
<Router/>
컴포넌트만 호출합니다.
이메일과 비밀번호 유 효성 검증
- 이메일과 비밀번호의 유효성을 검증하는 함수와 테스트코드를 작성했습니다.
- 이부분은 테스트부터 작성하기 쉬웠을 것 같습니다.
import checkEmail from './checkEmail';
describe('checkEmail', () => {
it("@가 없으면 '이메일에 @이 포함되어야 합니다.'라는 실패 이유를 문자열을 반환합니다.", () => {
const failEmail = 'useremail.com';
expect(checkEmail(failEmail)).toBe('이메일에 @이 포함되어야 합니다.');
});
it("@를 포함하면 ''처럼 비어있는 문자열을 반환합니다.", () => {
const successEmail = 'user@email.com';
expect(checkEmail(successEmail)).toBe('');
});
});
import checkPassword from './checkPassword';
describe('checkPassword', () => {
it("8자리 미만이면 '비밀번호는 8자리 이상이어야 합니다.'라는 실패 이유를 문자열로 반환합니다.", () => {
const failPassword = '1234567';
expect(checkPassword(failPassword)).toBe(
'비밀번호는 8자리 이상이어야 합니다.'
);
});
it("8자리 이상이면 ''처럼 비어있는 문자열로 반환합니다.", () => {
const successPassword = '12345678';
expect(checkPassword(successPassword)).toBe('');
});
});
- 과제의 요구사항도 단순했습니다. 단순한 만큼 기초적인 확장성을 고민할 수 있는 사람이었는지 측정하고 싶어했을 것 같습니다.
/**
* @param {string} str email인지 검증할 문자열을 대입합니다.
* @returns {string} 실패하는 이유를 설명하는 문자열을 반환합니다.
* switch 문으로 작성하면 검증 조건추가를 확장하기 쉽습니다.
*/
function checkEmail(str: string) {
const regexEmail = /@/;
switch (false) {
case regexEmail.test(str):
return '이메일에 @이 포함되어야 합니다.';
default:
return '';
}
}
export default checkEmail;
/**
* @param {string} str password인지 검증할 문자열을 대입합니다.
* @returns {string} 실패하는 이유를 설명하는 문자열을 반환합니다.
* switch 문으로 작성하면 검증 조건추가를 확장하기 쉽습니다.
*/
function checkPassword(str: string) {
const regexPassword = /^.{8,}$/;
switch (false) {
case regexPassword.test(str):
return '비밀번호는 8자리 이상이어야 합니다.';
default:
return '';
}
}
export default checkPassword;
- Switch statement for string matching in JavaScript에서 문자열 유효성 검증을 Switch-Case 문으로 작성하는 방법을 알려줍니다. 조건 확장성에 맞게 코드를 작성할 수 있었습니다.
횡단 관심사
- 횡단 관심사라는 용어를 알게되었습니다.
횡단 관심사(Cross-cutting concern)는 핵심 관심에 영향을 주는 프로그램의 영역
- 고차컴포넌트를 찾아보는 과정에서 발견했습니다.
- 하지만 가치를 아직 모르겠습니다. 그만큼 지식이 부족합니다.