SPRING
2017.04.28 / 10:10

¸ÖƼ ¾²·¹µå ȯ°æ¿¡¼­ ½ºÇÁ¸µºó ÁÖÀÇ»çÇ×

MultiPlayer
Ãßõ ¼ö 218

¾ó¸¶Àü ¡°CBT Live¡± Å×½ºÆ®(½ÇÁ¦ ¼­ºñ½º Àåºñ¿¡¼­ ¼º´É/±â´É ÅëÇÕ Å×½ºÆ®)¸¦ Çϸ鼭
¹ß»ýÇÑ ¹®Á¦¸¦ °øÀ¯ÇÏ°íÀÚ ÇÕ´Ï´Ù.

(1) Áõ»ó

¿ÜºÎ ½Ã½ºÅÛ¿¡ ¡°A¡°¶ó´Â »ç¿ëÀÚ Á¤º¸¸¦ ¿äû Çߴµ¥, È®ÀÎÀ» Çغ¸´Ï ¡°B¡± »ç¿ëÀÚ
Á¤º¸°¡ µî·ÏÀÌ µÇ¾ú½À´Ï´Ù.

¡°Local¡± °³¹ß ȯ°æ¿¡¼­´Â ÀüÇô ±×·± Áõ»óÀÌ ¾ø¾ú°í, ½ÇÁ¦·Î ¼­ºñ½º¸¦ ÇÏ·Á´Â
¡°CBT¡± °³¹ß ȯ°æ¿¡¼­ ¡°¼º´É/±â´É Å×½ºÆ®¡°¸¦ Çϸ鼭 ÇØ´ç À̽´°¡ ¹ß»ýÀ» ÇÏ¿´½À´Ï´Ù.

±×·¡¼­ ¡°log¡°¸¦ È®ÀÎÇß½À´Ï´Ù.
±×·±µ¥ ÀÌ»óÇÑ Á¡ÀÌ ¡°¿äûÀ» À§ÀÓÇÏ´Â ¸ðµâ¡°¿¡¼­´Â Á¤È®È÷ ¡°A¡± »ç¿ëÀÚ Á¤º¸
°¡ ÀÖ¾ú°í, ¡°½ÇÁ¦ ¼­¹ö¿Í Åë½ÅÇÏ´Â ¸ðµâ¡°¿¡¼­ ¡°B¡± »ç¿ëÀÚ Á¤º¸¸¦ È£Ãâ Çß½À´Ï´Ù.
È®ÀÎ °á°ú ¡°Spring Bean¡°¿¡ ´ëÇÑ °³¹ßÀÚÀÇ ÀÌÇØ ºÎÁ·À¸·Î ¹ß»ýµÈ ¿¡·¯ ¿´½À´Ï´Ù.
ÇØ°á ¹æ¹ýÀ» ¸»¾¸ µå¸®±âÀü¿¡ ¡°Spring Application Context¡°¿¡ ´ëÇؼ­
°£·«ÇÏ°Ô ¼³¸íÀ» µå¸®°Ú½À´Ï´Ù.

(2) Spring Big Picture

¾Æ·¡ÀÇ ±×¸²Àº ¡°¸ÖƼ ¾²·¹µå ȯ°æ¿¡¼­ ½ºÇÁ¸µ ºó¡± °ü°è¸¦ Á÷Á¢ ±×·ÁºÃ½À´Ï´Ù.

À̹ÌÁö 12

¡°SpringFramework¡± ±â¹ÝÀ¸·Î ¸¸µç ¡°¾îÇø®ÄÉÀ̼ǡ±Àº ±âµ¿½Ã ¡°ApplicationContext¡°¶ó´Â
¡°Static Sharing Pool¡°¸¦ »ý¼º ÇÕ´Ï´Ù.
Á»´õ ½±°Ô ¼³¸íÀ» Çϸé ÇϳªÀÇ ¡°½Ì±ÛÅ桱 ÆÐÅÏ ¹æ½ÄÀÇ ±¸ÇöµÈ ¿ÀºêÁ§Æ®°¡ »ý¼º µË´Ï´Ù.
(Á¤È®È÷´Â ¡°½Ì±ÛÅæ ÆÐÅÏ¡±Àº ¾Æ´Õ´Ï´Ù. ÀÌÇظ¦ µ½±â À§Çؼ­)

ÀÌ·¸°Ô »ý¼ºµÈ ¡°ApplicationContext¡± ¿µ¿ª¿¡ ¡°POJO(Plain Old Java Object) Ŭ·¡½º¡±
µéÀÇ ¿ÀºêÁ§Æ®µéÀÌ µî·ÏÀÌ µË´Ï´Ù.

¡°POJO¡± Ŭ·¡½º´Â ±×³É ¡°new ÇÏ¸é ½º½º·Î »ý¼º¡±ÀÌ °¡´ÉÇÑ Å¬·¡½ºÀÇ ÇüŸ¦ ¸»ÇÕ´Ï´Ù.

ÀÌ·¸°Ô µî·ÏµÈ ¿ÀºêÁ§Æ®¸¦ ¡°Spring Bean¡°À̶ó°í ÇÕ´Ï´Ù.
ºñ·Ï ¡°POJO¡± Ŭ·¡½º¿¡ ¡°static¡°À¸·Î ¼±¾ðÀ» ÇÏÁö ¾Ê´õ¶óµµ, ¡°ApplicationContext¡±
°¡ ÀÌ¹Ì ¡°Sharing¡°ÀÌ µÇ¾î Àֱ⶧¹®¿¡ ¡°´ç¿¬È÷ µî·ÏµÈ Bean¡±·Î
¡°¸ÖƼ Thread ȯ°æ¡°¿¡¼­ ¼­·Î °øÀ¯¸¦ ÇÏ°Ô µË´Ï´Ù.
(¹°·Ð prototypeÀÏ °æ¿ì´Â ¸Å¹ø »ý¼ºÀ» ÇÕ´Ï´Ù.)

À§¿¡ ±×¸²À» º¸¸é ¡°JVM¡±¿¡¼­ ÇϳªÀÇ °øÀ¯ ¡°ApplicationContext¡±°¡ »ý¼ºÀÌ µÇ¸ç
¡°Spring Bean #1¡±, ¡°Spring Bean #2¡±, ¡°Spring Bean #3¡± µî
3°³ÀÇ ¡°Bean¡±ÀÌ µî·ÏÀÌ µÇ¾î ÀÖ°í, ¡°1¹øºÎÅÍ 10¹ø Thread ¸ðµÎ 
µ¿ÀÏÇÑ Bean ¿ÀºêÁ§Æ®¡°¸¦ »ç¿ëÀ» ÇÕ´Ï´Ù.

¿©±â±îÁö´Â ¡°SpringFramework¡°¸¦ °³¹ßÇϽŠºÐµéÀº ¾Ë°í °è½Ç °Ì´Ï´Ù.

¹®Á¦´Â °³¹ßÀÚµéÀÌ Spring BeanÀÇ ¸â¹öº¯¼ö ¶ÇÇÑ ¸ÖƼ¾²·¹µå ȯ°æ¿¡¼­
°øÀ¯°¡ µÈ´Ù´Â °ÍÀ» °£°úÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.

ÀÌ·¯ÇÑ ½Ç¼ö´Â ¡°Thread Safe¡± ÇÑ ÇÁ·¹ÀÓ¿÷(Servlet, Netty Handler, Camel Router, Spring Controller)µé¿¡ ´ëÇÑ ¿ÀÇØ ¶§¹®ÀÔ´Ï´Ù.

¹®¼­¸¦ º¸¸é ´ç¿¬È÷ ¡°Thread Safe¡°ÇÏ´Ù°í ¸í½ÃµÈ ºÎºÐ¸¸À» È®ÀÎÇÏÁö, ½ÇÁ¦ ¾îµð±îÁö
¡°Thread Safe¡°ÇÏÁö ¾Ê´ÂÁö È®ÀÎÀ» Àß ¾ÈÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.

´ëºÎºÐ public ¸Þ¼­µå¡±¾È¿¡¼­ ¼±¾ðµÈ ·ÎÄà º¯¼ö°¡ ¡°Thread Safe¡±ÇÑ°ÅÁö ¡°¸â¹öº¯¼ö¡±
±îÁö ¡°Thread Safe¡± ÇÏ´Ù¶ó´Â °ÍÀÔ´Ï´Ù. Áï Á¤È®ÇÑ È®ÀÎÀÌ ÇÊ¿ä ÇÕ´Ï´Ù.

(3) ÇØ°á ¹æ¹ý ¹× ÄÚµù °¡À̵å

¾Æ·¡´Â °³¹ßÀÚ°¡ ¹®Á¦¸¦ ÀÏÀ¸Ä×´Ü ¼Ò½º ÀÔ´Ï´Ù.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Service
public class MemberController{
 
    @Autowired
    private UserRepository userRepository;
 
    private Member member = new Member();
 
    public void createUser(String id, String name) throws Exception {
 
        member.setID(id);
        member.setName(name);
        userRepository.insertUser(member);
 
    }
}

7 Line : ¸â¹öº¯¼ö ¡°Member¡± ¿ÀºêÁ§Æ®¸¦ »ý¼º ÇÕ´Ï´Ù.
11 Line : ÆĶó¹ÌÅÍ id¸¦ member ¿ÀºêÁ§Æ®ÀÇ id ¼Ó¼º¿¡ °ª ¼³Á¤À» ÇÕ´Ï´Ù
12 Line : ÆĶó¹ÌÅÍ name¸¦ member ¿ÀºêÁ§Æ®ÀÇ name ¼Ó¼º¿¡ °ª ¼³Á¤À» ÇÕ´Ï´Ù

¼Ò½º¸¦ º¸¸é À§¿¡¼­ ¾ð±ÞÇÑ°Í Ã³·³ ¡°¸â¹öº¯¼ö¡°¸¦ ¡°Bean¡± ÃÖÃÊ »ý¼º½Ã ÃʱâÈ­¸¦ ÇÕ´Ï´Ù.
±× ´ÙÀ½ ºÎÅÍ´Â ¡°createUser¡± ¸Þ¼­µå¿¡¼­ °è¼Ó Àç»ç¿ëÀ» ÇÕ´Ï´Ù.
´ç¿¬È÷ ¡°createUser¡± ¸Þ¼­µå´Â ¡°Thread Safe¡± ÇÕ´Ï´Ù. ÇÏÁö¸¸ ¹®Á¦´Â ¡°¸â¹öº¯¼ö¡± ÀÔ´Ï´Ù.

ÇØ´ç Äڵ带 ¾Æ·¡¿Í °°ÀÌ ¡°¸®ÆÑÅ丵¡± ÇØ¾ß ÇÕ´Ï´Ù.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class MemberController{
 
    @Autowired
    private UserRepository userRepository;
 
    public void createUser(String id, String name) throws Exception {
        Member member = new Member();
        member.setID(id);
        member.setName(name);
        userRepository.insertUser(member);
 
    }
}

8 Line :  ¸â¹öº¯¼ö ºÎºÐÀ» »èÁ¦ÇÏ°í, ´ë½Å ¡°createUser¡± ¸Þ¼­µå¿¡¼­ »ý¼ºÀ» ÇÕ´Ï´Ù.
ÄÚµå´Â »ó´çÈ÷ °£´Ü ÇÕ´Ï´Ù. °£È¤ ¹°¾î º¸½Ã´Â ºÐµéÀÌ ¡°Àú·¸°Ô ¸Å¹ø »ý¼ºÇϸ顱 ¸Þ¸ð¸®¿¡
ºÎ´ãÀÌ ÀÖ´Â°Í ¾Æ´Ï³Ä ÇϽô ºÐµéÀÌ ÀÖ½À´Ï´Ù.

¡°createUser¡± ¸Þ¼­µå°¡ Á¾·áµÇ¸é ÀÚ¿¬½º·´°Ô ¡°member¡± ¿ÀºêÁ§Æ®´Â ¡°GC¡±
´ë»óÀÌ µË´Ï´Ù.

(4) Conclusion

¡°¸ÖƼ ¾²·¹µå ȯ°æ¿¡¼­ ½ºÇÁ¸µºó ÁÖÀÇ»çÇס°¿¡ ´ëÇؼ­ ¸»¾¸ µå·È½À´Ï´Ù.
»ç½Ç º°°Å ¾Æ´Ò¼ö ÀÖÁö¸¸ »ó´çÈ÷ ÁÖÀǸ¦ ¿äÇϸç, °³¹ß½Ã¿¡ ÆÀ¿øµé¿¡°Ô ¼÷Áö¸¦
ÇØ¾ß Çϸç, ÆÀÀå ¶Ç´Â ¼±ÀÓ °³¹ßÀÚµéÀº ¡°ÄÚµå Inspection¡°½Ã ¹Ýµå½Ã
ÀÌ ºÎºÐ¿¡ ´ëÇÑ Á¡°ËÀÌ ÇÊ¿ä ÇÕ´Ï´Ù.

¿Ø¸¸ÇÏ¸é ¡°½ºÇÁ¸µ¡±¿¡¼­ ¡°¸â¹öº¯¼ö¡±´Â ¡°Injection¡°¿¡ »ç¿ëÇÏ´Â ¡°bean¡°ÀÏ °æ¿ì¸¸
»ç¿ëÇϵµ·Ï ±Ç°í µå¸³´Ï´Ù.

Á¦°¡ ¿Ö ÀÌ·¸°Ô °­Á¶¸¦ ÇÏ´Â ÀÌÀ¯´Â

µð¹ö±ëÀÌ ÇϱⰡ ³Ê¹« ¾î·Æ´Ù´Â ÀÌÀ¯ ÀÔ´Ï´Ù. ´ëºÎºÐ °³¹ß½Ã¿¡´Â
°³¹ßÀÚ È¯°æÀº ¸ÖƼ ¾²·¹µå ȯ°æÀÌ ¾Æ´Õ´Ï´Ù. ±×·¸±â ¶§¹®¿¡

¹ß°ßÀÌ °ÅÀÇ µÇÁö¸¦ ¾Ê½À´Ï´Ù.  ´ëºÎºÐ °³¹ß ÈĹݿ¡ ¼º´É Å×½ºÆ®
ÇÒ¶§ ¹ß°ßÀÌ µË´Ï´Ù.

ƯÁ¤ ¼­¹ö°¡ CPU¸¦ ¸¹ÀÌ Â÷Áö Çϰųª, ¸Þ¸ð¸® »ç¿ë·üÀ» ¸¹ÀÌ Á¡À¯Çϸé
thread dump¸¦ ¶°¼­ È®ÀÎÀ» ÇÏÁö¸¸ ÀÌ·¸°Ô thread°£ race condition
±úÁø °æ¿ì´Â dump¶°¼­ È®ÀÎÀÌ Èûµé°í, ƯÈ÷³ª ¿©·¯ Ŭ·¡½º¿¡ ±×·¸°Ô
»ç¿ëÀ» ÇÏ¸é ´õ ã±â°¡ ¾î·Æ½À´Ï´Ù.

ÃÖ¾ÇÀÇ °æ¿ì´Â ÇÁ·ÎÁ§Æ® ¸·¹ÙÁö´Â ¡°¸àºØ¡± »óÅÂÀ̱⠶§¹®¿¡ ¡°¼±¹«´ç¡±ÀÌ »ç¶÷ Àâ´Â´Ù°í
Àüü ¼­¹ö¿¡ JDK¸¦ ´Ù¸¥ ¹öÀüÀ» ¼³Ä¡ Çϰųª, WAS¸¦ ´Ù½Ã ¼³Ä¡ Çϰųª, ½ÉÁö¾î 
OS Ä¿³Î ¶Ç´Â ¹öÀüÀ» ¹Ù²ã¾ß ÇÑ´ÙµçÁö ´õ Å« »óȲÀ¸·Î Ä¡´ÝÀ»¼ö ÀÖ½À´Ï´Ù.

¶ÇÇÑ ¼ö½Ê, ¼ö¹é¸íÀÌ ÀÌ·± Äڵ带 ¾ç»êµÉ °æ¿ì´Â ´õ´õ¿í Æ®·¯ºí ½´ÆÃÀÌ ¾î·Æ½À´Ï´Ù.
ÀÌÁ¡ À¯³äÇÏ½Ã°í °³¹ß ÇϼÌÀ¸¸é ÇÕ´Ï´Ù.