- URL: https://hologram-pi.vercel.app/
- ํ
์คํธ ๊ณ์
- ID:
hologram-test@hologram.com
- Password:
hologram1234
- ID:
- Hologram์ ํผ์ ์ฌ๋ ์ฌ๋๋ค์ ์ผ์ ๊ณต์ , ์์ ๋ง์ ํ, ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ ์ฐฌ๋ฐํฌํ ๋ฑ ๋ค์ํ ์ปค๋ฎค๋ํฐ ํ๋์ ํ ์ ์๋ SNS์ ๋๋ค.
- Hologram์ ์ฃผ์ ๊ธฐ๋ฅ
- ์ผ์ ๊ณต์ , ์์ ๋ง์ ํ, ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ ์ฐฌ๋ฐํฌํ ๋ฑ ๊ฒ์๊ธ์ ์์ฑํ์ฌ ์ ์ ๋ค ๊ฐ์ ์ํต์ ํ ์ ์์ต๋๋ค.
- ๋ง์์ ๋๋ ๊ฒ์๋ฌผ์ด ์๋ค๋ฉด ์๋๋ฐฉ์ ํ๋ก์ฐํ์ฌ ์์์ ๋ฐ๊ณ ๊ฒ์๊ธ์ ๋๊ธ์ ๋ฌ๊ณ '์ข์์'๋ฅผ ํ ์ ์์ต๋๋ค.
- ์ํ ํ๋งค๋ฅผ ํ ์ ์์ผ๋ฉฐ ํ๋งค์์ ์ํ์ ํ์ธํ๊ณ ์ฑํ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์ฃผ๋ค๋น | ์๊ฐํฌ | ๋จ์์ | ์ ํ์ฐ |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
๐ joodb | ๐ seokahi | ๐ Nam-Wijeong | ๐ GitHWS |
1. ๊ธฐ์
- FrontEnd: HTML, CSS, Vanilla JS
- BackEnd: ์ ๊ณต๋ API ์ฌ์ฉ
โ Vanilla JS๋ฅผ ์ฌ์ฉํ ์ด์
- ํ๋ก์ ํธ์์ ์ฃผ์ด์ง ๊ธฐ๊ฐ ๋ด ์์ฑํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ต์ฐ์ ๋ชฉํ์์ต๋๋ค. Vanilla JS๋ฅผ ์ฌ์ฉํด ๋น ๋ฅด๊ฒ ๊ตฌํํ์ฌ ๊ธฐ๋ฅ์ 99% ์์ฑํ์์ต๋๋ค.
- ๋ค๋ฅธ ์ด์ ๋ก๋ ๋ฆฌ๋น๋ฉ ๊ฒฝํ๋ ํด๋ณด๊ณ ์ถ์ด ์ถํ React๋ก ์งํํ ์์ ์ ๋๋ค.
2. ๊ฐ๋ฐํ๊ฒฝ
- ๋ธ๋์น ์ ๋ต: git-flow
- ์ด์ ๊ด๋ฆฌ: ๐github-Issues
- Prettier
- Coding Convention: โ๏ธ์ฝ๋ฉ ์ปจ๋ฒค์
- Conference: ๐ฌ ์งํํ ํ์๋ก
3. ์ ์ ๊ธฐ๊ฐ: 2022.6.29 ~ 2022.07.31
๊ณตํต UI
- ๋ค๋ธ๋ฐ: ํ์ ์ ๋ถ
- ํ๋จ ํญ ๋ฉ๋ด: ๋จ์์
- ์ ์ ๋ชฉ๋ก(ํ๋ก์, ํ๋ก์, ๊ฒ์ ๋ชฉ๋ก): ์ฃผ๋ค๋น
- ์ด๋ฏธ์ง ๋ฒํผ(ํ๋กํ, ๊ฒ์๊ธ, ์ํ): ์๊ฐํฌ
- ์ธํ(ํ์, ์ํ): ์ ํ์ฐ
- ๋ชจ๋ฌ: ๋จ์์
์ฃผ๋ค๋น
- ํ๋ก์ ํธ ๋ฆฌ๋
- ๋ง์ด ํ๋กํ, ์ ์ ํ๋กํ ํ์ด์ง ๊ตฌํ ๋ฐ ํ์ ์ ๋ณด ๋ ๋๋ง
- ํ๋ก์, ํ๋ก์ ๋ฆฌ์คํธ ๊ตฌํ ๋ฐ ๋ ๋๋ง
- ํ๋ก์ฐ ๊ธฐ๋ฅ
- ์ํ ๋ฑ๋ก, ์์ , ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ / ์ํ ๋ชจ๋ฌ
- ์ ๋ฐ์ ์ธ ํ๋ก์ ํธ UI ๋์์ธ
์๊ฐํฌ
- ๊ฒ์๊ธ ์์ฑ, ์์ , ์ญ์ , ์ ๊ณ ๊ธฐ๋ฅ ๊ตฌํ
- ๊ฒ์๊ธ ์์ธ ํ์ด์ง ๋ ๋๋ง
- ๋๊ธ ์์ฑ, ์ญ์ , ์ ๊ณ ๊ธฐ๋ฅ ๊ตฌํ
- ์ฑํ ๋ชฉ๋ก / ์ฑํ ๋ฐฉ UI ๊ตฌํ
- ๋ก๊ทธ์์
๋จ์์
- ํผ๋ ํ์ด์ง ๊ตฌํ ๋ฐ ํ๋ก์ ๊ฒ์๊ธ ๋ ๋๋ง
- ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํ
- ์ข์์ ๊ธฐ๋ฅ ๊ตฌํ
- ํ๋กํ ํ์ด์ง ๊ฒ์๊ธ ๋ ๋๋ง
์ ํ์ฐ
- splash
- ๋ก๊ทธ์ธ ์ ํจ์ฑ ๊ฒ์ฌ
- ํ์๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ, ๋น๋ฐ๋ฒํธ ํ์ธ ๊ธฐ๋ฅ ๊ตฌํ
- ํ๋กํ ์์ ๊ธฐ๋ฅ ๊ตฌํ
- ์ ๋ฐ์ ์ธ ํ๋ก์ ํธ UI ๋์์ธ
- ํ๋ก์ ํธ ๋ฐฐํฌ(Vercel)
- ์๋ฌ ํ์ด์ง ๊ตฌํ
0. Splash | 1. ํ์๊ฐ์ | 2. ๋ก๊ทธ์ธ |
---|---|---|
![]() |
![]() |
![]() |
3. ํ ํผ๋ | 4. ๊ณ์ ๊ฒ์ | 5. ๋ง์ด ํ๋กํ |
---|---|---|
![]() |
![]() |
![]() |
5-1. ๋ง์ด ํ๋กํ ์์ | 6. ์ํ ๋ฑ๋ก | 6-1. ์ํ ์์ , ์ญ์ |
---|---|---|
![]() |
![]() |
![]() |
6-2. ์ํ ์์ธ | 7. ๊ฒ์๊ธ ๋ฑ๋ก | 7-1. ๊ฒ์๊ธ ์์ , ์ญ์ |
---|---|---|
![]() |
![]() |
![]() |
8.ํ๋ก์, ํ๋ก์ ๋ฆฌ์คํธ | 9. ํ๋ก์ฐ ๊ธฐ๋ฅ | 10. ์ ์ ํ๋กํ |
---|---|---|
![]() |
![]() |
![]() |
11. ๋๊ธ ์์ฑ, ์ญ์ | 11-1. ๋๊ธ ์ ๊ณ | 12. ์ข์์, ์ฐฌ๋ฐํฌํ ๊ธฐ๋ฅ |
---|---|---|
![]() |
![]() |
![]() |
13. ๊ฒ์๊ธ ์ ๊ณ | 14. ์ฑํ ๋ชฉ๋ก UI, ๋ชจ๋ฌ | 15. ๋ก๊ทธ์์ |
---|---|---|
![]() |
![]() |
![]() |
16. ์๋ฌํ์ด์ง |
---|
![]() |
- assets/ : ์ด๋ฏธ์ง, ์์ด์ฝ ๋ฑ ์ด๋ฏธ์ง ์์ค๋ฅผ ์ ์ฅํ ๋๋ ํ ๋ฆฌ
- favicon/ : favicon์ ์ํ ๋๋ ํ ๋ฆฌ
- font/ : ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ font ์ ์ฉ
- images/ : ์น์์ ์ฌ์ฉ๋๋ icon, images ๋๋ ํ ๋ฆฌ
- css/ : pages์ html์ ์ฐ๊ฒฐ๋๋ CSS ๋๋ ํ ๋ฆฌ, default.css๋ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ CSS ํ์ผ์ importํ์ฌ ์ฌ์ฉ
- html/ : ๊ณตํต๋ UI๋ฅผ ์ํ html ๋๋ ํ ๋ฆฌ
- pages/ : ์๋น์ค์ฉ html ๋๋ ํ ๋ฆฌ
- js/ : pages์ html๊ณผ ์ฐ๊ฒฐ๋๋ JS ๋๋ ํ ๋ฆฌ. common.js๋ pages ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ํจ์๊ฐ ๋ฑ๋ก๋ ํ์ผ
๐ฃHologram
โโ๐assets
โ โโ๐favicon
โ โโ๐font
โ โโ๐images
โโ๐css
โโ๐html
โโ๐js
โโ๐pages
- ๐ ํต์ฌ๊ธฐ๋ฅ์ ๋ํ ์ค๋ช ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋งํฌ ์ฐ๊ฒฐํด๋์์ต๋๋ค.
- ์๋ฌ: ๋ค๋ฅธ ์ ์ ์ ํ๋ก์ฐ, ํ๋ก์ ๋ฆฌ์คํธ์์ ๋ก๊ทธ์ธํ ์ ์ (๋)๊ฐ ์์ ๊ฒฝ์ฐ ํ๋ก์ฐ ๋ฒํผ์ด ๋ณด์ธ๋ค.
- ํด๊ฒฐ ๋ฐฉ์: isfollow๊ฐ false(์ธํ๋ก์ฐ์ธ ์ํ) ์ผ ๋ ๊ทธ ๋ชฉ๋ก ์ค accountname์ด localStorage.getItem('accountname')์ ๊ฐ๋ค๋ฉด ๋ฒํผ์ ๋ณด์ฌ์ฃผ์ง ์๋๋ค.
/* ํ๋ก์ฐํ ์ํ ๊ตฌ๋ถ */
const userFollowBtn = document.createElement('button');
if (i.isfollow) {
userFollowBtn.setAttribute('class', 'user-follow-btn cancel');
userFollowBtn.setAttribute('id', 'user-follow-btn-cancel');
userFollowBtn.innerText = '์ทจ์';
} else {
if (i.accountname === localStorage.getItem('accountname')) {
userFollowBtn.style.display = 'none';
} else {
userFollowBtn.setAttribute('class', 'user-follow-btn');
userFollowBtn.setAttribute('id', 'user-follow-btn');
userFollowBtn.innerText = 'ํ๋ก์ฐ';
}
}
- ์๋ฌ: ์๋ฌ ๋ด์ฉ: ๋๊ธ ์์ฑ ์ ๋ก๊ทธ์ธํ ์ ์ ์ ํ๋กํ ์ด๋ฏธ์ง๊ฐ ๋ฐ๋์ง ์๋๋ค.
- ํด๊ฒฐ ๋ฐฉ์: ๋ก๊ทธ์ธํ ์ ์ ๋ฅผ ๋ถ๋ฌ์ค๋ ํจ์์์ ๋ฐ์์จ ์ ์ ์ ๋ณด์ ์ด๋ฏธ์ง๋ฅผ ํ๋กํ ์ด๋ฏธ์ง์ ๋ฃ์ด์ค๋ค.
async function handleMyInfo () {
const token = window.localStorage.getItem('token');
const accointMe = localStorage.getItem('accountname')
const requestMyInformation = {
method:"GET",
headers:{
"Authorization" : `Bearer ${token}`,
"Content-type" : "application/json"
}
}
const res = await fetch(url+`/profile/${accointMe}`, requestMyInformation)
.then((response)=> {return response;})
.catch((error) => {location.href="/pages/404.html";})
const json = await res.json();
console.log('๋ด ์ ๋ณด', json);
profileImg.src = json.profile.image;
}
- ์๋ฌ : ์จ๋ฒ ๋ทฐ์์ ์ด๋ฏธ์ง ํด๋ฆญ ์ ํด๋น ๊ฒ์๊ธ์ด ์๋ ๋ชจ๋ ๋์ผํ ํ๋์ ๊ฒ์๊ธ๋ก๋ง ์ด๋๋๋ค.
- ํด๊ฒฐ ๋ฐฉ์ : ํ์ด์ง ์ด๋ URL์ ํ์ํ ๋ฐ์ดํฐ ๊ฐ์ ์์ ํ์ฌ ํด๋ฆญ ์ ํด๋น๋๋ ๊ฒ์๊ธ๋ก ์ด๋ํ ์ ์๋ค.
postAlbumLink.addEventListener('click', () => {
location.href = `/pages/postcomment.html?postId=${value.id}`;
})
- ์์ ์
- ์์ ํ
- ์๋ฌ : ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ ๋ฌธ์ ๋ก ํ๋กํ ์์ ํ์ด์ง์์ ์ ์ฅ ๋ฒํผ์ ๋๋ ค ์์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๊ณ ๋ด ํ๋กํ ํ์ด์ง๋ก ์ด๋ํ๋ฉด ์๋ฌด๋ฐ ๋ฐ์ดํฐ ์์ด ์ ์ฉ์ด ๋์ง ์๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
- ํด๊ฒฐ ๋ฐฉ์ : ๋ฉํ ๋์ ํ์ ๋ฐ์ log๋ฅผ ์ฐ์ผ๋ฉฐ ์ฒ๋ฆฌ ์์ ํ์ ํด์ ์ฝ๋๋ฅผ ์์ ํ์ต๋๋ค.
async function editUserInfo() {
const url = 'https://mandarin.api.weniv.co.kr';
const token = localStorage.getItem('token');
try {
const res = await fetch(`${url}/user`, {
method: 'PUT',
headers: {
Authorization: `Bearer ${token}`,
'Content-type': 'application/json',
},
body: JSON.stringify({
user: {
username: editUsernameInput.value,
accountname: editAccountInput.value,
intro: editIntroInput.value,
image: hiddenImgSrc.value,
},
}),
});
console.log('๋ฐ์ดํฐ ์ฒ๋ฆฌ'); // 3
const resJson = await res.json();
console.log('ํ๋กํ ๊ฐฑ์ ์๋ฃ', resJson); // 4
} catch (err) {
console.error(err);
}
}
saveBtn.addEventListener('click', () => {
console.log('ํด๋ฆญ'); // 1
localStorage.setItem('accountname', editAccountInput.value);
console.log('ํ์ด์ง ์ด๋'); // 2
location.href = './profile.html';
editUserInfo();
});
์์ ์ ์ฝ๋์์๋ ํด๋ฆญ
ํ์ ํ์ด์ง ์ด๋
์ด ๋จผ์ ์ด๋ฃจ์ด์ง๊ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
ํ๋ฉฐ ํ๋กํ ๊ฐฑ์
์ด ์๋ฃ๋์ด ์๋ฌด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์์๋ค. ๊ทธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฉํ์ง ๋ชปํ ํ์ด์ง๊ฐ ์ถ๋ ฅ์ด ๋๊ณ ์์์ต๋๋ค.
๊ทธ๋์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ ๋ฌธ์ ๋ก ์ฝ๋์ ์์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ์์ต๋๋ค.
async function editUserInfo() {
const url = 'https://mandarin.api.weniv.co.kr';
const token = localStorage.getItem('token');
try {
const res = await fetch(`${url}/user`, {
method: 'PUT',
headers: {
Authorization: `Bearer ${token}`,
'Content-type': 'application/json',
},
body: JSON.stringify({
user: {
username: editUsernameInput.value,
accountname: editAccountInput.value,
intro: editIntroInput.value,
image: hiddenImgSrc.value,
},
}),
});
console.log("๋ฐ์ดํฐ ์ฒ๋ฆฌ"); // 2
const resJson = await res.json();
console.log('ํ๋กํ ๊ฐฑ์ ', resJson); // 3
localStorage.setItem('accountname', editAccountInput.value);
console.log('ํ์ด์ง ์ด๋'); // 4
location.href = './profile.html';
} catch (err) {
console.error(err);
}
}
saveBtn.addEventListener('click', () => {
console.log('ํด๋ฆญ'); // 1
editUserInfo();
});
์์ ํ ์ฝ๋์์๋ ํด๋ฆญ
ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
๋ฅผ ํ๊ณ ํ๋กํ ๊ฐฑ์
์ด ์ด๋ฃจ์ด์ง๊ณ ์๋ฃํ ํ ํ์ด์ง ์ด๋
์ด ๋ฉ๋๋ค.
- ํ๋ก์ ํธ ์์ ์ ์ฝ๋, ์ด์, PR, ์ปค๋ฐ ๋ฑ ์ปจ๋ฒค์
์ ์ค์
- ํ์ ๊ฐ์ ์งํ ๊ณผ์ ์ ์ํํ๊ณ ๋ช ํํ๊ฒ ๋ณด์ฌ์ค ์ ์์์ต๋๋ค.
- ๋ฌธ์ ์ํฉ์ ๋ถ๋ชํ์ ๋, ํผ์ ํด๊ฒฐํ๋ ๊ฒ๋ณด๋ค ํ์๋ค/๋ฉํ ๋ถ๋ค์๊ฒ ๋์ ์์ฒญ
- ํ์ ๊ฐ์ ์ ์ํ ํผ๋๋ฐฑ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒฝํ์ด ๋ง์์ต๋๋ค.
- ํ์๋ง๋ค ๊ฐ์ธ์ ์ผ๋ก ์งํ ๊ณผ์ ์ค ์ค์๊ฐ์ผ๋ก ๊ธฐ๋ฅ์ ํ ์คํธํด์ ๋ฐ๊ฒฌํ ์๋ฌ๋ฅผ ์ ์ํ๊ฒ ๊ณต์ ํ์ฌ ์์ ํ ์ ์์์ต๋๋ค.
- QA(Quality Assurance)์ ๋ํ ๊ณ ์ฐฐ
- ๊ณต๋ฐฑ, ๊ธ์ ์ ์ ํ์ ๋์ง ์์์ ๋ ์ด์์์ด ๋ณ๊ฒฝ๋๋ ๋ฑ์ ์ฌ์ฉ์ ๋ณ์๋ฅผ ๋ค์ ํ๋ฒ ์๊ฐํ ์ ์์์ต๋๋ค.
- ๋ฐฐํฌ ํ ํ ์คํฐ๋ฅผ ํตํด ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ๋ํด์ ํ ๋ฒ ๋ ๊ณ ๋ฏผํ ์ ์์์ต๋๋ค.
- ์์ํ API ๋ช
์ธ ์ฌ์ฉ
- ์ฒ์ ๋ค๋ค๋ณด๋ API ๋ช ์ธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ต์์ง ์์ ํ๋ก์ ํธ ์ด๋ฐ ์ด๋ ค์์ด ์์์ต๋๋ค.
- ๊นํ๋ก์ฐ ๋ธ๋์น ์ ๋ต์ผ๋ก ํ์
- ์ฒ์ ์งํํ๋ ํ ํ๋ก์ ํธ์์ ๊นํ๋ก์ฐ ๋ธ๋์น ์ ๋ต์ ์ฌ์ฉํ๋ฉฐ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค.
- ์ปค๋ฐ, ์ด์, PR ์ปจ๋ฒค์ ๋ง์ถ๊ธฐ, merge ์ถฉ๋ ๋ฑ์ ๋ฌธ์ ์ ์ด ์์์ต๋๋ค.
- ํ๋ก์ ํธ ์ญํ ๋ถ๋ด
- ํ๋ก์ ํธ ์ด๋ฐ ๊ณ ๋ฅด์ง ๋ชปํ ์ญํ ๋ถ๋ด์ผ๋ก ์ค๋ฐ์ ์ญํ ์ ์ฌ๋ถ๋ดํ์ฌ ์งํํ์์ต๋๋ค.
- ํ๋ก์ ํธ ์งํ ๊ณผ์ ์ค๊ฐ์ ๊ณตํต UI ํตํฉ
- ๋งค์ผ ์์
์์ 10๋ถ ์ ์ ํ์ํ๋ฉฐ ์งํ ์ํฉ ๊ณต์ ๋ฐ ์ฒดํฌ(8์ 50๋ถ ~ 9์)
- ํ ์ค์ ํ์๋ฅผ ํ๋ฃจ์ ๋ฃจํด์ผ๋ก ์ ํด๋๊ณ ์จ์ ํ ํ์์ ์ง์คํ ์ ์์์ต๋๋ค.
- ํ ๋ ธ์ To Do List ํ์ด์ง์ ํ๋ฃจ ๋ชฉํ ์ค์ ํด ๋์์ต๋๋ค.
- ๊ฐ์ ๋งก์ ํํธ์ ๋ง๊ฐ ๊ธฐํ์ ์ ํ์ฌ ๋ ์ฑ ์๊ฐ ์๊ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ์ต๋๋ค.
- ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํ ํด๋ฆฐ ์ฝ๋๋ฅผ ์์ฑํ์ง ๋ชปํ ์ ์ด ์์ฌ์ ์ต๋๋ค.
- ๊ธฐ๊ฐ ๋ด์ Vanilla JS์์ React ๋ฆฌ๋น๋ฉ๊น์ง ํ๊ณ ์ถ์์ผ๋ ๊ธฐ๋ฅ ๊ตฌํ์์ ์๊ฐ์ด ๊ฑธ๋ ค Vanilla JS๋ก๋ง ๊ตฌํํ์์ต๋๋ค.