
const lifeFriends = ["유리님", "가람님", "세용님", "영건님", "승호님"]
console.log( `${lifeFriends} 여러분들과 함께해서 즐거웠으며 행복한 2주였습니다. 팀 이름처럼 평생친구로 함께 하길~.` )
- 배운 기본기 및 react state, props 익숙해지기!
- 재활용 가능한 componet 활용하기
- 팀원간 커뮤니케이션 능력 향상시키기 (Front & Front , Front & Back )
유림님:
메인 페이지,상세 페이지 리뷰
세용님:카테고리 페이지,상세페이지 제품 상세설명
가람님:로그인 페이지,회원가입 페이지,제품 상세페이지 제품 결제 및 제품 장바구니
나:Nav Bar,footer,제품 상세페이지 제품 사진 미리보기
- Front-End : HTML,CSS, JavaScript (ES6+) React.js / Sass,
- Back-End : Python, Django,My SQL
- Common: Slack, Trello, GIT, GitHub (프론트엔드 github/백엔드 github)





CRA 초기 세팅 (팀원 다 같이)Nav bar 포함한 Header, Footermap 함수 및 backend와 통신하여 카테고리 메뉴 기능 구현localStorage) token 사용하여 backend에서 로그인 정보(이름, 이메일) 받아 상태표시 기능 구현query String을 이용한 카테고리 메뉴와 상품 리스트 페이지 Routingfetch를 사용한 제품 리스트, 카테고리 메뉴, 제품 Previw API 호출, 응답데이터 화면 구현





foundation기간에 검색기능에 대해 시도해보았으나 실제 프로젝트에 적용하면서 더 익숙해지는 계기가 될 수 있었다. 코드는 아래와 같이 작성 하였다.
handleSearchValue 함수 선언하여 input에 입력되는 값을 state값으로 변경 handleSearchValue = e => {
this.setState({
searchValue: e.target.value,
});
};
render 이후에 filter ,include,toLowerCase 메서드를 활용하여 검색필터사용 하였다. render() {
const filteredList =
this.state.categoryListData &&
this.state.categoryListData.filter(category => {
return (
category.menuName
.toLowerCase()
.includes(this.state.searchValue.toLowerCase()) && category
);
});
const filterLength = filteredList && filteredList.length;
onChange 에 위에서 선언해준 this.handleSearchValue 를 실행시켜주고 map 을 활용하여 searchbox에 나열되도록 하였다. <div className="searchBox">
<input
className="search"
type="text"
placeholder="검색어를 입력해보세요"
onChange={this.handleSearchValue}
/>
<button className="searchButton">
<i className="fas fa-search"></i>
</button>
<ul
className={`searchListContainer ${
this.state.searchValue && filterLength && 'open'
}`}
>
{filterLength > 0 &&
filteredList.map(category => {
return (
<li key={category.menuId}>
<div>
<Link
to={`/categories?menu=${category.menuName}`}
className="categoryName"
>
{category.menuName}
</Link>
Nav bar 가 쉬울거 같다고 생각했다. 그런데 생각보다 nav에는 다양한 기능과 특히 메뉴 더 보기, 닫기 버튼과 메뉴 더 보여주기 기능 구현에 애를 먹었다. 구글링을 통하여 방법을 찾았고 해냈을때 1주차때 희열은 아직도 생생하다.
boolean값으로 초기값은 false로 지정export class CategoryList extends React.Component {
constructor(props) {
super(props);
this.state = {
itemsToShow: 10,
expanded: false,
};
}
showMore 함수 선언을 해준다. 여기서 삼항연산자를 사용하여 true 일때 false일때 값을 지정해준다. showMore = () => {
const { eachCategoryList } = this.props;
this.state.itemsToShow === 10
? this.setState({ itemsToShow: eachCategoryList.length, expanded: true })
: this.setState({ itemsToShow: 10, expanded: false });
};
onClick 시 showMore 함수 실행 해준다. 그리고 11번째 부터 카테고리 메뉴들을 보여주는 code 입력해준다 (slice, map 사용) <button
className="showMoreButton"
onClick={() => {
this.showMore();
}}
>
<span className="ShowMoreLess">
{this.state.expanded ? (
<span>
닫기<i className="fas fa-angle-up"></i>
</span>
) : (
<span>
더 보기<i className="fas fa-angle-down"></i>
</span>
)}
</span>
</button>
</div>
<div className="categoryListNextLine">
{eachCategoryList &&
eachCategoryList.slice(11, this.state.itemsToShow).map(menuObj => {
return (
<div key={menuObj.menuId} className="categoryMenuNextLine">
이번 프로젝트하면서 가장 기분 좋았던 순간은 바로 백에서 유저 정보를 받아왔을때였다. 로그인을 성공하면 localstorage에 토큰을 저장하고 이를 바탕으로 fetch 를 통하여 user name과 email 정보를 받아 왔다. 그리고 로그아웃버튼 클릭시 localStorage.clear(); 하여 로그아웃 기능 구현 하였다.
export class LoginAndLogout extends React.Component {
isAllInputValid = () => {
const tokenValue = localStorage.getItem('AUTHORIZATION');
// fetch('http://10.58.7.181:8000/users/user'
fetch(`${GET_AUTHORIZATION_API}`, {
method: 'GET',
headers: { AUTHORIZATION: tokenValue },
})
.then(res => res.json())
.then(res => {
if (res.message === 'SUCCESS') {
localStorage.setItem('user_name', res.user_info.user_name);
localStorage.setItem('user_email', res.user_info.user_email);
}
if (res.result === 'INVALID_USER') {
return alert('비밀번호 또는 이메일이 잘 못 되었습니다.');
}
});
};
changeLogout = () => {
localStorage.clear();
};
제품 사진 다음보기, 뒤로가기 버튼 구현, 작은 이미지 마우스 오버시 제품 미리보기 사진 변경 기능 구현
goToPreview , goToNext, changePicMouseOver 함수 선언하였다. changePicMouseOver 는 마찬가지로 마우스 오버가 되면 index 값을 조정하여 사진을 보여주었다. constructor() {
super();
this.state = {
imgIndex: 0,
};
}
goToPreview = e => {
const { imgIndex } = this.state;
const {
PreviewData: { images },
} = this.props;
const { className } = e.target;
const buttonName = className;
this.setState({
imgIndex:
buttonName === 'previousButton'
? imgIndex === images.length - 1
? 0
: imgIndex - 1
: imgIndex === 0
? images.length - 1
: imgIndex - 1,
});
};
goToNext = e => {
const { imgIndex } = this.state;
const {
PreviewData: { images },
} = this.props;
const { className } = e.target;
const buttonName = className;
this.setState({
imgIndex:
buttonName === 'nextButton'
? imgIndex === 0
? imgIndex + 1
: 0
: imgIndex === images.length - 1
? 0
: imgIndex + 1,
});
};
changePicMouseOver = (e, index) => {
this.setState({
imgIndex: index,
});
};
lifecycle 문제를 해결하면서 lifecycle 에 대한 이해를 한점git add . -> git commmit -> git push -> git pull -> git merge master 를 사용해서 하도록 노력 해야겠다. 
.jpg)



special Thanks 도현 맨토님 (저 자리 들어오면 못나감 질문공세로)
.jpg)
평생 친구, 위코드 절친 준현님! 1차 프로젝트 정말 고생 많으셨어요! 준현님과 함께해서 더 즐거웠던 것 같아요!!