ÃֽŠ°Ô½Ã±Û(OS/WAS)
2018.07.30 / 11:15

ÅèĹ 8 ¼Ò°³ - µÚ´Ê¾úÁö¸¸ ´Ù½Ãº¸·Á±¸~

summerman
Ãßõ ¼ö 170

¾ÆÆÄÄ¡ ÅèĹ(Apache Tomcat) 8 ¹öÀüÀÌ °ð º£Å¸¿¡¼­ Á¤½Ä ¹öÀüÀ¸·Î ¹ßÇ¥µÉ ¿¹Á¤Àε¥ ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿÷ ÆÀ¿¡¼­ ¿þºñ³ª¸¦ Çϱ淡 ¿À´Ã ¹æ±Ý Àü ÀÚÁ¤ºÎÅÍ 1½Ã±îÁö ±×°É ºÃ´Ù. µ¿¿µ»ó ¸®Ç÷¹ÀÌ ¹× ¹ßÇ¥ ÀÚ·á´Â 1-2ÁÖ ÈÄ¿¡ https://www.youtube.com/springsourcedev¿¡ ¿Ã¸°´Ù°í ÇÑ´Ù. ¾Æ·¡ ¿þºñ³ª ³»¿ë ¹× °øºÎÇÑ ³»¿ëÀ» Á¤¸®Çغ»´Ù. ¿¹Á¦ Ãâó´Â github.com/swilliams-pivotal/s2gx-tomcat´Ù.

»ç½Ç ÅèĹ 8 ÀÚüº¸´Ù´Â ÅèĹÀÌ ±¸ÇöÇÏ´Â ÀÚ¹Ù EEÀÇ ±â´É ¼Ò°³ ¼º°ÝÀÌ ´õ °­ÇÑ ¿þºñ³ª¿´´Âµ¥ ¾Æ¹«Æ° ÀÏ´Ü ÅèĹ 8Àº ´ÙÀ½ ³»¿ëÀ¸·Î ¿ä¾àÇÒ ¼ö ÀÖ´Ù.

  • ¼­ºí¸´ 3.1
  • JSP 2.3
  • EL(Expression Language) 3.0
  • À¥¼ÒÄÏ 1.0
  • ±âŸ ÀÚ¹Ù EE 7 ±â´É

¼­ºí¸´ 3.1

¼­ºí¸´ 3.0ºÎÅÍ HTTP ÀÔÃâ·Â¿¡ Å« ±â´ÉÀÌ Çϳª Ãß°¡µÆ´Âµ¥ ¹Ù·Î ¡°Â÷´ÜµÇÁö ¾Ê´Â ÀÔÃâ·Â(non-blocking IO)¡±ÀÌ´Ù. ±×Àü±îÁö´Â ¸»ÇÏÀÚ¸é À¥ºê¶ó¿ìÀú Çϳª¿¡¼­ À¥ÆäÀÌÁö¸¦ ´Ù¿î·Îµå(¶Ç´Â ¾÷·Îµå)ÇÒ ¶§ ÆäÀÌÁö ·ÎµùÀÌ ³¡³¯ ¶§±îÁö ´Ù¸¥ ¾Æ¹« °Íµµ ÇÒ ¼ö°¡ ¾ø¾ú´Ù. ÇÏÁö¸¸ ÀÌÁ¦´Â ÀÔÃâ·ÂÀ» ºñµ¿±âÀûÀ¸·Î ó¸®ÇÒ ¼ö À־ ¼­¹ö°¡ ´Ù¸¥ ÀÛ¾÷À» Çϸ鼭 ÀÔÃâ·ÂÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù. (´Ù¸¥ ¸»·Î ¶Ç´Â ¹Ý´ë·Î ¸»ÇÏÀÚ¸é ÀÔÃâ·ÂÀ» ó¸®Çϸ鼭 µ¿½Ã¿¡ ´Ù¸¥ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ °¡´ÉÇÑ °ÍÀº ÀÔÃâ·ÂÀ» º°µµÀÇ ÀÚ¹Ù ½º·¹µå¸¦ »ý¼ºÇØ Ã³¸®Çϱ⠶§¹®ÀÌ´Ù.)

´ÙÀ½ ¿¹Á¦ Äڵ带 º¸ÀÚ. ¾ÆÁÖ ´Ü¼øÇÑ ¿¹Á¦·Î¼­ ½Ç¿ë¼ºÀº ÀüÇô ¾ø´Âµ¥ °³³äÀº Àß µå·¯³ª ÀÖ´Ù.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. Start Async
        final AsyncContext asyncContext = req.startAsync();
 
        // 2. Add Write Listener - to say Hello
        ServletOutputStream outputStream = resp.getOutputStream();
        WriteListener listener = new WriteListener() {
            @Override
            public void onWritePossible() throws IOException {
                // 3. Write to output stream 
                ServletOutputStream output = asyncContext.getResponse().getOutputStream();
                if (output.isReady()) {
                    output.print("Hello World!");
                }
 
                // 4. Call complete, to signal we are done
                asyncContext.complete();
            }
 
            @Override
            public void onError(Throwable throwable) {
                throwable.printStackTrace(System.err);
                asyncContext.complete();
            }
        };
        outputStream.setWriteListener(listener);
    }

¼­ºí¸´ÀÇ doGet ¸Þ¼­µå¸¦ º¸ÀÎ °ÍÀε¥ 4Çà¿¡¼­ HttpServletRequest#startAsync ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© ºñµ¿±â 󸮸¦ ÁغñÇÏ°í WriteListener ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ¿© ºñµ¿±âÀûÀ¸·Î "Hello World!"¸¦ Ãâ·ÂÇÏ°í ÀÖ´Ù. ºñµ¿±âÀûÀ̹ǷΠ27Çà¿¡ ÀÌÈÄ¿¡ ¹º°¡ ´Ù¸¥ Äڵ尡 ÀÖ´Ù¸é ÇØ´ç Äڵ尡 ½ÇÇàµÇ¸é¼­ µ¿½Ã¿¡ "Hello World!"¸¦ Ŭ¶óÀ̾ðÆ®·Î Ãâ·ÂÇÏ´Â ÀÛ¾÷Àº ±× ÀÛ¾÷´ë·Î ½ÇÇàµÉ °ÍÀÌ´Ù.

ÀÌ ±ÛÀº ÅèĹ 8 ¼Ò°³ ±ÛÀ̹ǷΠÂ÷´ÜµÇÁö ¾Ê´Â ÀÔÃâ·ÂÀº ¿©±â±îÁö¸¸ ¾Ë¾Æº¸±â·Î ÇÑ´Ù.

JSP 2.3

JSP 2.3Àº ¡°maintenance release¡±·Î¼­ ÅèĹ 8¿¡¼­ ±× Àü ¹öÀü°ú º° Â÷ÀÌ°¡ ¾ø´Ù°í ÇÑ´Ù.

Expression Language 3.0

EL 3.0Àº ÀÌÀü ¹öÀü°ú ¸¹ÀÌ ´Þ¶óÁ³Áö¸¸ ÇÏÀ§ ȣȯ¼ºÀÌ ÀÖ´Ù°í ÇÑ´Ù. ÀÌÀü ¹öÀü°ú ´Þ¸® ELProcessor¶ó´Â Ŭ·¡½º¸¦ ´Ü¼ø ºó(bean) ¹æ½ÄÀ¸·Î ¼±¾ðÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î JSP°¡ ¾Æ´Ñ ÀÓÀÇÀÇ ÀÚ¹Ù¿¡¼­µµ ELÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô µÆ´Ù.

    // ELÀ» »ç¿ëÇÒ ¼ö ÀÖ´Â API¸¦ Á¦°øÇÏ´Â ELProcessor »ý¼º
    ELProcessor processor = new ELProcessor();
 
    // °£´ÜÇÑ µ¥ÀÌÅÍ µî·Ï ¹× EL ½ÇÇà
    processor.defineBean("person", this.person);
    System.out.println(processor.eval("person.name"));
 
    // EL 3.0¿¡¼­´Â ¼Â, ¸®½ºÆ®, ¸ÊÀ» ½±°Ô ¼±¾ðÇÒ ¼ö ÀÖ´Ù.
    Set set = (Set) processor.eval("{1, 2, 3, 3, 2, 1}");
    System.out.println("Set -> " + set);
 
    List list = (List) processor.eval("[1, 2, 3, 3, 2, 1]");
    System.out.println("List -> " + list);
 
    Map<String,Integer> map = (Map<String, Integer>) processor.eval("{'one': 1, 'two': 2, 'three': 3}");
    System.out.println("Map -> " + map);

EL 3.0Àº À§ÀÇ ¿¹½Ã ¿Ü¿¡µµ µ¡¼À ¿¬»êÀÚ(+)·Î ¹®ÀÚ¿­ ¿¬°áÇϱâ, map/reduce µî ´Ù¾çÇÑ ±â´ÉÀÌ Ãß°¡µÆ´Ù.

À¥¼ÒÄÏ 1.0

ÅèĹ 7¿¡¼­µµ À¥¼ÒÄÏ API¸¦ Áö¿øÇßÀ¸³ª ÅèĹ 8 ¹× 7.0.43ºÎÅÍ »õ·Î¿î API·Î À¥¼ÒÄÏÀÌ ±¸ÇöµÆ´Ù°í ÇÑ´Ù. ¶ÇÇÑ ÅèĹ 7¿¡¼­´Â Â÷´ÜµÇ´Â(blocking) ¹æ½ÄÀ̾úÀ¸³ª À¥¼ÒÄÏ 1.0¿¡¼­´Â °ÅÀÇ ºñÂ÷´Ü½ÄÀ¸·Î Á¦°øµÈ´Ù.

@ServerEndpoint("/websockets/events/annotation")
public class EventsAnnotationEndpoint {
 
    // called when connection is opened, use blocking api to send a response message
    @OnOpen
    public void onOpen(Session session) {
        try {
            session.getBasicRemote().sendText("Welcome!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    // called on close, we do nothing.
    @OnClose
    public void onClose() {
        // Clean up resources here
    }
 
    // called when a full message is received, we echo back to client using blocking api
    @OnMessage
    public void onMessage(Session session, String message) {
        try {
            session.getBasicRemote().sendText("Echo [" + message + "]");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}

ÅèĹ ÀÚüÀÇ º¯È­

  • ÀÌÀü¿¡´Â ÀÚ¿ø(ÆÄÀÏ)À» ã±â À§ÇÑ ¹æ½ÄÀ¸·Î Aliases, VirtualLoader, VirtualDirContext, JAR ÆÄÀÏ µî ¿©·¯°¡Áö¸¦ server.xml¿¡ ¼³Á¤ÇÒ ¼ö ÀÖ¾ú´Âµ¥ 8 ¹öÀüºÎÅÍ °£´ÜÇÏ°Ô ÀÏ¿øÈ­Çß´Ù°í ÇÑ´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº https://tomcat.apache.org/tomcat-8.0-doc/config/resources.htmlÀ» Âü°íÇÑ´Ù.
  • rewrite ¹ëºê°¡ Ãß°¡µÆ´Ù. ¼³Á¤ ±¸¹®¿¡ ´ëÇÑ ¼³¸íÀ» ´ëÃæ º¸´Ï ¾ÆÆÄÄ¡ http ¼­¹öÀÇ mod_rewrite¿Í °ÅÀÇ °°Àº °Í °°´Ù. ÀÌÁ¦ ÅèĹ ¸¸À¸·Îµµ º¹ÀâÇÑ URL °íÃľ²±â°¡ °¡´ÉÇÑ °ÍÀÌ´Ù.
  • ÀÚ¹Ù 7 ÀÌ»óÀÌ ÇÊ¿äÇÏ´Ù
  • ºñÂ÷´Ü½Ä ÀÔÃâ·ÂÀ» Áö¿øÇϱâ À§ÇØ NIO Ä¿³ØÅÍ°¡ ±âº» ¼³Á¤ÀÌ µÆ´Ù. ÀÌÀüó·³ BIO³ª APR/³×ÀÌƼºê ÀÔÃâ·Âµµ °è¼Ó Áö¿øÇÑ´Ù.
  • DB ¿¬°á Ç®¸µ¿¡´Â ±×Àü±îÁö DBCP¸¦ »ç¿ëÇߴµ¥ ÀÌÁ¦ DBCP 2°¡ ±âº»ÀÌ µÆ´Ù. ¾ÆÆÄÄ¡ DBCP¿¡¼­´Â ¸íÈ®È÷ DBCP 2°¡ ¹ßÇ¥µÇÁö ¾ÊÀº »óÅÂÀε¥ ¾Æ¸¶µµ ÅèĹ¿¡¼­ ¸ÕÀú ±¸ÇöÇÏ°í ÀÖ´Â °Ô ¾Æ´Ò±î »ý°¢µÈ´Ù.

ÀÏÁ¤

ÅèĹ 8ÀÇ ÀÏÁ¤Àº ´ÙÀ½°ú °°´Ù°í ÇÑ´Ù.

  • ÀÚ¹Ù EE 7¿¡¼­ ±¸ÇöÇÒ ±â´ÉÀº ¸ðµÎ ¿Ï·áµÈ »óÅÂ
  • 8.0.3 º£Å¸¿¡ ´ëÇØ 2¿ù 9ÀÏ ÅõÇ¥ ¿¹Á¤
  • »ó¿ëÀ¸·Î »ç¿ëÇϱ⿡´Â ¾ÆÁ÷ À̸¥ º£Å¸ ¹öÀüÀÎ »óÅÂ

ÀÌ»óÀ¸·Î ¿þºñ³ª ¹× ³»°¡ °£´ÜÈ÷ ã¾Æº» ³»¿ë Á¤¸®¸¦ ¸¶Ä¡±â·Î ÇÑ´Ù. º£Å¸ ¹öÀü »óŹǷΠ½ÇÀü¿¡¼­ »ç¿ëÇϱ⿡´Â ºÎÁ·ÇÏ´Ù°í ÇÏÁö¸¸ ÅèĹÀÌ ¿ø·¡ °³¹ßÀÚµéÀÌ ¼Õ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â À¥ ¼­ºí¸´ ÄÁÅ×À̳ʿ´À¸¹Ç·Î °³¹ß´Ü¿¡¼­ ÅèĹ 8À» »ç¿ëÇÏ´Â µ¥ º° ¹®Á¦´Â ¾øÀ» °Í °°´Ù. ¸ð¹ÙÀÏ È¯°æÀ̳ª HTML 5°¡ Áß¿äÇÑ È帧ÀÎ ½Ã´ë°¡ µÆÀ¸¹Ç·Î ¼­ºí¸´/JSP³ª À¥¼ÒÄÏ µîÀÇ ÃֽŠ±â¼úÀ» ³²º¸´Ù ¸ÕÀú »ç¿ëÇغ¸´Â °ÍÀÌ ¿©·¯ ¸ð·Î À¯ÀÍÇÏÁö ¾ÊÀ»±î »ý°¢µÈ´Ù.