์นดํ…Œ๊ณ ๋ฆฌ ๋ณด๊ด€๋ฌผ: Javascript

Javascript

CSS๋Š” ํ•ญ์ƒ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ณด๋‹ค ์šฐ์„ ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ˆ˜๋งŽ์€ ์˜จ๋ผ์ธ ์‚ฌ์ดํŠธ์—์„œ JavaScript๋ณด๋‹ค CSS๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ถ”๋ก ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ๊ณผ ๊ฐ™์€ ํ˜•์‹์ž…๋‹ˆ๋‹ค .

CSS์™€ JavaScript๋ฅผ ์ฃผ๋ฌธํ•  ๋•Œ๋Š” CSS๊ฐ€ ์šฐ์„ ์ž…๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์Šค๋ ˆ๋“œ์—๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์Šคํƒ€์ผ ์ •๋ณด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. JavaScript๊ฐ€ ๋จผ์ € ํฌํ•จ๋˜๋ฉด JavaScript ์—”์ง„์€ ๋‹ค์Œ ๋ฆฌ์†Œ์Šค ์„ธํŠธ๋ฅผ ๊ณ„์†ํ•˜๊ธฐ ์ „์—์ด๋ฅผ ๋ชจ๋‘ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ Œ๋”๋ง ์Šค๋ ˆ๋“œ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์Šคํƒ€์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ํ‘œ์‹œ ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚ด ํ…Œ์ŠคํŠธ ํ•˜๋„ค์Šค

๋‹ค์Œ Ruby ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž์›์— ๋Œ€ํ•œ ํŠน์ • ์ง€์—ฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

require 'rubygems'
require 'eventmachine'
require 'evma_httpserver'
require 'date'

class Handler  < EventMachine::Connection
  include EventMachine::HttpServer

  def process_http_request
    resp = EventMachine::DelegatedHttpResponse.new( self )

    return unless @http_query_string

    path = @http_path_info
    array = @http_query_string.split("&").map{|s| s.split("=")}.flatten
    parsed = Hash[*array]

    delay = parsed["delay"].to_i / 1000.0
    jsdelay = parsed["jsdelay"].to_i

    delay = 5 if (delay > 5)
    jsdelay = 5000 if (jsdelay > 5000)

    delay = 0 if (delay < 0) 
    jsdelay = 0 if (jsdelay < 0)

    # Block which fulfills the request
    operation = proc do
      sleep delay 

      if path.match(/.js$/)
        resp.status = 200
        resp.headers["Content-Type"] = "text/javascript"
        resp.content = "(function(){
            var start = new Date();
            while(new Date() - start < #{jsdelay}){}
          })();"
      end
      if path.match(/.css$/)
        resp.status = 200
        resp.headers["Content-Type"] = "text/css"
        resp.content = "body {font-size: 50px;}"
      end
    end

    # Callback block to execute once the request is fulfilled
    callback = proc do |res|
        resp.send_response
    end

    # Let the thread pool (20 Ruby threads) handle request
    EM.defer(operation, callback)
  end
end

EventMachine::run {
  EventMachine::start_server("0.0.0.0", 8081, Handler)
  puts "Listening..."
}

์œ„์˜ ๋ฏธ๋‹ˆ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JavaScript ํŒŒ์ผ (์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘) ๋ฐ ์ž„์˜์˜ CSS ์ง€์—ฐ์— ๋Œ€ํ•œ ์ž„์˜ ์ง€์—ฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด http://10.0.0.50:8081/test.css?delay=500CSS๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐ 500ms ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
      <title>test</title>
      <script type='text/javascript'>
          var startTime = new Date();
      </script>
      <link href="http://10.0.0.50:8081/test.css?delay=500" type="text/css" rel="stylesheet">
      <script type="text/javascript" src="http://10.0.0.50:8081/test2.js?delay=400&amp;jsdelay=1000"></script> 
  </head>
  <body>
    <p>
      Elapsed time is: 
      <script type='text/javascript'>
        document.write(new Date() - startTime);
      </script>
    </p>    
  </body>
</html>

CSS๋ฅผ ๋จผ์ € ํฌํ•จํ•˜๋ฉด ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ 1.5 ์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

CSS ์šฐ์„ 

JavaScript๋ฅผ ๋จผ์ € ํฌํ•จํ•˜๋ฉด ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ 1.4 ์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

Chrome, Firefox ๋ฐ Internet Explorer์—์„œ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Opera์—์„œ๋Š” ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ์–ด๋‚˜๊ณ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์€ JavaScript ํ•ด์„๊ธฐ๊ฐ€ ๋ชจ๋“  CSS๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•  ๋•Œ๊นŒ์ง€ ์‹œ์ž‘์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JavaScript ์Šค๋ ˆ๋“œ๋ฅผ ๋” ๋งŽ์ด ์‹คํ–‰ํ•˜๋ฉด JavaScript๋ฅผ ๋จผ์ € ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋น ๋œจ๋ฆฐ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? JavaScript๊ฐ€ ํฌํ•จ๋˜๊ธฐ ์ „์— CSS๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค?

๋น„๋™๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์Šค๋ ˆ๋“œ๋ฅผ ๋น„์šฐ๊ฑฐ๋‚˜ JavaScript ์ฝ”๋“œ๋ฅผ ๋ฐ”๋‹ฅ ๊ธ€์— ๋„ฃ๊ฑฐ๋‚˜ JavaScript ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์š”์ ์€ ํ•„์ˆ˜ JavaScript ๋น„ํŠธ์™€ CSS ๋น„ํŠธ์˜ ์ˆœ์„œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.



๋‹ต๋ณ€

์ด๊ฒƒ์€ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ CSS๋ฅผ CSS <link href="...">์•ž์— ๋†“์•˜์Šต๋‹ˆ๋‹ค. <script src="...">์™œ๋ƒํ•˜๋ฉด โ€œํ•œ๋ฒˆ ๋” ๋‚˜์•„ ์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.โ€ ๊ทธ๋ž˜์„œ ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ ์—ฐ๊ตฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค!

Node์—์„œ ์ž์ฒด ํ…Œ์ŠคํŠธ ํ•˜๋„ค์Šค๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค (์•„๋ž˜ ์ฝ”๋“œ). ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚˜๋Š” :

  • HTTP ์บ์‹ฑ์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ํŽ˜์ด์ง€๊ฐ€๋กœ๋“œ ๋  ๋•Œ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ „์ฒด ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์‹ค์„ ์‹œ๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด jQuery์™€ H5BP CSS๋ฅผ ํฌํ•จ ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.
  • ํ•œ ํŽ˜์ด์ง€๋Š” ์Šคํฌ๋ฆฝํŠธ ์ „ CSS, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํ›„ CSS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ํŽ˜์ด์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์—์„œ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ <head>๋ฅผ ์‹คํ–‰ ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์—์„œ ์ธ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ <body>๋ฅผ ์‹คํ–‰ ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๊ธฐ๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค DOMReady.
  • CSS ๋ฐ / ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— 500ms๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค.
  • 3 ๊ฐœ์˜ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ 20 ๋ฒˆ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

๋จผ์ € CSS ํŒŒ์ผ์ด 500ms ์ง€์—ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

     Browser: Chrome 18    | IE 9         | Firefox 9
         CSS: first  last  | first  last  | first last
=======================================================
Header Exec |              |              |
Average     | 583ms  36ms  | 559ms  42ms  | 565ms 49ms
St Dev      | 15ms   12ms  | 9ms    7ms   | 13ms  6ms
------------|--------------|--------------|------------
Body Exec   |              |              |
Average     | 584ms  521ms | 559ms  513ms | 565ms 519ms
St Dev      | 15ms   9ms   | 9ms    5ms   | 13ms  7ms

๋‹ค์Œ์œผ๋กœ jQuery๋ฅผ CSS ๋Œ€์‹  500ms ์ง€์—ฐํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

     Browser: Chrome 18    | IE 9         | Firefox 9
         CSS: first  last  | first  last  | first last
=======================================================
Header Exec |              |              |
Average     | 597ms  556ms | 562ms  559ms | 564ms 564ms
St Dev      | 14ms   12ms  | 11ms   7ms   | 8ms   8ms
------------|--------------|--------------|------------
Body Exec   |              |              |
Average     | 598ms  557ms | 563ms  560ms | 564ms 565ms
St Dev      | 14ms   12ms  | 10ms   7ms   | 8ms   8ms

๋งˆ์ง€๋ง‰์œผ๋กœ jQuery์™€ CSS ๋ชจ๋‘ 500ms ์ง€์—ฐ๋˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

     Browser: Chrome 18    | IE 9         | Firefox 9
         CSS: first  last  | first  last  | first last
=======================================================
Header Exec |              |              |
Average     | 620ms  560ms | 577ms  577ms | 571ms 567ms
St Dev      | 16ms   11ms  | 19ms   9ms   | 9ms   10ms
------------|--------------|--------------|------------
Body Exec   |              |              |
Average     | 623ms  561ms | 578ms  580ms | 571ms 568ms
St Dev      | 18ms   11ms  | 19ms   9ms   | 9ms   10ms

๊ฒฐ๋ก 

๋จผ์ €, ๋‚˜๋Š” <head>๋ฌธ์„œ์˜ ๋์— ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค <body>. <head>๋ฌธ์„œ์˜ ๋๊ณผ ๋ ์—์„œ ์Šคํฌ๋ฆฝํŠธ์— ๋งํฌ ํ•  ์ˆ˜์žˆ๋Š” ์ด์œ ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ฃผ์žฅ์ด ์žˆ์ง€๋งŒ์ด ๋‹ต๋ณ€์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ s์—์„œ s <script>๋ณด๋‹ค ๋จผ์ € ๊ฐˆ์ง€ ์—ฌ๋ถ€ <link>์— ๊ด€ํ•œ ๊ฒƒ <head>์ž…๋‹ˆ๋‹ค.

์ตœ์‹  DESKTOP ๋ธŒ๋ผ์šฐ์ €์—์„œ CSS์— ์—ฐ๊ฒฐ ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . CSS๋ฅผ ์Šคํฌ๋ฆฝํŠธ ๋’ค์— ๋†“์œผ๋ฉด CSS์™€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ชจ๋‘ ์ง€์—ฐ ๋  ๋•Œ ์‚ฌ์†Œํ•œ ์–‘์˜ ์ด๋“์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ CSS๊ฐ€ ์ง€์—ฐ๋˜๋ฉด ํฐ ์ด๋“์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. last์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์˜ ์—ด๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค .

CSS์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ฐ๊ฒฐํ•ด๋„ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜์ง€ ๋Š” ์•Š์ง€๋งŒ ํŠน์ • ์ƒํ™ฉ์—์„œ ์ด์  ์„ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์ „ ๋ธŒ๋ผ์šฐ์ €์˜ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐ์Šคํฌํ†ฑ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ์— ์—ฐ๊ฒฐ ํ•œ ํ›„ ์™ธ๋ถ€ ์Šคํƒ€์ผ ์‹œํŠธ์— ์—ฐ๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค . ๋ชจ๋ฐ”์ผ ์ƒํ™ฉ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค.

์™œ?

์—ญ์‚ฌ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ <script>์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํƒœ๊ทธ๋ฅผ ๋ฐœ๊ฒฌ ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ๊ตฌ๋ฌธ ๋ถ„์„ ์„ ์ค‘์ง€ ํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฒ€์ƒ‰ ํ•œ ํ›„ ์‹คํ–‰ ํ•œ ๋‹ค์Œ HTML ๊ตฌ๋ฌธ ๋ถ„์„์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ <link>์™ธ๋ถ€ ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ๋ฐœ๊ฒฌ ํ•œ ๊ฒฝ์šฐ CSS ํŒŒ์ผ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๋™์•ˆ HTML์„ ๊ณ„์† ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค (๋ณ‘๋ ฌ).

๋”ฐ๋ผ์„œ ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ๋จผ์ € ๋ฐฐ์น˜ํ•˜๋ผ๋Š” ๋„๋ฆฌ ๋ฐ˜๋ณต๋˜๋Š” ์กฐ์–ธ โ€“ ๋จผ์ € ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ํ•  ์ฒซ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ € (์œ„์—์„œ ํ…Œ์ŠคํŠธ ํ•œ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ € ํฌํ•จ)๋Š” ์ถ”์ธก ๋ถ„์„ ์„ ๊ตฌํ˜„ ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ HTML์„ โ€ ์˜ˆ์ƒ โ€œํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ ํ•˜๊ธฐ ์ „์— ๋ฆฌ์†Œ์Šค ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค .

์ถ”์ธก ๋ถ„์„์ด์—†๋Š” ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋จผ์ € ๋ฐฐ์น˜ํ•˜๋ฉด ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์ง€์›

์ถ”๋ก  ํŒŒ์‹ฑ์€ ๋‹ค์Œ์—์„œ ์ฒ˜์Œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (2012 ๋…„ 1 ์›” ํ˜„์žฌ์ด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ์ „ ์„ธ๊ณ„ ๋ฐ์Šคํฌํ†ฑ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์ž์˜ ๋น„์œจ๊ณผ ํ•จ๊ป˜)

  • ํฌ๋กฌ 1 (WebKit 525) (100 %)
  • IE 8 (75 %)
  • ํŒŒ์ด์–ด ํญ์Šค 3.5 (96 %)
  • ์‚ฌํŒŒ๋ฆฌ 4 (99 %)
  • ์˜คํŽ˜๋ผ 11.60 (85 %)

ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ ๋ฐ์Šคํฌํ†ฑ ๋ธŒ๋ผ์šฐ์ €์˜ ์•ฝ 85 %๊ฐ€ ์ถ”๋ก  ๋กœ๋”ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. CSS ์•ž์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„ฃ์œผ๋ฉด ์ „ ์„ธ๊ณ„ ์‚ฌ์šฉ์ž์˜ 15 %๊ฐ€ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒ ํ•ฉ๋‹ˆ๋‹ค . ์‚ฌ์ดํŠธ์˜ ํŠน์ • ์ž ์žฌ ๊ณ ๊ฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ YMMV (๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๊ณ  ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.)

๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €์™€ OS ํ™˜๊ฒฝ์ด ์–ผ๋งˆ๋‚˜ ์ด์งˆ์ ์ธ๊ฐ€์— ๋”ฐ๋ผ ๊ฒฐ์ •์ ์ธ ์ˆซ์ž๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ถ”๋ก  ๋ Œ๋”๋ง์€ WebKit 525 (2008 ๋…„ 3 ์›” ๋ฆด๋ฆฌ์Šค)์—์„œ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ ๊ฑฐ์˜ โ€‹โ€‹๋ชจ๋“  ๊ฐ€์น˜์žˆ๋Š” ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ WebKit์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€œ๋Œ€๋ถ€๋ถ„์˜โ€๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ € ๊ฐ€์ด๋ฅผ ์ง€์› ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . quirksmode ์— ๋”ฐ๋ฅด๋ฉด iOS 2.2 / Android 1.0์€ WebKit 525๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Windows Phone์˜ ๋ชจ์–‘์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Android 4 ๊ธฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋ฉฐ ๋ฐ์Šคํฌํ†ฑ ๊ฒฐ๊ณผ์™€ ๋น„์Šทํ•œ ์ˆซ์ž๋ฅผ ๋ณด์•˜์ง€๋งŒ Android ์šฉ Chrome ์˜ ํ™˜์ƒ์ ์ธ ์ƒˆ๋กœ์šด ์›๊ฒฉ ๋””๋ฒ„๊ฑฐ ์— ์—ฐ๊ฒฐํ–ˆ์œผ๋ฉฐ ๋„คํŠธ์›Œํฌ ํƒญ์—์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹ค์ œ๋กœ ๋‹ค์šด๋กœ๋“œ ๋Œ€๊ธฐ ์ค‘์ž„์„ ๋‚˜ํƒ€ ๋ƒˆ์Šต๋‹ˆ๋‹ค ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™„์ „ํžˆ๋กœ๋“œ ๋  ๋•Œ๊นŒ์ง€ CSS, ์ฆ‰ ์ตœ์‹  ๋ฒ„์ „์˜ Android ์šฉ WebKit์กฐ์ฐจ๋„ ์ถ”๋ก  ํŒŒ์‹ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ์žฅ์น˜ ๊ณ ์œ ์˜ CPU, ๋ฉ”๋ชจ๋ฆฌ ๋ฐ / ๋˜๋Š” ๋„คํŠธ์›Œํฌ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ๊บผ์ ธ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธ

๋ฐ”๋ณด๋ฅผ ์šฉ์„œํ•˜์‹ญ์‹œ์˜ค โ€“ ์ด๊ฒƒ์€ Q & D์˜€์Šต๋‹ˆ๋‹ค.

app.js

var express = require('express')
, app = express.createServer()
, fs = require('fs');

app.listen(90);

var file={};
fs.readdirSync('.').forEach(function(f) {
    console.log(f)
    file[f] = fs.readFileSync(f);
    if (f != 'jquery.js' && f != 'style.css') app.get('/' + f, function(req,res) {
        res.contentType(f);
        res.send(file[f]);
    });
});


app.get('/jquery.js', function(req,res) {
    setTimeout(function() {
        res.contentType('text/javascript');
        res.send(file['jquery.js']);
    }, 500);
});

app.get('/style.css', function(req,res) {
    setTimeout(function() {
        res.contentType('text/css');
        res.send(file['style.css']);
    }, 500);
});


var headresults={
    css: [],
    js: []
}, bodyresults={
    css: [],
    js: []
}
app.post('/result/:type/:time/:exec', function(req,res) {
    headresults[req.params.type].push(parseInt(req.params.time, 10));
    bodyresults[req.params.type].push(parseInt(req.params.exec, 10));
    res.end();
});

app.get('/result/:type', function(req,res) {
    var o = '';
    headresults[req.params.type].forEach(function(i) {
        o+='\n' + i;
    });
    o+='\n';
    bodyresults[req.params.type].forEach(function(i) {
        o+='\n' + i;
    });
    res.send(o);
});

css.html

<!DOCTYPE html>
<html>
    <head>
        <title>CSS first</title>
        <script>var start = Date.now();</script>
        <link rel="stylesheet" href="style.css">
        <script src="jquery.js"></script>
        <script src="test.js"></script>
    </head>
    <body>
        <script>document.write(jsload - start);bodyexec=Date.now()</script>
    </body>
</html>

js.html

<!DOCTYPE html>
<html>
    <head>
        <title>CSS first</title>
        <script>var start = Date.now();</script>
        <script src="jquery.js"></script>
        <script src="test.js"></script>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <script>document.write(jsload - start);bodyexec=Date.now()</script>
    </body>
</html>

test.js

var jsload = Date.now();


$(function() {
    $.post('/result' + location.pathname.replace('.html','') + '/' + (jsload - start) + '/' + (bodyexec - start));
});

jquery.js๋Š” jquery-1.7.1.min.js์˜€์Šต๋‹ˆ๋‹ค.


๋‹ต๋ณ€

CSS๋ฅผ JavaScript๋ณด๋‹ค ์šฐ์„ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ € (Internet Explorer 6-7, Firefox 2 ๋“ฑ)๋Š” ์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋ชจ๋“  ํ›„์† ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ a.js๊ณ„์† b.cssํ•ด์„œ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € a ๋‹ค์Œ b. ๋‹น์‹ ์ด ๊ฒฝ์šฐ b.css๋‹ค์Œ์— a.js๊ทธ๋“ค์ด ๋” ๋นจ๋ฆฌ ํŽ˜์ด์ง€๊ฐ€๋กœ๋“œ ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œ๋ฐ›์„.

  2. ๋ชจ๋“  ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•  ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค . ํŽ˜์ด์ง€์—์„œ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ์•„๋ž˜์—์žˆ๋Š” ๋ชจ๋“  DOM ์š”์†Œ์˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ HEAD์— ๋„ฃ์œผ๋ฉด ๋ชจ๋“  ์Šคํƒ€์ผ ์‹œํŠธ ๋ฐ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค์šด๋กœ๋“œ ๋  ๋•Œ๊นŒ์ง€ ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ์‹œํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ฏ€๋กœ (์ฒซ ๋ฒˆ์งธ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ณ  ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ฝ˜ํ…์ธ  FOUC๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก) ์Šคํฌ๋ฆฝํŠธ์˜ ์ „์ฒด ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์€ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์ข…์ข… DOM ์š”์†Œ ๋‚˜ DOM ์š”์†Œ์˜ ์ผ๋ถ€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ํŽ˜์ด์ง€์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€๋Šฅํ•œ ์ ๊ฒŒ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์ ์œผ๋กœ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

Cuzillion์œผ๋กœ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์žฌ๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ํŽ˜์ด์ง€ ์—๋Š” HEAD์— ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ BODY ๋ธ”๋ก์˜ ๋์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์ด ํŽ˜์ด์ง€์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํ•ด๋‹น DOM ์š”์†Œ๊ฐ€ SCRIPT ํƒœ๊ทธ ์œ„์—์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ํŽ˜์ด์ง€ ํ—ค๋”๊ฐ€ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค .


๋‹ต๋ณ€

๋‚˜๋Š” ๋‹น์‹ ์ด ์–ป์€ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๊ฐ•์กฐํ•˜์ง€ ์•Š๊ณ  ์ฃผ๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ js ์ „์— CSS์— ๋„ฃ๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค๋Š” ๊ฒƒ์„ ์„ค๋ช… ํ•  ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น ์‚ฌ์ดํŠธ๋ฅผ๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

CASE 1 : ํฐ์ƒ‰ ํ™”๋ฉด> ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ์›น ์‚ฌ์ดํŠธ> ์Šคํƒ€์ผ์˜ ์›น ์‚ฌ์ดํŠธ> ์ƒํ˜ธ ์ž‘์šฉ> ์Šคํƒ€์ผ ๋ฐ ๋Œ€ํ™” ํ˜• ์›น ์‚ฌ์ดํŠธ

CASE 2 : ํฐ์ƒ‰ ํ™”๋ฉด> ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ์›น ์‚ฌ์ดํŠธ> ์ƒํ˜ธ ์ž‘์šฉ> ์Šคํƒ€์ผ ์›น ์‚ฌ์ดํŠธ> ์Šคํƒ€์ผ ๋ฐ ๋Œ€ํ™” ํ˜• ์›น ์‚ฌ์ดํŠธ

์†”์งํžˆ ์ผ€์ด์Šค 2๋ฅผ ์„ ํƒํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ƒ์ƒํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์€์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ์†๋„๊ฐ€ ๋А๋ฆฐ ๋ฐฉ๋ฌธ์ž๋Š” ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ ‘ํ•˜๊ฒŒ๋˜๋ฏ€๋กœ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ (์ด๋ฏธ๋กœ๋“œ ๋œ ์ดํ›„)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์‚ฌ์ดํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ณด๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์€ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ทน๋Œ€ํ™”๋ฉ๋‹ˆ๋‹ค. ์™œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ ์›ํ• ๊นŒ์š”?

๋˜ํ•œ jQuery ์ƒํƒœ ๋กœ ๋” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

โ€œCSS ์Šคํƒ€์ผ ์†์„ฑ์˜ ๊ฐ’์— ์˜์กดํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์ „์— ์™ธ๋ถ€ ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์Šคํƒ€์ผ ์š”์†Œ๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.โ€

ํŒŒ์ผ์ด ์ž˜๋ชป๋œ ์ˆœ์„œ๋กœ๋กœ๋“œ๋˜๋ฉด (๋จผ์ € JS, CSS) CSS ํŒŒ์ผ์— ์„ค์ •๋œ ์†์„ฑ (์˜ˆ : div์˜ ๋„ˆ๋น„ ๋˜๋Š” ๋†’์ด)์— ์˜์กดํ•˜๋Š” Javascript ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๋กœ๋”ฉ ์ˆœ์„œ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์†์„ฑ์ด Javascript์— ์•Œ๋ ค์ง„ โ€˜๋•Œ๋•Œ๋กœโ€™์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ ์ด๊ฒƒ์ด ๊ฒฝ์Ÿ ์กฐ๊ฑด์œผ๋กœ ์ธํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?). ์ด ํšจ๊ณผ๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ํฌ๊ฑฐ๋‚˜ ์ž‘๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.


๋‹ต๋ณ€

ํ…Œ์ŠคํŠธ๋Š” ๊ฐœ์ธ์šฉ ์ปดํ“จํ„ฐ ๋‚˜ ์›น ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๋นˆ ํŽ˜์ด์ง€์ด๊ฑฐ๋‚˜ ์ด๋ฏธ์ง€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์ด์žˆ๋Š” ๋ณต์žกํ•œ ์˜จ๋ผ์ธ ์‹œ์Šคํ…œ์ž…๋‹ˆ๊นŒ? ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ„๋‹จํ•œ ํ˜ธ๋ฒ„ ์ด๋ฒคํŠธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์˜ ๊ด€๋ จ์„ฑ์€ ๊ฑฐ์˜ ํ•ญ์ƒ ๋†’์€ ์ˆ˜์ค€์˜ ์›น ๊ฐœ๋ฐœ์— ํˆฌ์ž ํ•  ๋•Œ ๊ทœ์น™์ด๋ฉ๋‹ˆ๋‹ค.

๊ทœ์น™์€ โ€œํ•˜๋‹จ์—์„œ ์ƒ๋‹จ๊ณผ ์Šคํฌ๋ฆฝํŠธ์— ๋„ฃ์–ด ์Šคํƒ€์ผโ€์˜ ๋ชฉ์ ์€ ์ฆ‰, ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์  ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค ์ง„๋ณด์  ์ธ ๋ Œ๋”๋ง , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ฐ–์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ œ์ณ๋‘๊ณ  : ํ…Œ์ŠคํŠธ๊ฐ€ ์œ ํšจํ•˜๊ณ , ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™๊ณผ ๋‹ฌ๋ฆฌ ์‹ค์ œ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์‹ค์ œ๋กœ ๋†€๋ผ์šด ๊ฒฐ๊ณผ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ์›น ์‚ฌ์ดํŠธ (๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ฒŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ)๋Š” ๋‹ค๋ฅด๋ฉฐ ์ธํ„ฐ๋„ท์€ ๋Š์ž„์—†์ด ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹ต๋ณ€

๋‹ค๋ฅธ ์ด์œ ๋กœ Javascript ์•ž์— CSS ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.

๋‚ด ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ผ๋ถ€ ํŽ˜์ด์ง€ ์š”์†Œ์˜ ๋™์  ํฌ๊ธฐ ์กฐ์ •์„ ์ˆ˜ํ–‰ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ (CSS๊ฐ€ ์‹ค์ œ๋กœ ์ฃผ์š”ํ•œ ์ฝ”๋„ˆ ๊ฒฝ์šฐ) JS๊ฐ€ ์ข…๋ฃŒ ๋œ ํ›„ CSS๋ฅผ๋กœ๋“œํ•˜๋ฉด ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ CSS ์Šคํƒ€์ผ๋ณด๋‹ค ์š”์†Œ์˜ ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค ์Šคํƒ€์ผ์ด ๋งˆ์นจ๋‚ด ์‹œ์ž‘๋  ๋•Œ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. CSS๋ฅผ ๋ฏธ๋ฆฌ๋กœ๋“œํ•˜๋ฉด ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ณ  ์ตœ์ข… ๋ ˆ์ด์•„์›ƒ์ด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹ต๋ณ€

JavaScript ์ „์— CSS๋ฅผ ํฌํ•จํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‹จ์ˆœํžˆ ์ถ”์ฒœ์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค๋ฉด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋‹จ๋‹จํ•˜๊ณ  ๋น ๋ฅธ ๊ทœ์น™์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค๋ฉด, ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค, ๊ทธ๊ฒƒ์€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—์„œ https://developer.mozilla.org/en-US/docs/Web/Reference/Events/DOMContentLoaded

์Šคํƒ€์ผ ์‹œํŠธ๋Š” ๋ธ”๋ก ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„๋กœ๋“œํ•˜๋ฏ€๋กœ, <script>
์ดํ›„์— <link rel="stylesheet" ...>ํŽ˜์ด์ง€๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์™„๋ฃŒํ•˜์ง€ ์•Š์œผ๋ฉด ์Šคํƒ€์ผ ์‹œํŠธ๊ฐ€๋กœ๋“œ ๋  ๋•Œ๊นŒ์ง€ DOMContentLoaded๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์™„๋ฃŒ ์ด๋ฒคํŠธ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์ง€์—ฐ๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ DOM์—๋งŒ ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ondomready / domcontentloaded์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋กœ๋“œ ํ•  ์ด๋ฏธ์ง€ ๋˜๋Š” ์ ์šฉ ํ•  ์Šคํƒ€์ผ ์‹œํŠธ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์œ„์˜ ์ฐธ์กฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ์œผ๋ฉด onload ์ด๋ฒคํŠธ๊นŒ์ง€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์—ฐ๊ธฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

๊ด€์ฐฐ์ž์—๊ฒŒ ๋งํ•˜๋ฉด ์‹œํŠธ๊ฐ€ ์˜ˆ์˜๊ฒŒ ๋  ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ ์ž‘์šฉ ๋Šฅ๋ ฅ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์žˆ์œผ๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€๋ฅผ ๋А๋ผ๋Š” ์ƒ๋Œ€๋ฐฉ์„ ๊ท€์ฐฎ๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฅ์— ์™”์Šต๋‹ˆ๋‹ค. ์ ์žฌ๋ฅผ ๋งˆ์น˜๋Š” ๋ฐ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ๋“ค์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์‚ฌ์ดํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ง€์—ฐ๋˜์–ด ๋งค์šฐ ์‹ค๋ง ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ํ‹€๋ ธ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹น์‹ ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๋˜ ๋‹ค๋ฅธ ์ง„์˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์งˆ๋ฌธ์€ ํŠนํžˆ ์›น ์‚ฌ์ดํŠธ์— ๊ฒŒ์žฌ๋˜๋Š” ๋ชจ๋“  ๊ด‘๊ณ ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ ์ž‘์„ฑ์ž๊ฐ€ ๊ด‘๊ณ  ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•ด ์ž๋ฆฌ ํ‘œ์‹œ ์ž div ๋งŒ ๋ Œ๋”๋งํ•˜๊ณ  onload ์ด๋ฒคํŠธ์— ๊ด‘๊ณ ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์ „์— ์‚ฌ์ดํŠธ๊ฐ€๋กœ๋“œ๋˜๊ณ  ๋Œ€ํ™” ํ˜•์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ถ€ํ’€๋ฆฐ ๊ด‘๊ณ ๊ฐ€๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์‚ฌ์ดํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ์Šคํฌ๋กคํ•˜๋Š” ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด‘๊ณ ๊ฐ€ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ๋Œ€์‹  ์ง๋ ฌ๋กœ๋กœ๋“œ๋˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ•œ ์‚ฌ๋žŒ์˜ ๊ด€์  ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž์™€ ๊ทธ๋“ค์ด ๋ฌด์—‡์„ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์‹ญ์‹œ์˜ค.
  • ์‚ฌ์šฉ์ž์™€ ์ด๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ง• ํ™˜๊ฒฝ์„ ํŒŒ์•…ํ•˜์‹ญ์‹œ์˜ค.
  • ๊ฐ ํŒŒ์ผ์˜ ๊ธฐ๋Šฅ๊ณผ ์ „์ œ ์กฐ๊ฑด์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์†๋„์™€ ์˜ˆ์˜๊ธฐ๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์‹œ ๋„คํŠธ์›Œํฌ ํƒ€์ž„ ๋ผ์ธ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค. ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์— ๋”ฐ๋ผ๋กœ๋“œ ์ˆœ์„œ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (ํŽ˜์ด์ง€ ์ž‘์„ฑ์‹œ ์„œ๋ฒ„ ์ธก).
  • ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‹ค์‹œ ์ธก์ •ํ•˜์‹ญ์‹œ์˜ค.
  • ๋กœ๋“œ ์ˆœ์„œ์—์„œ ํ˜ผํ•ฉ ์Šคํƒ€์ผ๊ณผ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ตœ์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ•˜๋‚˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ํŒŒ์ผ์„๋กœ๋“œํ•˜๋Š” ์ˆœ์„œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ„์น˜๋ฅผ ์‹คํ—˜ํ•˜์‹ญ์‹œ์˜ค. ๋จธ๋ฆฌ? ๋ชธ์—? ๋ฐ”๋”” ํ›„? DOM ์ค€๋น„ /๋กœ๋“œ? ์ง์„ ์‹ค์€?
  • ์ ์ ˆํ•œ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ ๋ฐ ์ง€์—ฐ ์˜ต์…˜์„ ๊ณ ๋ คํ•˜์—ฌ ํŽ˜์ด์ง€์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์ˆœ ์ง€์—ฐ์„ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๋„์›€์ด๋˜๋Š”์ง€ ์•„ํ”„๊ฒŒ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค.
  • ์ตœ์ ์˜๋กœ๋“œ ์˜ค๋”๋ฅผ ํ‰๊ฐ€ํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๊ณ ๋ คํ•ด์•ผ ํ•  ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์œ ๋Œ€ ๋ฐ˜์‘ ํ˜•์€ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋‹ต๋ณ€

2017-12-16 ์—…๋ฐ์ดํŠธ

OP์˜ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์‹คํ—˜์„ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•˜๊ณ  ์ผ๋ถ€ ์‹ ํ™”๋ฅผ ํŒŒ์—ด์‹œ์ผฐ๋‹ค.

๋™๊ธฐ์‹ <script src...>์€ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ์•„๋ž˜์—์žˆ๋Š” ๋ฆฌ์†Œ์Šค์˜ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋” ์ด์ƒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค . Chrome 63์—์„œ ์ƒ์„ฑ ๋œ ํญํฌ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

<head>
<script src="//alias-0.redacted.com/payload.php?type=js&amp;delay=333&amp;rand=1"></script>
<script src="//alias-1.redacted.com/payload.php?type=js&amp;delay=333&amp;rand=2"></script>
<script src="//alias-2.redacted.com/payload.php?type=js&amp;delay=333&amp;rand=3"></script>
</head>

<link rel=stylesheet> ์•„๋ž˜์˜ ์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‹คํ–‰์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ์‹œํŠธ๋Š” ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹คํ•˜์ง€๋งŒ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰์„ ์ฐจ๋‹จ ์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ์„ค๋ช… ). Chrome 63์—์„œ ์ƒ์„ฑ ๋œ ์„ฑ๋Šฅ ์ฐจํŠธ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

<link href="//alias-0.redacted.com/payload.php?type=css&amp;delay=666" rel="stylesheet">
<script src="//alias-1.redacted.com/payload.php?type=js&amp;delay=333&amp;block=1000"></script>


์œ„์˜ ์‚ฌํ•ญ์„ ์—ผ๋‘์—๋‘๊ณ  OP์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSS ์šฐ์„  :

CSS Download  500ms:<------------------------------------------------>
JS Download   400ms:<-------------------------------------->
JS Execution 1000ms:                                                  <-------------------------------------------------------------------------------------------------->
DOM Ready   @1500ms:                                                                                                                                                      โ—†

JS ์šฐ์„  :

JS Download   400ms:<-------------------------------------->
CSS Download  500ms:<------------------------------------------------>
JS Execution 1000ms:                                        <-------------------------------------------------------------------------------------------------->
DOM Ready   @1400ms:                                                                                                                                            โ—†

์ด ๊ธ€์€ Javascript ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜๋˜์—ˆ๊ณ  ๋‹˜์— ์˜ํ•ด ์— ์ž‘์„ฑ๋์Šต๋‹ˆ๋‹ค.