팀 멤버
(프론트 엔드)
- 김수미, 이기태, 홍태훈
(백엔드)
- 김승태, 최원식
1. 프로젝트를 계속하기 위한 웹 서비스
- 10곳 중 4곳을 선정하여 최종 선정한 결과 Dr. Martin은 전자 상거래 사이트라고 합니다.
2. 프로젝트를 진행하면서 담당했던 페이지
- 로그인/등록 페이지
- 구현된 기능: 유효성 검사, 토큰 저장, 로그인 후 로그인 페이지로 전환
- 제품 세부 정보 페이지
- 구현 기능 : 백엔드에서 받은 데이터로 UI 생성, 신발 사이즈 선택, 장바구니 모달창 생성 및 구매 클릭, 좋아요 버튼, 스크롤 버튼, 상품 수량 버튼, 댓글
3. 새로운 기능
- 상태를 많이 사용한다면 객체로 만들어서 사용할 수 있습니다.
const (name,setName) = useState('')
const (email,setEmail) = useState('')
const (pw,setPw) = useState('')
const (pwCorrect,setPwCorrect) = useState('')
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
const (inputValues, setInputValues) = useState({
name: '',
email: '',
pw: '',
pwCorrect: '',
});
☞☞ 상태값의 변화를 감지하기 위해서는 객체 자체의 값이 변화해야 하며, 이 경우 확산 구문을 사용해야 합니다.
- CSS를 사용할 때도 중요도와 관련성에 기반한 규칙이 있습니다.
- (CSS 속성 순서)
- 레이아웃 속성(position, float, clear, display)
- 박스 모델 속성(너비, 높이, 테두리, 패딩)
- 시각적 속성(색상, 배경, 프레임, 그림자)
- 타이포그래피 속성(글꼴 크기, 글꼴 모음, 텍스트 정렬, 텍스트 변환)
- 다양한 속성(커서, 오버플로우, Z-인덱스)
- (CSS 속성 순서)
- 개체의 속성 값을 변수에 할당할 때 변수 이름만 약칭 속성 이름으로 쓸 수 있음
body: JSON.stringify({
email: email,
password: pw,
}),
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
body: JSON.stringify({
email,
password: pw,
}),
4. 좋은 부분과 나쁜 부분
- ‘어떻게 하면 코드를 더 간결하게 만들 수 있을까?’
- 회원가입 페이지와 로그인 페이지에서 반복되는 사용자 인터페이스를 제시하며, 먼저 두 개의 컴포넌트로 분리하여 사용하였다.
- 이 부분을 컴포넌트 내부에 어떻게 그릴지 고민하다가 위치와 삼항 연산자를 이용하여 조건이 맞을 때 로그인 UI를 보여주고, 그렇지 않을 때 로그인 UI를 보여주는 코드를 만들어 보았습니다.
- 회원가입 페이지와 로그인 페이지에서 반복되는 사용자 인터페이스를 제시하며, 먼저 두 개의 컴포넌트로 분리하여 사용하였다.
아래는 이 코드입니다.
const location = useLocation();
const currentPage = location.pathname === '/login' ? LOGIN_DATA : SIGNUP_DATA;
return (
<>
<form className="account">
<strong className="title">
{location.pathname === '/login' ? '로그인' : '회원가입'}
</strong>
{currentPage.map(({ id, title, type, name, placeholder }) => {
return (
<div className="input_box" key={id}>
<label className={`input_${conditions(name) ? 'title' : 'warn'}`}>
{title}
</label>
<input
name={name}
className="input"
type={type}
autoComplete={name.includes('pw') ? 'off' : undefined}
onChange={handleInput}
value={inputValues(name)}
placeholder={placeholder}
/>
</div>
);
})}
<button onClick={submit} type="submit" className="account_button">
{location.pathname === '/login' ? '로그인' : '회원가입'}
</button>
</form>
<strong>
{location.pathname === '/login' && (
<Link className="sign_up" to="/signup">
회원가입
</Link>
)}
</strong>
</>
);
- 항상 최신 진행 상황을 팀원들과 공유했습니다.
- 이 부분은 저의 진행 상황과 팀원들의 진행 상황, 어떤 막힘이 있었는지 이해하는데 도움이 되었습니다.
이를 통해 상호간의 막힘을 해결하는 데 도움이 되었고 팀 프로젝트의 중요성을 다시 한 번 일깨워 주었습니다.
- 이 부분은 저의 진행 상황과 팀원들의 진행 상황, 어떤 막힘이 있었는지 이해하는데 도움이 되었습니다.
- 기획 부분에서는 그냥 박사님만 하자고 생각했어요. 클론 마틴.
- 클론코딩을 하는 줄 알고 그냥 박사님의 특징을 따라했습니다.
담비 - 더 다양한 기술을 구현할 수 없다는 점은 아쉽다.
- 클론코딩을 하는 줄 알고 그냥 박사님의 특징을 따라했습니다.
5. 향후 계획
- 프로젝트를 진행하면서 따로 만들지 않은 페이지를 만들고, 웹사이트 제작에 필요한 요소들을 적용하는 방법을 탐구했습니다.
- 메인 페이지의 캐러셀, 검색 기능
- 상품 목록 페이지 필터링, 페이지 매김 기능
- 장바구니 페이지에서 선택삭제 및 전체삭제 기능
- 두 번째 프로젝트에서는 웹사이트를 복제할 생각 없이 최종 사용자가 계획하는 순간부터 사용할 웹사이트를 만든다는 생각으로 참여하겠습니다.