Skip to content

nowoesiy/Daily-Mission-Front-Web

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

logo 74f7f9d7

1์ผ 1๋ฏธ์…˜ ์ธ์ฆ ๋ฐ ๊ณต์œ  ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

Daily-Mission์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋ฐ˜์˜ ๋ฏธ์…˜ ๊ณต์œ  ํ”Œ๋žซํผ ์ž…๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๋ฏธ์…˜์— ์ฐธ์—ฌํ•˜์—ฌ ๋งค์ผ ๋ฏธ์…˜์„ ์™„๋ฃŒํ•˜๊ณ , ์ฐธ์—ฌ์ž๋“ค๊ณผ ์™„๋ฃŒ๋œ ๋ฏธ์…˜์„ ๊ณต์œ ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mission

์ฃผ์š” ๊ธฐ๋Šฅ

  • ๋ฏธ์…˜์ƒ์„ฑ
  • ๋ฏธ์…˜๊ธ€ ์—…๋กœ๋“œ
  • ๋ฏธ์…˜ ๋ณ„ ์ธ์ฆ๊ธ€ ํ™•์ธ
  • ๊ฐœ์ธ ๋ณ„ ์ธ์ฆ๊ธ€ ํ™•์ธ
  • ์ „์ฒด ์ธ์ฆ๊ธ€ ํ™•์ธ
  • ๋ฏธ์…˜ ์ฐธ์—ฌ์ž ๋ฐ ๊ฐ•ํ‡ด์ž ํ™•์ธ

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” React(ํ”„๋ก ํŠธ์—”๋“œ) + Spring Boot(๋ฐฑ์—”๋“œ) ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ด ์ค‘ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•˜์˜€์œผ๋ฉฐ, ์ดํ›„์˜ ์„œ์ˆ ์€ ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๊ฒƒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์Šคํƒ

  • JavaScript
  • React
  • React Router v4
  • Redux
  • Redux-thunk
  • Sass

์ด์™ธ ์‚ฌ์šฉ ๊ธฐ์ˆ 

  • Lazy Loading
  • Scroll Paging
  • JWT
  • BEM

์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

Presentational and Container Components ๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Project Structure

LazyLoading & Scroll Paging

ํ”„๋กœ๊ทธ๋ ˆ์‹œ๋ธŒ ๋ Œ๋”๋ง์„ ํ†ตํ•œ ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”

lazy & scroll

๋ ˆ์ด์ง€ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์— ์ด๋ฏธ์ง€๊ฐ€ ๊ฐ์ง€ ๋˜์—ˆ์„ ๋•Œ ๋กœ๋”ฉ์ด ๋˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด์™€ ๋”๋ถˆ์–ด, ์Šคํฌ๋กค ํŽ˜์ด์ง•์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ  ๋ชจ๋ฐ”์ผ์— ์ตœ์ ํ™” ๋œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

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 ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

JWT

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);

BEM

๊ตฌ์กฐํ™” ๋œ CSS ์„ค๊ณ„

BEM ๋ฐฉ๋ฒ•๋ก ์„ ์‚ฌ์šฉํ•˜์—ฌ CSS ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

BEM

UI/UX

1. ๋กœ๊ทธ์ธ

๊ตฌ๊ธ€/๊นƒํ—ˆ๋ธŒ/๋„ค์ด๋ฒ„๋กœ ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์‚ฌ์šฉ์ž ์ •๋ณด ๋ณ€๊ฒฝ

๋กœ๊ทธ์ธ ํ›„ ์‚ฌ์šฉ์ž ์ด๋ฆ„ / ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ํ™ˆ

์ฐธ์—ฌ์ž๊ฐ€ ๋งŽ์€ ๋ฏธ์…˜๊ณผ ์‹ ๊ทœ ์ƒ์„ฑ๋œ ๋ฏธ์…˜์„ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์ „์ฒด ๋ฏธ์…˜

์ข…๋ฃŒ๋œ ๋ฏธ์…˜์„ ํฌํ•จํ•ด ์ „์ฒด ๋ฏธ์…˜์„ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๋ฏธ์…˜ ๋””ํ…Œ์ผ

๋ฏธ์…˜ ๋””ํ…Œ์ผ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ˜„์žฌ ์ฐธ์—ฌ์ค‘์ธ ์‚ฌ์šฉ์ž์™€ ํ•ด๋‹น ๋ฏธ์…˜์— ์ œ์ถœ๋œ ํฌ์ŠคํŠธ ๋ชฉ๋ก์„ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ๋ฏธ์…˜ ์ฐธ์—ฌ

๋ฏธ์…˜ ์ƒ์„ฑํ›„ ์ „๋‹ฌ๋ฐ›์€ ์ฐธ์—ฌ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด ๋ฏธ์…˜์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7. ํฌ์ŠคํŒ… ๋ชฉ๋ก

์ „์ฒด ์ธ์ฆ ํฌ์ŠคํŠธ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8. ๋‚ด ๋ฏธ์…˜ ๋ชฉ๋ก

๋‚ด๊ฐ€ ์ฐธ์—ฌ์ค‘์ธ ๋ฏธ์…˜ ๋ชฉ๋ก๊ณผ ์ œ์ถœํ•œ ํฌ์ŠคํŠธ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•ํ‡ด๋‹นํ•œ ๋ฏธ์…˜์—๋Š” ์ž…์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

9. ์ธ์ฆ ํฌ์ŠคํŠธ History

์ฐธ์—ฌ์ค‘์ธ ๋ฏธ์…˜์˜ Weekly ํฌ์ŠคํŠธ History๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์ถœ ์™„๋ฃŒ ํ›„์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ™”๋ฉด์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

10. ํฌ์ŠคํŠธ ์ œ์ถœ

์ œ๋ชฉ/๋‚ด์šฉ/์‚ฌ์ง„์„ ์ž…๋ ฅํ•ด ์ธ์ฆ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

About

๐Ÿ˜Ž ์†Œ๋ชจ์ž„ ๋ฏธ์…˜ ๊ณต์œ  ์›น ํ”Œ๋žซํผ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published