인스타그램 클론 코딩 프로젝트 후기 feat westagram
오늘에서야 마무리 된 인스타그램 클론코딩 프로젝트,,
약 3주간 다른 버전의 미션이 계속 주어졌는데 그 간의 프로젝트 과정들, 배운 점들을 잘 기록해보고자 한다-!
약 3주간 다른 버전으로 진행된 프로젝트 🧑🏫
- 1차 클론 :
HTML, CSS, JavaScript
를 활용한 인스타그램 클론코딩 (개인, 3월 7일 ~ 3월 13일)- 2차 클론 :
React, SCSS, Fetch API
를 활용한 인스타그램 클론코딩 (개인, 3월 14일 ~ 3월 24일)- 4명씩 팀을 구성하여 공통 component인 nav를 만들고 파일을 merge하고 git conflict 해결하기 + git 공동작업에 익숙해지기 (4명 공동 작업, 3월 14일 ~ 3월 24일)
- Peer Review + Live Code Review (4명 작업, 3월 23일, 24일)
🧚♀️구현 기능 - HTML, Vanilla JS
[Mission1] 로그인 페이지 레이아웃
[Mission2] id, pw 입력 시 로그인 버튼 활성화 기능
[Mission3] 메인 페이지 레이아웃
[Mission4] 댓글 내용 입력 후 Enter press, 혹은 게시 버튼 클릭 시 댓글 추가 기능
[Mission5] ID, PW validation
[Mission6] 댓글 좋아요 / 삭제 기능
[Mission7] 아이디 검색 기능
[Mission8] nav 프로필 사진 클릭 시 메뉴 박스 생성
[Mission9] 반응형 구현
[추가 기능] user 정보 local storage에 저장 및 로그아웃 기능
🧚♀️구현 기능 - ReactJS
[Mission 1] Login | 사용자 입력 데이터 저장 기능 구현
[Mission 2] Login | 로그인 버튼 활성화 기능 구현
[Mission 3] Main | 댓글 기능 구현
[Mission 4] Main | 댓글 컴포넌트화, props로 데이터 전달 구현
[Mission 5] Main | Mock data를 map을 활용하여 댓글 화면에 렌더링 기능 구현
[Mission 6] Main | Mock data를 map을 활용하여 피드 렌더링 기능 구현
[추가 기능] Main | 댓글 삭제, 좋아요 기능 구현
[추가 기능] Nav | nav 검색창 유저 검색 기능 구현
[추가 기능] Nav | 프로필 아이콘 클릭 시 프로필 메뉴 보이기 기능 구현
프로젝트 후기
🦋 HTML, Vanilla JS => React
✔️ 프로젝트 과정 중 가장 긴장했던 순간,,,! React를 처음으로 배워보고 바로 실전으로 응용을 해본다는 것 자체가 굉장히 두려우면서도 동시에 설렜다. React를 사용하면서 가장 좋았던 점은 Component로 관리가 가능하다는 점이었다. Javascript를 이용할 때는 코드 한 페이지 전체에 모든 기능 구현을 적었었는데, React에서는 page별로, 기능별로 component를 나눔으로써 가독성도 더 좋아짐을 느꼈고, 훨씬 깔끔하게 관리할 수 있었다.
✔️ React를 처음 배울 때는 이것저것 새로운 개념들을 한꺼번에 많이 듣느라고 당황하고 헤맸었지만 기본 개념을 계속 반복하면서 바로 배운 것들을 실전에 응용해보면서 금방 익숙해질 수 있었다.
✔️ React를 사용하며 또 편리하다고 느꼈던 점이 state를 저장할 수 있다는 것이었다. 상태 값이 변화할 때마다 화면 ui가 자동으로 리렌더링이 되서 따로 ui를 담당해줄 함수를 만들어주지 않아도 된다는 점이 굉장히 편했다.
✔️ 다만 주의해야할 점이 최적화 부분이었다. state를 남용할 경우 불필요하게 리렌더링이 되고 함수를 계속 실행시키게 되기 때문에 불필요한 작동이 많이 일어난다.
✔️ 아! 그리고 또 인상깊었던 점 중 하나가 input값을 사용자가 입력하고 나서 input을 clear해줄 때,
setCount('')
이런 식으로 지정해주어야 한다는 것이었다.
🦋 CSS => SCSS
늘상 css만 사용하다 처음으로 scss를 이용해보았다. css에서 scss로 바꾸는 작업은 생각보다 큰 틀을 벗어나지는 않았다. 네스팅과 변수할당방식이 조금 다르다는 점을 제외하고는 비슷했다.
구조별로 네스팅해주는 방식.
네스팅 해주는 방식을 통해 HTML구조를 쉽게 파악할 수 있어 scss를 보는 게 더 편했다.
위는 변수들만 모아서 만든 파일이다.
기존의 css에서는 변수를 만들때 --border--color
이런식으로 네이밍을 했는데 scss에서는 $와 함께 변수표현을 하여 훨씬 간편하다는 느낌을 받았다.
@mixin은 다음 프로젝트 때 꼭 자주 써보고 싶다!
git 협업 및 git conflict 해결 과정
✔️ 공통 컴포넌트(nav)를 팀원들과 공유해서 쓰고 각자의 branch에서 위스타그램 프로젝트 계속해서 git을 통해 작업해주었다.
✔️ 수정된 master 땡겨받고 내 branch에서 다시 파일 merge 할 때 뜬 화면인데 순간 이게뭐야 놀라서 캡쳐했던 화면 ^^
알고 보니 내가 merge하기 전 기존의 Nav.js를 삭제했었어서 새로 추가되었다고 말해주는 내용이었는데 나는 무슨 오류난건가 하고 식은땀 엄청 흘렸다,, ㅋㅋㅋㅋ git conflict가 떠도 차분히 할 수 있을 줄 알았는데 이상하게 빨간 색 글자같은게 화면에 조금만 떠도 순간 겁을 먹게 된다. 하지만 그럴 때일수록 침!착!하게 차분히 해결해나갈 것!!
✔️ 혼자서만 쭉 위스타그램 프로젝트를 해보다가 처음으로 협업 프로젝트를 진행해보니 설레면서도 긴장되었다. 협업 시 git에서 어떤 순서대로 흐름이 흘러가는지, 흐름에 맞는 적절한 명령어는 무엇인지 감이 잡혔고, 조금 더 git 명령어, git을 사용하는 법에 익숙해졌다. (!) 너무 뿌듯해
✔️ 그리고 이번에 제대로 배운 git commit! 새로운 기능을 하나 추가하거나 수정하거나, 오류를 수정하거나 할 때마다 commit 꼭해주고 제대로 commit한 기록을 남기기 위해 깔끔하게, 작업별로 잘 분리해서 적어줄 것! 이렇게 정리해서 commit을 해주니까 merge한 후 git conflict 났을 때도 정확히 어떤 부분에서 오류가 났는지 파악하기가 쉬웠다. 깔끔한 정리와 기록은 개발 분야에서 정!말! 중요하다는 걸 배웠다. 꼭 commit 잊지말고 해주기!
Peer Review & Live code Review
보니그니님께 Peer Review 남겨드리긔긔
✔️ 모든 위스타그램 프로젝트 진행이 끝난 후 github에서 팀원들 간 코드를 리뷰해주는 시간을 가졌다. 내 코드만 보다가 다른 사람들의 코드를 보면서 '아 이럴 때 이렇게 다르게 코드를 짤 수도 있구나' '아 이럴 때 이렇게 하면 좋겠다' 등의 아이디어 등을 얻을 수 있어 정말 좋았다. 그리고 내가 코드를 '읽는 사람'의 시점에서 코드를 분석해보면서 '가독성이 좋고 깔끔한 코드'를 짜는 것은 정말 중요하다는 것을 느꼈다. 개발자로서 코드를 짤 때면 내 코드를 읽히는 경우가 괴애애앵장히 많기 때문! 최대한 친절하고 깔끔한 코드를 적어내는 개발자가 될테야 ⭐️
✔️ 그리고 멘토님으로부터 Live code Review또한 실시간으로 받을 수 있었다.
기억에 남았던 새로 알게 된 점 몇가지 적어보자면,
👉 관심사에 따라서 관련있는 state들은 하나로 합쳐서 객체의 형태로 만들어주는 것이 좋다! ex) const [state, setState] = useState({id : "", password : ""})
👉 코드를 적을 때 중간중간 문맥에 따라 공백 잘 만들어주기 (너무 다 붙혀쓰면 보기 좋지 않음)
👉 삼항연산자 불필요하게 쓰지 않기. 특히 결과값이 true or false로 나뉘는 경우는 그 조건 자체를 set함수 안에 넣어주면 된다. ex) const isValid = email.includes('@')&& password.length>4 ; setIsActive(isValid)
👉 Data type 으로 끝나는 변수명은 좋지 않다 ex) Array, Object, Data String suffix
👉 바로 return할 경우 {} 생략해주기 ex) const doSometing = () => doSomething
👉 State 관련하여)
▪️ Props로 받은 건 props로 쓰자 state에 넣어주지 말자
▪️ state가 변하는 값일 때만 state로 해주자 (상수 데이터로 해주기) nav- 받아온 값
▪️ 컴포넌트 안의 다른 state나 props를 가지고 계산 가능하면 state 아님 ex) 불리언값
ex) const isActive = email.includes(@)&& password.length > 4
👍 (isActive를 state로 만들기 대신에)
👉 되도록 함수형 state 써주기. 더 안전한 방식 (최신의 값을 보장해준다.)
ex) setState(cur => ({comment, ...cur}))
👉 상대경로보다는 절대 경로로 적어주자 => 절대경로가 변경사항 생겼을 때 훨씬 편하고 읽기에도 이해하기 쉬움
기억하고 또 기억하자,,,,, 나의 코드만 보는게 아니라 함께하는 팀원들의 코드도 함께 보면서 어떤 코드가 더 좋은 코드일지 어떻게 더 잘 할 수 있을지 이야기해보는 시간이었는데 배워가는게 참 유익했던 시간❤️
뿌듯했던 점 feat 리액트로 검색창 기능 만들기
추가로 진행해봤던 구현기능중 가장 뿌듯했던게 리액트를 활용하여 user검색창 기능을 만들었던 것!
간단한 로직은 다음과 같다.
- Public - data 폴더 - usersData.json에 검색가능한 user 정보들 기입
- fetch를 이용해서 user 정보 nav component에 전달 받기
- 전달받은 정보 users state내에 저장 및 검색되는 users, 입력값 또한 state 내에 저장해준다.
- 전달받은 검색되는 users들을 검색창 내에 map 함수를 이용하여 렌더링 해준다.
코드는 아래와 같다.
const Nav = () => {
const [state, setState] = useState({
users: [],
term: '',
});
const { users, term } = state;
let isSearchValid = term.length > 0;
useEffect(() => {
fetch('/data/usersData.json')
.then(res => res.json())
.then(data => setState(state => ({ ...state, users: data })));
}, []);
const handleState = e => {
const { value, name } = e.target;
setState(cur => ({
...cur,
[name]: valuㄷ,
}));
};
// filtered : filtered array - search user's id
const filtered = ()=>{
return users.filter(user => user.id.includes(term));
}
return (
<div className="Nav">
// 관련없는 코드들 생략함
<form className="nav-form">
<input
name="term"
value={term}
className="nav-input"
type="text"
placeholder="검색"
onChange={handleState}
/>
<i
className={isSearchValid ? 'fas fa-search activate' : 'fas fa-search'}
/>
<ul className="users search-info">
{filtered().map((user, i) => {
const { img, id, name } = user;
return (
<li key={i} className="user">
<img className="profile" src={img} alt="profile" />
<div className="user-info">
<strong>{id}</strong>
<p>{name}</p>
</div>
</li>
);
})}
</ul>
</form>
// 관련없는 코드 생략
</div>
);
};
export default Nav;
검색창은 이상없이 잘 작동한다 ㅎ.ㅎ 뿌듯해!
🍯 마무리
작다면 작은, 그렇지만 위코드에서의 처음이었기에 의미있었던 인스타그램 클론 코딩 프로젝트! html 레이아웃에서부터 git 명령어 적어보고 git으로 commit해보는 과정, 리액트 언어써보는 것들 등 개발자로서 얻어간 게 정말 많았던 프로젝트다. 특히 스스로 로직을 짜고 그 로직 순서대로 코드를 짜며 문제를 해결해나가는 과정을 통해 '아 개발자의 길로 정말 가길 잘했다'는 생각을 했다. 문제를 해결해나가는 과정이 너무 재밌고 더 잘하고 싶고 어떻게 하면 더 좋은 코드를 짤 수 있을까 계속 고민해보게 된다. 이 과정에 몰입하는 그 순간들이 소중하고 다음 프로젝트도 너무 기대된다. 하루하루 조금씩 나의 실력이 상승해나가고 있다는 믿음을 갖고 앞으로 하루에 충실하며 열심히 코딩하자 -👊🏻
Author And Source
이 문제에 관하여(인스타그램 클론 코딩 프로젝트 후기 feat westagram), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hoje15v/인스타그램-클론-코딩-프로젝트-후기-feat-westagram저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)