1์ผ 1๋ฏธ์ ์ธ์ฆ ๋ฐ ๊ณต์ ์น ์ดํ๋ฆฌ์ผ์ด์
Daily-Mission์ ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฐ์ ๋ฏธ์ ๊ณต์ ํ๋ซํผ ์ ๋๋ค.
์ํ๋ ๋ฏธ์ ์ ์ฐธ์ฌํ์ฌ ๋งค์ผ ๋ฏธ์ ์ ์๋ฃํ๊ณ , ์ฐธ์ฌ์๋ค๊ณผ ์๋ฃ๋ ๋ฏธ์ ์ ๊ณต์ ํด ๋ณผ ์ ์์ต๋๋ค.
- ๋ฏธ์ ์์ฑ
- ๋ฏธ์ ๊ธ ์ ๋ก๋
- ๋ฏธ์ ๋ณ ์ธ์ฆ๊ธ ํ์ธ
- ๊ฐ์ธ ๋ณ ์ธ์ฆ๊ธ ํ์ธ
- ์ ์ฒด ์ธ์ฆ๊ธ ํ์ธ
- ๋ฏธ์ ์ฐธ์ฌ์ ๋ฐ ๊ฐํด์ ํ์ธ
ํด๋น ํ๋ก์ ํธ๋ React(ํ๋ก ํธ์๋) + Spring Boot(๋ฐฑ์๋) ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์ ๋ ์ด ์ค ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋ด๋นํ์์ผ๋ฉฐ, ์ดํ์ ์์ ์ ํ๋ก ํธ ๊ฐ๋ฐ์ ๊ดํ ๊ฒ์ ๋ค๋ฃน๋๋ค.
- JavaScript
- React
- React Router v4
- Redux
- Redux-thunk
- Sass
- Lazy Loading
- Scroll Paging
- JWT
- BEM
Presentational and Container Components ๋์์ธ ํจํด์ ์ฌ์ฉ ํ์์ต๋๋ค.
ํ๋ก๊ทธ๋ ์๋ธ ๋ ๋๋ง์ ํตํ ๋ฆฌ์์ค ์ต์ ํ
๋ ์ด์ง ๋ก๋ฉ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ํ๋ฉด์ ์ด๋ฏธ์ง๊ฐ ๊ฐ์ง ๋์์ ๋ ๋ก๋ฉ์ด ๋๋๋ก ๊ตฌํํ์์ต๋๋ค.
์ด์ ๋๋ถ์ด, ์คํฌ๋กค ํ์ด์ง์ ์ด์ฉํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ทน๋ํํ๊ณ ๋ชจ๋ฐ์ผ์ ์ต์ ํ ๋ ํ์ด์ง๋ฅผ ๋ง๋ค์์ต๋๋ค.
export function lazyLoad() {
const lazyImages = Array.from(document.querySelectorAll('img.lazy'));
if ('IntersectionObserver' in window) {
const io = new IntersectionObserver((entires, observer) => {
entires.forEach((entry) => {
if (entry.isIntersecting) {
let image = entry.target;
image.src = image.dataset.src;
image.classList.remove('lazy');
io.unobserve(image);
}
});
});
lazyImages.forEach((lazyImage) => {
io.observe(lazyImage);
});
}
}
๋ ์ด์ง ๋ก๋ฉ์ IntersectionObserver ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ image ํ์ผ์ observe ํ์์ต๋๋ค.
export function fetchScroll(func) {
if ('IntersectionObserver' in window) {
const io = new IntersectionObserver((entires, observer) => {
entires.forEach((entry) => {
if (entry.isIntersecting) {
func();
}
});
});
if (document.querySelector('.scroll-detector')) {
io.observe(document.querySelector('.scroll-detector'));
}
}
}
์คํฌ๋กค ํ์ด์ง์ IntersectionObserver ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ํ๋ฉด ํ๋จ์ ์๋ scroll-detector๋ฅผ observer ํ์์ต๋๋ค.
Oauth 2.0 ์ธ์ฆ์ ์ํ JWT
Bearer Authentication๋ฅผ ํตํด User ์ธ์ฆ์ ๊ตฌํํ์์ต๋๋ค.
if (localStorage.getItem(ACCESS_TOKEN)) {
headers.append(
'Authorization',
'Bearer ' + localStorage.getItem(ACCESS_TOKEN),
);
}
const defaults = { headers: headers };
options = Object.assign({}, defaults, options);
๊ตฌ์กฐํ ๋ CSS ์ค๊ณ
BEM ๋ฐฉ๋ฒ๋ก ์ ์ฌ์ฉํ์ฌ CSS ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ์์ต๋๋ค.
๊ตฌ๊ธ/๊นํ๋ธ/๋ค์ด๋ฒ๋ก ๋ก๊ทธ์ธ์ ํ ์ ์์ต๋๋ค.
๋ก๊ทธ์ธ ํ ์ฌ์ฉ์ ์ด๋ฆ / ์ด๋ฏธ์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ฐธ์ฌ์๊ฐ ๋ง์ ๋ฏธ์ ๊ณผ ์ ๊ท ์์ฑ๋ ๋ฏธ์ ์ ์กฐํ ํ ์ ์์ต๋๋ค.
์ข ๋ฃ๋ ๋ฏธ์ ์ ํฌํจํด ์ ์ฒด ๋ฏธ์ ์ ์กฐํ ํ ์ ์์ต๋๋ค.
๋ฏธ์ ๋ํ ์ผ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๋ํ, ํ์ฌ ์ฐธ์ฌ์ค์ธ ์ฌ์ฉ์์ ํด๋น ๋ฏธ์ ์ ์ ์ถ๋ ํฌ์คํธ ๋ชฉ๋ก์ ์กฐํ ํ ์ ์์ต๋๋ค.
๋ฏธ์ ์์ฑํ ์ ๋ฌ๋ฐ์ ์ฐธ์ฌ์ฝ๋๋ฅผ ์ ๋ ฅํด ๋ฏธ์ ์ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
์ ์ฒด ์ธ์ฆ ํฌ์คํธ ๋ชฉ๋ก์ ์กฐํํ ์ ์์ต๋๋ค.
๋ด๊ฐ ์ฐธ์ฌ์ค์ธ ๋ฏธ์ ๋ชฉ๋ก๊ณผ ์ ์ถํ ํฌ์คํธ ๋ชฉ๋ก์ ์กฐํํ ์ ์์ต๋๋ค. ๊ฐํด๋นํ ๋ฏธ์ ์๋ ์ ์ฅํ ์ ์์ต๋๋ค.
์ฐธ์ฌ์ค์ธ ๋ฏธ์ ์ Weekly ํฌ์คํธ History๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
์ ์ถ ์๋ฃ ํ์๋ ์๋์ ๊ฐ์ด ํ๋ฉด์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
์ ๋ชฉ/๋ด์ฉ/์ฌ์ง์ ์ ๋ ฅํด ์ธ์ฆ ํฌ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.