[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 4. ํ™”๋ฉด ์‘๋‹ต ๊ฐœ์„ ํ•˜๊ธฐ

2024. 2. 29. 20:37ยท๐Ÿ“‚ education & lecture/์ธํ”„๋ผ ๊ณต๋ฐฉ

1. ๊ฐœ๋… ๋ฐ ์šฉ์–ด ์ •๋ฆฌ

[1] Web Page Test

  1. webpagetest??
    • ์ธํ„ฐ๋„ท ๊ตฌ๊ฐ„์— ๊ด€ํ•œ ์ „๋ฐ˜์ ์ธ ํ…Œ์ŠคํŠธ
  2. ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•
    • API ๋ณ„ ์š”์ฒญ ์‘๋‹ต ์‹œ๊ฐ„ ํ™•์ธ : ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ € ๋„๊ตฌ > ํผํฌ๋จผ์Šค ํƒญ 
    • ์ •์  ์š”์†Œ๋“ค์— ๊ด€ํ•œ ์ธก์ • ๋ฒ•
      • https://www.webpagetest.org/ 
      • https://pagespeed.web.dev/
  3. ์ •์  ์š”์†Œ ๊ฒ€ํ†  ์‚ฌํ•ญ
    • ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์š”์†Œ : HTML, CSS, JS, image, web font ๋“ฑ
    • ์„ฑ๋Šฅ ๊ฐœ์„  ๊ฒ€ํ†  ์š”์†Œ : ์••์ถ•, HTTP Cache, CDN ๋“ฑ๋“ฑ
  4. ์›น ์„œ๋ฒ„์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ง€ํ‘œ
    1. security score : TLS ๋ฐ HTTP ํ—ค๋” ๋ณด์•ˆ์„ฑ + JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ
    2. first byte time : ์„œ๋ฒ„ ์‘๋‹ต์‹œ๊ฐ„ + ๋„คํŠธ์›Œํฌ ๋น„์šฉ : ์›น ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์ปจํ…์ธ ์˜ ์ฒซ๋ฒˆ ์งธ ๋ฐ”์ดํŠธ๊ฐ€ ์–ผ๋งˆ ๋งŒ์— ๋„์ฐฉํ–ˆ๋Š”์ง€
    3. keep-alive enabled : keep-alive ์„ค์ •ํ–ˆ๋Š”์ง€, ๋งค๋ฒˆ 3way handshake ๋“ฑ ๊ณผ์ •์„ ๊ฑฐ์ณ connection ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š”์ง€
    4. compress transfer : gzip ์••์ถ•์„ ํ–ˆ๋Š”์ง€
    5. compress images : ์ด๋ฏธ์ง€ ์••์ถ•์„ ํ–ˆ๋Š”์ง€ (์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ์ง€ ํ’ˆ์งˆ๋ณด๋‹ค ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์— ๋ฏผ๊ฐ)
    6. cache static content
      • JS, CSS ์ด๋ฏธ์ง€, ์›น ํฐํŠธ ๋“ฑ ์ •์  ์ปจํ…์ธ ๋ฅผ ์บ์‹ฑํ–ˆ๋Š”์ง€
      • ์ „์†ก ๋น„์šฉ์„ ์ค„์ด๋Š” ๊ฒƒ๋ณด๋‹ค, ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ 

 

[2] HTTP Header : Content-Encoding, Accept-Encoding

  1. HTTP Header : Content-Encoding
    1. Content-Encoding : ์„œ๋ฒ„๊ฐ€ ์‹ค์‹œํ•œ content-encoding ํ˜•์‹์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ ํ—ค๋” ํ•„๋“œ์ด๋‹ค.
      • ์—”ํ‹ฐํ‹ฐ ํ—ค๋” ํ•„๋“œ : request ์™€ response ๋ฉ”์„ธ์ง€์— ํฌํ•จ๋œ ์—”ํ‹ฐํ‹ฐ์— ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”
      • ์˜ˆ์‹œ : Content-Encoding: gzip
  2. HTTP Header : Accept-Encoding
    1. Accept-Encoding : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Content-Encoding ๊ณผ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌํ€˜์ŠคํŠธ ํ—ค๋” ํ•„๋“œ์ด๋‹ค.
      • ์˜ˆ์‹œ : Accept-Encoding: br;q=1.0, gzip;q=0.8, *;q=0.1

 

[3] ์••์ถ• ๋ฐฉ์‹

  1. gzip ์••์ถ•
  • gzip์€ ํŒŒ์ผ ์••์ถ• ๋ฐ ์••์ถ• ํ•ด์ œ์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ ํ˜•์‹์ด๋‹ค. Deflate ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด ๋„คํŠธ์›Œํฌ ์ „์†ก ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. gzip์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์›น ์„œ๋ฒ„์™€ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜๋ฏ€๋กœ ์„œ๋ฒ„๋Š” ํŒŒ์ผ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ์ž๋™์œผ๋กœ gzip์œผ๋กœ ์••์ถ•ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๋Š” ํŒŒ์ผ์„ ๋ฐ›์œผ๋ฉด ์••์ถ•์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[4] HTTP Cache

  • ์‘๋‹ต ๊ฐ’์˜ ๋ณต์‚ฌ๋ณธ์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•จ
  • ์บ์‹ฑํ•œ ๋ฆฌ์†Œ์Šค์˜ ์œ„์น˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ private cache ์— ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํ”„๋ก์‹œ ์„œ๋ฒ„(proxy, reverse proxy, CDN) ์˜ Shared Cache ๋กœ ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์Œ
  • ๊ด€๋ จ ๋‚ด์šฉ์€ https://dev-cooper.tistory.com/11 ์— ์ •๋ฆฌ

 

 

2. ์›น ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ

[1] ์›น ์„ฑ๋Šฅ ์ธก์ •ํ•˜๊ธฐ

  • URL : https://www.webpagetest.org/
    • ์›น ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋ฌด๋ฃŒ๋กœ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ
  • ํŠน์ง•
    • ์—ฐ๊ฒฐ ์‹œ๋„ ์œ„์น˜ ๋ฐ ํ™˜๊ฒฝ ์„ค์ • ๊ฐ€๋Šฅ
    • Repeat View(์บ์‹ฑ ๋“ฑ ํ…Œ์ŠคํŠธ)
    • ๋™์ผ ์กฐ๊ฑด์œผ๋กœ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ํ…Œ์ŠคํŠธ
  • ์‹คํ–‰๋ฒ•
    • ํ…Œ์ŠคํŠธ URL ์ž…๋ ฅ : https://cooper-subway.kro.kr/
    • ํ…Œ์ŠคํŠธ ์ง€์—ญ ์„ ํƒ (์„œ์šธ ์„ ํƒ) : advanced configuration > test setting > test location, browser ์„ค์ •
    • Start Test

NGINX + tomcat gzip ์„ค์ • ์ด์ „1

 

[2] ์›น ์„ฑ๋Šฅ ์˜ˆ์‚ฐ ์ธก์ •

  • URL : https://pagespeed.web.dev/
  • ์„ฑ๋Šฅ ๋ฌธ์ œ ์ง„๋‹จ ๋ฐ ๊ฐœ์„  ์ „๋žต์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ ์ œ๊ณต

NGINX + tomcat gzip ์„ค์ • ์ด์ „2

 

์ง„๋‹จ ๋‚ด์šฉ์„ ์ž์„ธํ•˜๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

 

[3] API ์‘๋‹ต ์‹œ๊ฐ„ ํ™•์ธ

  • ์—ญ ๊ด€๋ฆฌ ์กฐํšŒ API ์‘๋‹ต ์‹œ๊ฐ„ ํ™•์ธ
  • chrmoe > ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ > performance tab > record > Network ํ™•์ธ
  • ํ˜„์žฌ GET /stations API duration 818.266ms ์ž„์„ ํ™•์ธ

 

 

3. reverse proxy ๊ฐœ์„ ํ•˜๊ธฐ

[1] NGINX nginx.conf ํŒŒ์ผ ์„ค์ •

(1) gzip ์••์ถ•

http {
  gzip on; ## http ๋ธ”๋ก ์ˆ˜์ค€์—์„œ gzip ์••์ถ• ํ™œ์„ฑํ™”
  gzip_comp_level 9;
  gzip_vary on;
  gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/rss+xml text/javascript image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype;
}

 

(2) cache

http {
  ## Proxy ์บ์‹œ ํŒŒ์ผ ๊ฒฝ๋กœ, ๋ฉ”๋ชจ๋ฆฌ์ƒ ์ ์œ ํ•  ํฌ๊ธฐ, ์บ์‹œ ์œ ์ง€๊ธฐ๊ฐ„, ์ „์ฒด ์บ์‹œ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ ๋“ฑ ์„ค์ •
  proxy_cache_path /tmp/nginx levels=1:2 keys_zone=mycache:10m inactive=10m max_size=200M;

  ## ์บ์‹œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ Key ๊ทœ์น™
  proxy_cache_key "$scheme$host$request_uri $cookie_user";
  
    server {
        location ~* \.(?:css|js|gif|png|jpg|jpeg)$ {
            proxy_pass http://app;
      
            ## ์บ์‹œ ์„ค์ • ์ ์šฉ ๋ฐ ํ—ค๋”์— ์ถ”๊ฐ€
            # ์บ์‹œ ์กด์„ ์„ค์ • (์บ์‹œ ์ด๋ฆ„)
            proxy_cache mycache;
            # X-Proxy-Cache ํ—ค๋”์— HIT, MISS, BYPASS์™€ ๊ฐ™์€ ์บ์‹œ ์ ์ค‘ ์ƒํƒœ์ •๋ณด๊ฐ€ ์„ค์ •
            add_header X-Proxy-Cache $upstream_cache_status;
            # 200 302 ์ฝ”๋“œ๋Š” 20๋ถ„๊ฐ„ ์บ์‹ฑ
            proxy_cache_valid 200 302 10m;    
            # ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์„ 1 ๋‹ฌ๋กœ ์„ค์ •
            expires 1M;
            # access log ๋ฅผ ์ฐ์ง€ ์•Š๋Š”๋‹ค.
            access_log off;
        }
    }
}

 

(3) TLS, HTTP/2 (HTTP2.0์€ SSL ๊ณ„์ธต ์œ„์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.)

http {
  server {
    listen 80;
    return 301 https://$host$request_uri;
  }
  server {  
  listen 443 ssl http2;
    
    ssl_certificate /etc/letsencrypt/live/[๋„๋ฉ”์ธ์ฃผ์†Œ]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[๋„๋ฉ”์ธ์ฃผ์†Œ]/privkey.pem;

    # Disable SSL
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # ํ†ต์‹ ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•  ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    # Enable HSTS
    # client์˜ browser์—๊ฒŒ http๋กœ ์–ด๋– ํ•œ ๊ฒƒ๋„ load ํ•˜์ง€ ๋ง๋ผ๊ณ  ๊ทœ์ œํ•ฉ๋‹ˆ๋‹ค.
    # ์ด๋ฅผ ํ†ตํ•ด http์—์„œ https๋กœ redirect ๋˜๋Š” request๋ฅผ minimize ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    add_header Strict-Transport-Security "max-age=31536000" always;
    
    # SSL sessions
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m; 
  }
}

 

(4) ์„ฑ๋Šฅ ์ง„๋‹จ - PageSpeed Insights

  • First Contentful Paint : 3.3s → 1.7s
  • Largest Contentful Paint : 3.3s → 1.7s
  • Total Blocking Time : 50ms → 0s 
  • Speed Index : 3.3s → 2.1s

 

 

 

(5) ์„ฑ๋Šฅ ์ง„๋‹จ - Webpagetest

  • start render : 4.7s  → 1.5s (์ฒซ ํŒจํ‚ท ๋„๋‹ฌ๊นŒ์ง€์˜ ์‹œ๊ฐ„)
  • First Contentful Paint : 4.708s → 1.503s (ํ…์ŠคํŠธ์™€ ์ด๋ฏธ์ง€๊ฐ€ ์–ธ์ œ๋ถ€ํ„ฐ ํ‘œ์‹œ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์‹œ๊ฐ„)
  • Speed Index 4.739s → 1.544s (ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉํ•œ ์ƒํƒœ๋กœ ๊นŒ์ง€์˜ ์‹œ๊ฐ„)
  • Largest Contentful Paint : 4.901s → 1.602s (๊ฐ€์žฅ ํฌ๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ์ฝ˜ํ…์ธ ์˜ ๋กœ๋”ฉ ์™„๋ฃŒ ์‹œ๊ฐ„)
  • Page Weight : 2478KB → 615KB (๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ”์ดํŠธ ์ˆ˜)
 

 

 

 

[2] tomcat compression ์„ค์ •

(1) application.properties ์„ค์ • 

  • server.compression.enabled - ์„œ๋ฒ„ ์••์ถ• ํ™œ์„ฑํ™” ์—ฌ๋ถ€
  • server.compression.mime-types - ์••์ถ•ํ•  MIME-TYPE ์„ค์ •
  • server.compression.min-response-size - ์••์ถ•ํ•  ํŒŒ์ผ ์ตœ์†Œ ์‚ฌ์ด์ฆˆ (default = 2048)
# application.properties
server.compression.enabled: true
server.compression.mime-types: text/html,text/plain,text/css,application/javascript,application/json
server.compression.min-response-size: 500

 

 

(2) ์„ฑ๋Šฅ ์ง„๋‹จ - PageSpeed Insights (NGINX + tomcat)

 

(3) ์„ฑ๋Šฅ ์ง„๋‹จ - Webpagetest (NGINX + tomcat)

  • NGINX ์—์„œ HTTP ์š”์ฒญ ์‹œ gzip compression ์ด ๋™์ž‘ํ•˜์—ฌ ์„ฑ๋Šฅ์ƒ์ด ๋ณ€ํ™”๊ฐ€ ๋ฏธ๋ฏธํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จ

 

 

Reference

  • ์ฐธ๊ณ  ๊ฐ•์˜
    • https://www.inflearn.com/course/%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B3%B5%EB%B0%A9-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0/dashboard
  • HTTP Content-Encoding, Accept-Encoding, gzip 
    • https://developer.mozilla.org/en-US/docs/Glossary/GZip_compression
    • https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
    • https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
    • https://developer.mozilla.org/en-US/docs/Glossary/GZip_compression
    • https://wonsss.github.io/%EC%B5%9C%EC%A0%81%ED%99%94/gzip-compression/

'๐Ÿ“‚ education & lecture > ์ธํ”„๋ผ ๊ณต๋ฐฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ปจํผ๋Ÿฐ์Šค ์‹ ์ฒญ - 2. ํ™˜๊ฒฝ ๊ตฌ์„ฑ  (0) 2024.03.12
[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ปจํผ๋Ÿฐ์Šค ์‹ ์ฒญ - 1. github action ์„ ํ†ตํ•œ ๋นŒ๋“œ ์„ค์ •  (1) 2024.03.05
[์ธํ”„๋ผ๊ณต๋ฐฉ] HTTP Cache  (0) 2024.02.28
[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 3. 3-tier ๊ตฌ์„ฑํ•˜๊ธฐ  (0) 2024.02.27
[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 2. ์„œ๋ฒ„ ๊ตฌ์„ฑํ•˜๊ธฐ  (1) 2024.02.25
'๐Ÿ“‚ education & lecture/์ธํ”„๋ผ ๊ณต๋ฐฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์ธํ”„๋ผ๊ณต๋ฐฉ] ์ปจํผ๋Ÿฐ์Šค ์‹ ์ฒญ - 2. ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  • [์ธํ”„๋ผ๊ณต๋ฐฉ] ์ปจํผ๋Ÿฐ์Šค ์‹ ์ฒญ - 1. github action ์„ ํ†ตํ•œ ๋นŒ๋“œ ์„ค์ •
  • [์ธํ”„๋ผ๊ณต๋ฐฉ] HTTP Cache
  • [์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 3. 3-tier ๊ตฌ์„ฑํ•˜๊ธฐ
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (84)
      • ๐Ÿ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • ๐Ÿ“‚ computer-science (5)
      • ๐Ÿ“‚ programming-language (12)
        • java (12)
      • ๐Ÿ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • ๐Ÿ“‚ cloud (2)
        • aws (2)
      • ๐Ÿ“‚ frontend (1)
        • react (0)
      • ๐Ÿ“‚ education & lecture (16)
        • ์ธํ”„๋ผ ๊ณต๋ฐฉ (11)
        • ํ•ญํ”Œ ๋ฐฑ์—”๋“œ 7๊ธฐ (5)
      • ๐Ÿ“‚ ai (1)
        • claude (1)
      • ๐Ÿ“‚ etc (2)
        • ํšŒ๊ณ  (1)
        • ์ปจํผ๋Ÿฐ์Šค (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    nGrinder
    spring-batch
    JPA
    mysql
    UUID
    Redisson
    ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์„ค๊ณ„
    ๋™์‹œ์„ฑ
    kafka
    ํšŒ๊ณ 
    gof
    spring AOP
    ์Šคํ”„๋ง์บ ํ”„ ํ›„๊ธฐ
    ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„
    ํ•ญํ•ดํ”Œ๋Ÿฌ์Šค
    react
    spring camp 2025
    spring
    AWS
    ์ธํ”„๋ผ๊ณต๋ฐฉ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
cooper25
[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 4. ํ™”๋ฉด ์‘๋‹ต ๊ฐœ์„ ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”