Æ®·£Àè¼Ç °æ°è¼³Á¤°ú °í¸³È °¡À̵å¶óÀÎ
Brian
Goetz ÄÁ¼³ÅÏÆ®, Quiotix Corp 2002³â 5¿ù
JTS ½Ã¸®Á ÅëÇØ BrianÀº Æ®·£Àè¼ÇÀÇ ±âÃÊ¿Í
J2EE ÄÁÅ×À̳ʰ¡ Æ®·£Àè¼Ç ¼ºñ½º¸¦ EJB ÄÄÆ÷³ÍÆ®¿¡ Åõ¸íÇÏ°Ô ÇÒ ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇß´Ù. À̹ø¿¡´Â Æ®·£Àè¼Ç
°æ°èÈ¿Í °í¸³È °ü¸®¿¡ ÇÊ¿äÇÑ J2EE ±â´ÉÀ» ¼³¸íÇÑ´Ù. ¶ÇÇÑ ±×µéÀ» È¿°úÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â °¡À̵å¶óÀεµ
Á¦½ÃÇÑ´Ù.
Part 1 ("JTS ÀÌÇØÇϱâ - Æ®·£Àè¼Ç¿¡ ´ëÇÑ ¼Ò°³")°ú Part 2 ("JTS ÀÌÇØÇϱâ - À帷 µÚÀÇ ¸¶¹ý ")¿¡¼ Æ®·£Àè¼ÇÀÌ ¹«¾ùÀÎÁö¸¦ Á¤ÀÇÇß°í
Æ®·£Àè¼ÇÀÇ ±âº» ¼Ó¼º, Java Transaction Service¿Í J2EE ÄÜÅ×À̳ʰ¡ ÇÔ²² ÀÛµ¿ÇÏ¿© J2EE
ÄÄÆ÷³ÍÆ®¸¦ Áö¿øÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇß´Ù. ÀÌÁ¦´Â Æ®·£Àè¼Ç °æ°èÈ(demarcation)¿Í °í¸³(isolation)¿¡
´ëÇØ ¾Ë¾Æº¸ÀÚ.
EJB ÄÄÆ÷³ÍÆ®ÀÇ Æ®·£Àè¼Ç °æ°èÈ¿Í °í¸³ ¼Ó¼ºÀ» Á¤ÀÇÇϴ åÀÓÀº ¾ÖÇø®ÄÉÀÌ¼Ç ¾î¼Àºí·¯¿¡ ÀÖ´Ù. À̵éÀ»
ºÎÀûÀýÇÏ°Ô ¼³Á¤Çϸé ÆÛÆ÷¸Õ½º, È®À强, ¾ÖÇø®ÄÉÀ̼ÇÀÇ ³»±¸¼º¿¡ ½É°¢ÇÑ °á°ú¸¦ ÃÊ·¡ÇÒ ¼ö ÀÖ´Ù. ºÒÇàÈ÷µµ ÀÌ·¯ÇÑ
¼Ó¼ºµéÀ» ÀûÀýÈ÷ ¼³Á¤ÇÏ´Â µ¥¿¡ Á¤ÇØÁø ±ÔÄ¢ °°Àº °ÍÀº ¾ø´Ù. ´Ù¸¸ º´Ç༺ À§Çè°ú ÆÛÆ÷¸Õ½º À§Çè »çÀÌ¿¡¼ ±ÕÇüÀ»
ãµµ·Ï µµ¿ÍÁÖ´Â °¡À̵å¶óÀÎÀÌ ÀÖÀ» »ÓÀÌ´Ù.
Part 1¿¡¼ ´Ù·ç¾úµíÀÌ Æ®·£Àè¼ÇÀº ±âº»ÀûÀ¸·Î ¿¹¿Ü ó¸®(exception-handling)
¸ÅÄ¿´ÏÁòÀÌ´Ù. ¹«¾ùÀΰ¡ À߸øµÇ¾ú´Ù¸é º¹±¸ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ½ÇÁ¦·Î ³ª»Û »óÅ°¡ µÇ´Â °ÍÀº °ÅÀÇ
¾ø±â ¶§¹®¿¡ ºñ¿ë°ú ½Ã°£ ÇÒ¾Ö¸¦ ÃÖ¼ÒÈ ÇÒ ¼ö ÀÖ´Ù. ¾ÖÇø®ÄÉÀ̼ǿ¡¼ Æ®·£Àè¼ÇÀ» »ç¿ëÇÏ´Â ¹æ¹ý¿¡ µû¶ó
¾ÖÇø®ÄÉÀÌ¼Ç ÆÛÆ÷¸Õ½º¿Í È®À强¿¡ Å« ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Ù.
Æ®·£Àè¼Ç
°æ°èÈ J2EE ÄÜÅ×À̳ʴ Ʈ·£Àè¼ÇÀÌ ¾îµð¿¡¼ ½ÃÀÛÇÏ°í ³¡³ª´ÂÁö¸¦ Á¤ÀÇÇÏ´Â µÎ °¡Áö
¸ÅÄ¿´ÏÁò (ºó °ü¸®(bean-managed) Æ®·£Àè¼Ç°ú ÄÜÅ×ÀÌ³Ê °ü¸®(container-managed)
Æ®·£Àè¼Ç)À» Á¦°øÇÑ´Ù. ºó °ü¸® Æ®·£Àè¼ÇÀÇ °æ¿ì
UserTransaction.begin() °ú
UserTransaction.commit() À» ÀÌ¿ëÇÏ¿© ºó(bean) ¸Þ¼Òµå¿¡¼
Æ®·£Àè¼ÇÀ» ½ÃÀÛÇÏ°í ³¡³½´Ù. ¹Ý¸é, ÄÜÅ×ÀÌ³Ê °ü¸® Æ®·£Àè¼ÇÀÇ °æ¿ì Á» ´õ ¸¹Àº À¯¿¬¼ºÀ» Á¦°øÇÑ´Ù. ¾î¼Àºí¸®
µð½ºÅ©¸³ÅÍ¿¡ °¢ EJB ¸Þ¼Òµå¸¦ À§ÇÑ Æ®·£Àè¼Ç ¼Ó¼ºÀ» Á¤ÀÇÇÔÀ¸·Î¼ °¢ ¸Þ¼Òµå º°·Î Æ®·£Àè¼Ç ¿ä±¸»çÇ×ÀÌ ¹«¾ùÀÎÁö¸¦
ÁöÁ¤ÇÒ ¼ö ÀÖ°í ÄÜÅ×À̳ʰ¡ Æ®·£Àè¼ÇÀ» ¾ðÁ¦ ½ÃÀÛÇÏ°í ³¡³»¾ß ÇÏ´ÂÁö¸¦ °áÁ¤Çϵµ·Ï ÇÒ ¼ö ÀÖ´Ù. µÎ °æ¿ì ¸ðµÎ
Æ®·£Àè¼ÇÀ» ¼³°èÇÏ´Â ±âº» °¡À̵å¶óÀÎÀº °°´Ù.
Àü·« Æ®·£Àè¼Ç °æ°èÈÀÇ Ã¹ ¹ø° ±ÔÄ¢Àº "ª°Ô
À¯ÁöÇÒ°Í!" Æ®·£Àè¼ÇÀº º´Çà Á¦¾î¸¦ Á¦°øÇÑ´Ù. ÀÌ°ÍÀº ¸®¼Ò½º ¸Å´ÏÀú°¡ Æ®·£Àè¼Ç °úÁ¤ Áß¿¡ ¾×¼¼½ºÇÑ µ¥ÀÌÅÍ
¾ÆÀÌÅÛÀ» ´ë½ÅÇÏ¿© lockÀ» ¾ò¾î Æ®·£Àè¼ÇÀÌ ³¡³¯¶§±îÁö ±×µéÀ» º¸À¯ÇÏ°í ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¿©·¯ºÐÀÌ
lockÀ» º¸À¯ÇÏ°í ÀÖ´Â µ¿¾È¿¡ ´Ù¸¥ Æ®·£Àè¼ÇÀº lockÀ» ÇØÁ¦ÇÒ ¶§±îÁö ±â´Ù¸°´Ù. Æ®·£Àè¼ÇÀÌ ¸Å¿ì ±æ¾îÁö¸é
¸ðµç ´Ù¸¥ Æ®·£Àè¼ÇµéÀº ÀúÁö´çÇÏ°í ¾ÖÇø®ÄÉÀÌ¼Ç ¾²·çDzÀº ³»·Á°¡±â ¸¶·ÃÀÌ´Ù.
Rule 1: Æ®·£Àè¼ÇÀ» °¡´ÉÇÑ ÇÑ Âª°Ô À¯ÁöÇ϶ó!
Æ®·£Àè¼ÇÀ» ª°Ô À¯ÁöÇÔÀ¸·Î¼ ¾ÖÇø®ÄÉÀ̼ÇÀÇ È®À强À» Çâ»ó½ÃŲ´Ù. Æ®·£Àè¼ÇÀ» °¡´ÉÇÑ Âª°Ô À¯ÁöÇÏ´Â ÃÖ»óÀÇ
¹æ¹ýÀº Æ®·£Àè¼ÇÀÇ Áß°£¿¡ ºÒÇÊ¿äÇÏ°Ô ½Ã°£À» ÇãºñÇÏ´Â ¾î¶² ÀÛ¾÷µµ ¼öÇàÇÏÁö ¾Ê°í Ưº°È÷ Æ®·£Àè¼ÇÀÇ Áß°£¿¡ »ç¿ëÀÚ
ÀÎDzÀ» ±â´Ù¸®Áö ¾Ê´Â´Ù.
Æ®·£Àè¼ÇÀ» ½ÃÀÛÇÏ°í µ¥ÀÌÅͺ£À̽º¿¡¼ µ¥ÀÌÅ͸¦ µµÃâÇÏ¿© µ¥ÀÌÅ͸¦ µð½ºÇ÷¹ÀÌÇÏ°í »ç¿ëÀÚ¿¡°Ô Æ®·£Àè¼Ç µ¿¾È
¼±ÅÃÀ» Çϵµ·Ï ¿äûÇÏ°í ½ÍÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ·¸°Ô ÇÏÁö ¸»±â¸¦ ¹Ù¶õ´Ù. »ç¿ëÀÚ°¡ ÁÖÀǸ¦ ±â¿ïÀÌ´õ¶óµµ ÀÀ´äÇϱâ
±îÁö´Â ¼ö ÃÊ°¡ °É¸®°í ÀÌ´Â µ¥ÀÌÅͺ£À̽º¿¡¼ lockÀ» º¸À¯Çϱ⿣ ±ä ½Ã°£ÀÌ´Ù. »ç¿ëÀÚ°¡ Á¡½ÉÀ» ¸Ô°Å³ª Áý¿¡
°¡±âÀ§ÇØ ÄÄÇ»ÅÍ¿¡¼ ¹°·¯³ª±â¶óµµ ÇÑ´Ù¸é ¾î¶»°Ô µÉ±î? ¾ÖÇø®ÄÉÀ̼ÇÀº °£´ÜÈ÷ ¸ØÃß°Ô µÉ °ÍÀÌ´Ù. Æ®·£Àè¼Ç µµÁß¿¡
I/O¸¦ ¼öÇàÇÏ´Â °ÍÀº Àç¾ÓÀ¸·Î °¡´Â ºñ°áÀÌ´Ù.
Rule 2: Æ®·£Àè¼Ç µµÁß »ç¿ëÀÚ ÀÎDzÀ» ±â´Ù¸®Áö ¸»°Í!
°ü·Ã ¿ÀÆÛ·¹À̼ÇÀ» ÇÔ²² ±×·ìÇÎ
ÇÒ °Í °¢ Æ®·£Àè¼ÇÀº Áß´ëÇÑ ¿À¹öÇìµå¸¦ °®°íÀֱ⠶§¹®¿¡ ¿ÀÆÛ·¹ÀÌ¼Ç ´ç ¿À¹öÇìµå¸¦
ÃÖ¼ÒÈÇϱâÀ§ÇØ ´ÜÀÏ Æ®·£Àè¼Ç¿¡¼ °¡´ÉÇÑ ¸¹Àº ¿ÀÆÛ·¹À̼ÇÀ» ¼öÇàÇÏ´Â °ÍÀÌ ÃÖ»óÀÇ ¹æ¹ýÀ̶ó°í »ý°¢ÇÒ ¼öµµ ÀÖ´Ù.
ÇÏÁö¸¸ Rule 1¿¡ µû¸£¸é ±ä Æ®·£Àè¼ÇÀº È®À强¿¡ ³ª»Ú´Ù°í ÇÑ´Ù. ±×·¸´Ù¸é ¿ÀÆÛ·¹ÀÌ¼Ç´ç ¿À¹öÇìµå¸¦ ÁÙÀÌ´Â °Í°ú
È®À强 »çÀÌÀÇ ±ÕÇüÀ» ¾î¶»°Ô ¸ÂÃß¸é µÇ´Â°¡?
Rule 1--Æ®·£Àè¼Ç ´ç ÇÑ ¿ÀÆÛ·¹À̼Ç--À» ³í¸®Àû ¸¶Áö¸· ¼ö´ÜÀ¸·Î ÃëÇÑ´Ù¸é Ãß°¡ÀûÀÎ ¿À¹öÇìµå¸¦ °¡Á®¿Ã
»Ó ¾Æ´Ï¶ó ¾ÖÇø®ÄÉÀÌ¼Ç »óÅÂÀÇ ÀÏ°ü¼ºµµ ŸÇùÇÏ°Ô µÈ´Ù. Æ®·£Àè¼Ç ¸®¼Ò½º ¸Å´ÏÀú´Â ¾ÖÇø®ÄÉÀÌ¼Ç »óÅÂÀÇ ÀÏ°ü¼ºÀ»
°ü¸®Çϵµ·Ï µÇ¾îÀÖ´Ù. ÇÏÁö¸¸ ±×µéÀº ÀÏ°ü¼ºÀ» Á¤ÀÇÇϱâ À§ÇØ ¾ÖÇø®ÄÉÀ̼ǿ¡ ÀÇÁ¸ÇÑ´Ù. »ç½Ç Æ®·£Àè¼ÇÀ» ¼³¸íÇÒ ¶§
¿ì¸®°¡ »ç¿ëÇÏ´Â ÀÏ°ü¼ºÀÇ Á¤ÀÇ´Â ´Ù¼Ò ¸ðÈ£ÇÏ´Ù. ÀÏ°ü¼ºÀº ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¸»ÇÏ´Â ¸ðµç°ÍÀ» ÀǹÌÇÑ´Ù.
Part 1¿¡¼´Â ÇÑ ¾îÄ«¿îÆ®¿¡¼ ´Ù¸¥ ¾îÄ«¿îÆ®·Î ÀÚ±ÝÀ» À̵¿ÇÏ´Â ¹ðÅ· ¾ÖÇø®ÄÉÀÌ¼Ç ¿¹Á¦¸¦ º¸¾Ò´Ù.
Listing 1Àº SQL·Î ÇÒ ¼ö ÀÖ´Â ±¸ÇöÀ» º¸¿©ÁØ´Ù. ´Ù¼¸ °³ÀÇ SQL ÀÛµ¿ÀÌ Æ÷ÇԵǾîÀÖ´Ù:
Listing 1. ÀÚ±Ý ÀÌü¿ë SQL ÄÚµå »ùÇÃ
SELECT accountBalance INTO aBalance
FROM Accounts WHERE accountId=aId;
IF (aBalance >= transferAmount) THEN
UPDATE Accounts
SET accountBalance = accountBalance - transferAmount
WHERE accountId = aId;
UPDATE Accounts
SET accountBalance = accountBalance + transferAmount
WHERE accountId = bId;
INSERT INTO AccountJournal (accountId, amount)
VALUES (aId, -transferAmount);
INSERT INTO AccountJournal (accountId, amount)
VALUES (bId, transferAmount);
ELSE
FAIL "Insufficient funds in account";
END IF
|
´Ù¼¸ °³ÀÇ °³º° Æ®·£Àè¼ÇÀ¸·Î¼ ÀÌ ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇàÇÑ´Ù¸é ¾î¶² ÀÏÀÌ ¹ß»ýÇÒ±î? ´À·ÁÁö´Â °ÍÀº ¹°·Ð ÀÏ°ü¼ºµµ
ÀҰԵȴÙ. ¿¹¸¦µé¾î ´©±º°¡°¡ ù ¹ø° SELECT ½ÇÇà°ú ¿¬¼ÓÀûÀÎ Â÷º¯ UPDATE »çÀÌ¿¡ °³º° Æ®·£Àè¼ÇÀ¸·Î
ÀϺημ A ¾îÄ«¿îÆ®¿¡¼ µ·À» ÀÎÃâÇÑ´Ù¸é ¾î¶»°Ô µÉ±î? ÀÌ°ÍÀº ÀÌ Äڵ忡 ÀÇÇØ ½ÃÇàµÇ¾î¾ß ÇÏ´Â ºñÁö´Ï½º ±ÔÄ¢À»
À§¹ÝÇÑ °ÍÀÌ µÈ´Ù. ½Ã½ºÅÛÀÌ Ã¹ ¹ø° UPDATE¿Í µÎ¹ø° UPDATE »çÀÌ¿¡¼ °íÀå³´Ù¸é ¾î¶»°Ô µÉ±î?
½Ã½ºÅÛÀÌ º¹±¸µÇ¸é µ·Àº A ¾îÄ«¿îÆ®¿¡ ³²¾ÆÀÖ°Ô µÇÁö¸¸ B ¾îÄ«¿îÆ®¿¡ ±âÀÔµÇÁö ¾Ê°ÔµÇ°í ÀÌÀ¯´Â ±â·ÏµÇÁö ¾Ê´Â´Ù.
ÀÌ°ÍÀº µÎ °èÁ¤ÀÇ ¼ÒÀ¯ÀÚ¿¡°Ô ¾ÈÁÁÀº ÀÏÀÌ´Ù.
Listing 1ÀÇ ´Ù¼¸ °³ÀÇ SQL ¿ÀÆÛ·¹À̼ÇÀº ÇϳªÀÇ °ü·ÃµÈ ¿ÀÆÛ·¹À̼ÇÀ¸·Î º¼ ¼ö ÀÖ´Ù. Áï µ·À» ÇÑ
¾îÄ«¿îÆ®¿¡¼ ´Ù¸¥ ¾îÄ«¿îÆ®·Î Àü¼ÛÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù. ±×·¯¹Ç·Î ¿ì¸®´Â ¸ðµç°ÍÀÌ ½ÇÇàµÇ°Å³ª ¾Æ¿¹ ½ÇÇàµÇÁö ¾Ê°Å³ª
Çϱ⸦ ¹Ù¶ó´Â °ÍÀÌ´Ù. ±×µéÀÌ ´ÜÀÏ Æ®·£Àè¼Ç¿¡¼ ¸ðµÎ ½ÇÇàµÇ¾î¾ß ÇÏ´Â ÀÌÀ¯°¡ ¹Ù·Î ÀÌ°ÍÀÌ´Ù.
Rule 3: °ü·Ã ¿ÀÆÛ·¹À̼ÇÀ» ´ÜÀÏ Æ®·£Àè¼ÇÀ¸·Î ±×·ìÇÎ ÇÒ°Í!
ÀÌ»óÀûÀÎ
±ÕÇü Rule 1Àº Æ®·£Àè¼ÇÀÌ µÇµµ·ÏÀ̸é ª¾ÆÁ®¾ß ÇÒ °ÍÀ» ¿ä±¸ÇÏ°í ÀÖ´Ù.
Listing 1ÀÇ ¿¹Á¦¿¡¼´Â ÀÏ°ü¼ºÀ» À¯ÁöÇϱâ À§Çؼ °¡²ûÀº ¿ÀÆÛ·¹À̼ǵéÀ» ÇϳªÀÇ Æ®·£Àè¼ÇÀ¸·Î ¹¾î¾ß ÇÑ´Ù´Â
°ÍÀ» º¸¿©ÁÖ¾ú´Ù. ¹°·Ð ÀÌ ¸ðµç °ÍÀº ¾î¶² ±¸¼º¿ä¼ÒµéÀÌ "°ü·Ã ¿ÀÆÛ·¹À̼Ç"ÀÎÁö¸¦ °áÁ¤ÇÏ´Â ¾ÖÇø®ÄÉÀ̼ǿ¡
ÀÇÁ¸ÇÑ´Ù. Rule 1°ú 3À» Á¶ÇÕÇÏ¿© Æ®·£Àè¼ÇÀÇ ¹üÀ§¸¦ ¼³¸íÇÏ´Â ÀϹÝÀûÀÎ °¡À̵å¶óÀÎÀ» ¸¸µé¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ
Rule 4 ÀÌ´Ù:
Rule 4: °ü·Ã ¿ÀÆÛ·¹À̼ÇÀ» ´ÜÀÏ Æ®·£Àè¼ÇÀ¸·Î ±×·ìÇÎÇ϶ó. ´Ü, ¿¬°ü¼º ¾ø´Â
¿ÀÆÛ·¹À̼ÇÀº °³º° Æ®·£Àè¼ÇÀ¸·Î ³õÀ»°Í!
ÄÜÅ×ÀÌ³Ê °ü¸®
Æ®·£Àè¼Ç ÄÜÅ×ÀÌ³Ê °ü¸® Æ®·£Àè¼ÇÀ» »ç¿ëÇÒ ¶§, Æ®·£Àè¼ÇÀÌ ¾îµð¼ ½ÃÀÛÇÏ¿© ¾îµð¿¡¼
³¡³ª´ÂÁö¸¦ ¸íÈ®È÷ ¼³¸íÇÏ´Â ´ë½Å °¢ EJB ¸Þ¼Òµå¸¦ À§ÇÑ Æ®·£Àè¼Ç ¿ä±¸»çÇ×À» Á¤ÀÇÇÑ´Ù. Æ®·£Àè¼Ç ¸ðµå´Â ºóÀÇ
assembly-descriptor ÀÇ
container-transaction ¼½¼ÇÀÇ
trans-attribute ¿¤¸®¸ÕÆ®¿¡ Á¤ÀǵǾî ÀÖ´Ù. ¸Þ¼ÒµåÀÇ Æ®·£Àè¼Ç ¸ðµå´Â È£Ãâ
¸Þ¼Òµå°¡ Æ®·£Àè¼ÇÀÌ ÀÌ¹Ì Æ÷ÇԵǾî ÀÖ´ÂÁöÀÇ ¿©ºÎ¸¦ ³ªÅ¸³»´Â »óÅÂ¿Í ´õºÒ¾î EJB ¸Þ¼Òµå°¡ È£Ãâ µÉ ¶§ ÄÜÅ×À̳ʰ¡
¾î¶² ¾×¼ÇÀ» ÃëÇÒÁö °áÁ¤ÇÑ´Ù:
- ±âÁ¸ Æ®·£Àè¼Ç¿¡¼ ¸Þ¼Òµå¸¦ Ãß°¡½Ãų°Í!
- »õ·Î¿î Æ®·£Àè¼ÇÀ» ¸¸µé°í ¿©±â¿¡ ¸Þ¼Òµå¸¦ Ãß°¡½Ãų°Í!
- ¸ðµç Æ®·£Àè¼Ç¿¡ ¸Þ¼Òµå¸¦ Ãß°¡ÇÏÁö ¸»°Í!
- ¿¹¿Ü¸¦ ÁÙ°Í!
Listing 2. EJB ¾î¼Àºí¸® µð½ºÅ©¸³ÅÍ »ùÇÃ
<assembly-descriptor>
...
<container-transaction>
<method>
<ejb-name>MyBean</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>MyBean</ejb-name>
<method-name>logError</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>
...
</assembly-descriptor>
|
J2EE ½ºÆÑÀº ¿©¼¸ °³ÀÇ Æ®·£Àè¼Ç ¸ðµå¸¦ Á¤ÀÇÇÑ´Ù: Required ,
RequiresNew , Mandatory ,
Supports , NotSupported ,
Never . Table 1Àº °¢ ¸ðµåÀÇ ÀÛµ¿À» ¿ä¾àÇØ ³õÀº °ÍÀÌ´Ù. ±âÁ¸ Æ®·£Àè¼Ç¿¡ ÀÖÀ»
¶§ È£ÃâµÉ ¶§¿Í Æ®·£Àè¼Ç¿¡ ¾øÀ» ¶§ È£Ãâ µÉ °æ¿ì·Î ºÐ·ùÇß´Ù. °¢ ¸ðµå¸¦ Áö¿øÇÏ´Â EJB ÄÄÆ÷³ÍÆ® À¯Çüµµ
¼³¸íÇß´Ù
Table 1. Æ®·£Àè¼Ç ¸ðµå
Æ®·£Àè¼Ç ¸ðµå |
ºó À¯Çü |
T Æ®·£Àè¼Ç¿¡ ÀÖÀ» ¶§ È£ÃâµÉ °æ¿ìÀÇ ¾×¼Ç |
Æ®·£Àè¼Ç ¹Û¿¡¼ È£ÃâµÉ ¶§ÀÇ ¾×¼Ç |
Required |
Session, Entity, Message-driven |
T¿¡ Æ÷ÇÔ |
»õ·Î¿î Æ®·£Àè¼Ç |
RequiresNew |
Session, Entity |
»õ·Î¿î Æ®·£Àè¼Ç |
»õ·Î¿î Æ®·£Àè¼Ç |
Supports |
Session, Message-driven |
T¿¡ Æ÷ÇÔ |
Æ®·£Àè¼Ç ¾øÀÌ ½ÇÇà |
Mandatory |
Session, Entity |
T¿¡ Æ÷ÇÔ |
Error |
NotSupported |
Session, Message-driven |
Æ®·£Àè¼Ç ¾øÀÌ ½ÇÇà |
Æ®·£Àè¼Ç ¾øÀÌ ½ÇÇà |
Never |
Session, Message-driven |
Error |
Æ®·£Àè¼Ç ¾øÀÌ ½ÇÇà |
ÄÜÅ×ÀÌ³Ê °ü¸® Æ®·£Àè¼Ç¸¸À» »ç¿ëÇÏ´Â ¾ÖÇø®ÄÉÀ̼ǿ¡¼, Æ®·£Àè¼ÇÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Â À¯ÀÏÇÑ ¹æ¹ýÀº Æ®·£Àè¼Ç
¸ðµå°¡ Required ¶Ç´Â RequiresNew ÀÎ EJB
¸Þ¼Òµå¸¦ ÄÄÆ÷³ÍÆ®°¡ È£ÃâÇÒ °æ¿ìÀÌ´Ù. ÄÜÅ×À̳ʰ¡ È£ÃâÇÑ °á°ú·Î¼ Æ®·£Àè¼ÇÀ» ¸¸µé ¶§, ±× Æ®·£Àè¼ÇÀº ¸Þ¼Òµå°¡
¿Ï·áµÉ ¶§ ´ÝÈù´Ù. ¸Þ¼Òµå°¡ Á¤»óÀûÀ¸·Î ¸®ÅϵǸé ÄÜÅ×À̳ʴ Ʈ·£Àè¼ÇÀ» ¹ß»ý½ÃŲ´Ù. ¿¹¿Ü¸¦ ÁÖ¾î ¸Þ¼Òµå°¡ Á¾·áÇϸé
ÄÜÅ×À̳ʴ Ʈ·£Àè¼ÇÀ» ·Ñ¹é(roll back)ÇÏ°í ¿¹¿Ü¸¦ ¼±¾ðÇÑ´Ù. ¸Þ¼Òµå°¡ ±âÁ¸ T Æ®·£Àè¼Ç¿¡ ÀÖÀ» ¶§
È£ÃâµÇ°í ±× Æ®·£Àè¼Ç ¸ðµå´Â ¸Þ¼Òµå°¡ Æ®·£Àè¼Ç ¾øÀÌ ½ÇÇàµÇ°Å³ª »õ·Î¿î Æ®·£Àè¼Ç¿¡¼ ½ÇÇàµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀ»
ÁöÁ¤Çϸé, T Æ®·£Àè¼ÇÀº ¸Þ¼Òµå°¡ ¿Ï·áµÉ ¶§ ±îÁö ÁßÁöÇÏ°í ÀÌÀüÀÇ T Æ®·£Àè¼ÇÀº ½ÃÀ۵ȴÙ.
Æ®·£Àè¼Ç ¸ðµå
¼±ÅÃÇϱ⠺ó ¸Þ¼Òµå¸¦ À§ÇØ ¾î¶² ¸ðµå¸¦ ¼±ÅÃÇØ¾ß ÇÒ±î? ¼¼¼Ç°ú
message-driven beanÀÇ °æ¿ì ¸ðµç È£ÃâÀÌ Æ®·£Àè¼ÇÀÇ ÀϺημ ½ÇÇàµÉ °ÍÀ» È®ÀÎÇϱâ À§ÇØ
Required ¸¦ »ç¿ëÇØ¾ß ÇÏÁö¸¸ ¸Þ¼Òµå°¡ ´õ Å« Æ®·£Àè¼ÇÀÇ ÄÄÆ÷³ÍÆ®°¡ µÇµµ·Ï ÇÒ ¼ö
ÀÖ´Ù. RequiresNew ·Î ½ÃµµÇغ¸ÀÚ. ÀÌ°ÍÀº ¸Þ¼ÒµåÀÇ ÀÛµ¿ÀÌ È£ÃâµÈ ¸Þ¼ÒµåÀÇ Çൿ°ú
°³º°ÀûÀ¸·Î ÀÌ·ç¾îÁø´Ù´Â °ÍÀ» È®½ÅÇÒ ¶§¸¸ »ç¿ëµÉ ¼ö ÀÖ´Ù. RequiresNew ´Â
ÀüÇüÀûÀ¸·Î ½Ã½ºÅÛ¿¡¼ ´Ù¸¥ °´Ã¼µé°ú °ü·ÃÀÌ ¾ø´Â °´Ã¼¸¦ °¡Áö°í »ç¿ëµÈ´Ù.
ºÎÀûÀýÇÑ ¹æ¹ýÀ¸·Î RequiresNew ¸¦ »ç¿ëÇϸé À§¿¡ ¼³¸íÇÑ °Í°ú ºñ½ÁÇÑ °á°ú°¡
µÉ ¼ö ÀÖ´Ù. Listing 1ÀÇ ÄÚµå´Â Çϳª°¡ ¾Æ´Ñ ´Ù¼¸ °³ÀÇ °³º° Æ®·£Àè¼Ç¿¡¼ ½ÇÇàµÇ¾ú°í ÀÌ´Â ¾ÖÇø®ÄÉÀ̼ÇÀ»
ÀÏ°ü¼º ¾ø´Â »óÅ·Π¸¸µé ¼ö ÀÖ´Ù.
CMP (container-managed persistence) ¿£ÅÍƼ ºóÀÇ °æ¿ì,
Required ¸¦ »ç¿ëÇØ¾ß ÇÒ °ÍÀÌ´Ù. Mandatory ¶ÇÇÑ
ÇÕ´çÇÑ ¿É¼ÇÀÌ µÉ ¼ö Àִµ¥ Ưº°È÷ Ãʱ⠰³¹ß¿¡ ¸Â´Ù. CMP ¿£ÅÍƼºó¿¡
RequiresNew ¸¦ »ç¿ëÇÒ ¼ö´Â ¾ø´Ù.
NotSupported ¿Í Never ´Â ºñ Æ®·£Àè¼Ç
¸®¼Ò½º¿ëÀÌ´Ù.
EJB ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¿Ã¹Ù¸£°Ô µðÀÚÀ뵃 ¶§ Æ®·£Àè¼Ç ¸ðµå¿¡ ´ëÇÑ À§ °¡À̵å¶óÀÎÀº Rule 4ÀÇ Æ®·£Àè¼Ç
°æ°èȸ¦ ¸¸µé¾î³½´Ù. J2EE ¾ÆÅ°ÅØÃÄ´Â ¾ÖÇø®ÄÉÀ̼ÇÀ» °¡Àå ÀÛÀº ÇÁ·Î¼¼½Ì ûũ·Î ºÐÇصǴ °ÍÀ» Àå·ÁÇÑ´Ù.
°í¸³ Part 1¿¡¼, °í¸³(isolation)Àº ÇÑ
Æ®·£Àè¼ÇÀÇ È¿°ú°¡ µ¿½Ã¿¡ ½ÇÇàÇÏ°í ÀÖ´Â ´Ù¸¥ Æ®·£Àè¼Ç¿¡ º¸ÀÌÁö¾Ê´Â °ÍÀ̶ó°í Á¤ÀÇÇß´Ù. Æ®·£Àè¼ÇÀÇ °üÁ¡¿¡¼
Æ®·£Àè¼ÇÀº º´·Äº¸´Ù´Â ¼øÂ÷ÀûÀ¸·Î ½ÇÇàÇÑ´Ù. Æ®·£Àè¼Ç ¸®¼Ò½º ¸Å´ÏÀú°¡ ¸¹Àº Æ®·£Àè¼ÇµéÀ» µ¿½Ã¿¡ ÇÁ·Î¼¼½º Çϸé¼
"°í¸³ÀÇ È¯»ó"À» Á¦°øÇÑ´Ù. °¡²û¾¿ °í¸³ÀÇ Á¦¾àÁ¶°ÇÀº »õ·Î¿î Æ®·£Àè¼Ç ½ÃÀÛÀ» ±âÁ¸ Æ®·£Àè¼ÇÀÌ ¿Ï·áµÉ ¶§±îÁö
¹Ì·çµµ·Ï ÇÑ´Ù. Æ®·£Àè¼ÇÀ» ¿Ï·áÇÏ´Â °Í¿¡´Â Àû¾îµµ ÇϳªÀÇ µ¿±â½Ä(synchronous)ÀÇ µð½ºÅ© I/O°¡
Æ÷ÇԵǾîÀֱ⠶§¹®¿¡ ÃÊ´ç Æ®·£Àè¼ÇÀÇ ¼ö¸¦ ÃÊ´ç µð½ºÅ© ¾²±âÀÇ ¼ö·Î Á¦ÇÑÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº È®À强¿¡ ÁÁÁö
¾Ê´Ù.
½ÇÁ¦·Î °í¸³ ¿ä±¸Á¶°ÇÀ» Ç®¾î¼ ´õ ¸¹Àº Æ®·£Àè¼ÇµéÀÌ µ¿½Ã¿¡ ½ÇÇàµÉ ¼ö ÀÖµµ·Ï ÇÏ°í ½Ã½ºÅÛ ÀÀ´ä°ú ´õ ³ªÀº
È®À强À¸·Î Çâ»ó½Ãų ¼ö ÀÖ´Ù. °ÅÀÇ ¸ðµç µ¥ÀÌÅͺ£À̽º´Â ³× °³ÀÇ Ç¥ÁØ °í¸³ ·¹º§À» Áö¿øÇÑ´Ù: Read
Uncommitted, Read Committed, Repeatable Read,
Serializable.
ÄÜÅ×ÀÌ³Ê °ü¸® Æ®·£Àè¼ÇÀ» À§ÇÑ °í¸³ °ü¸®´Â ÇöÀç J2EE ½ºÆÑÀÇ ¹üÀ§¸¦ ¹þ¾î³ªÀÖ´Ù. ÇÏÁö¸¸ IBM
WebSphere¿Í BEA WebLogic °°Àº ¸¹Àº J2EE ÄÜÅ×À̳ʴ ÄÜÅ×ÀÌ³Ê ½ºÆÑÀÇ È®ÀåÀ» Á¦°øÇÏ¿©
Æ®·£Àè¼Ç ¸ðµå°¡ ¾î¼Àºí¸® µð½ºÅ©¸³ÅÍ¿¡ ¼³Á¤µÇ´Â °Í°ú °°Àº ¹æ½ÄÀ¸·Î ¸Þ¼Òµå ±â¹ÝÀ¸·Î Æ®·£Àè¼Ç °í¸³ ·¹º§À» ¼³Á¤ÇÒ
¼ö ÀÖ´Ù. ºó °ü¸® Æ®·£Àè¼ÇÀÇ °æ¿ì JDBC ¶Ç´Â ´Ù¸¥ ¸®¼Ò½º ¸Å´ÏÀú Ä¿³Ø¼ÇÀ» ÅëÇØ °í¸³ ·¹º§À» ¼³Á¤ÇÒ ¼ö
ÀÖ´Ù.
°í¸³ ·¹º§ °£ Â÷ÀÌÁ¡À» º¸±âÀ§ÇØ ¿©·¯°¡Áö º´Ç༺ À§ÇèÀ» ºÐ·ùÇØ º¸°Ú´Ù. ´ÙÀ½ À§Çè¿ä¼Òµé ¸ðµÎ´Â µÎ ¹ø°
Æ®·£Àè¼ÇÀÌ ÀÌ¹Ì ½ÃÀÛÇÑ ÈÄ¿¡µµ ù ¹ø° Æ®·£Àè¼ÇÀÌ µÎ ¹ø° Æ®·£Àè¼Ç¿¡ º¸¿©Áø °á°ú¿Í ¿¬°üµÇ¾îÀÖ´Ù:
- Dirty Read: ÇÑ Æ®·£Àè¼ÇÀÇ Áß°£ °á°ú°¡ ´Ù¸¥ Æ®·£Àè¼Ç¿¡ º¸¿©Áú ¶§
¹ß»ý.
- Unrepeatable Read: ÇÑ Æ®·£Àè¼ÇÀÌ µ¥ÀÌÅÍ ¾ÆÀÌÅÛÀ» ÀÐ°í ±× ´ÙÀ½¿¡ °°Àº
¾ÆÀÌÅÛÀ» ´Ù½Ã ÀоúÀ» ¶§ ´Ù¸¥ °ªÀÌ º¸ÀÏ ¶§ ¹ß»ý.
- Phantom Read: ÇÑ Æ®·£Àè¼ÇÀÌ ´ÙÁß ¿(row)À» ¸®ÅÏÇÏ´Â ÁúÀǸ¦ ¼öÇàÇÏ°í ÈÄ¿¡
°°Àº ÁúÀǸ¦ ´Ù½Ã ¼öÇàÇÒ ¶§, ù ¹ø° ÁúÀÇ ¼öÇà¿¡¼´Â º¸ÀÌÁö ¾Ê´ø Ãß°¡ ¿ÀÌ »ý±â´Â °æ¿ì ¹ß»ý.
³× °³ÀÇ Ç¥ÁØ °í¸³ ·¹º§Àº ÀÌ·¯ÇÑ ¼¼ °³ÀÇ °í¸³ À§Çè°ú °ü·ÃµÇ¾îÀÖ´Ù. (Table 2). °¡Àå ³·Àº °í¸³
·¹º§Àº Read Uncommitted ·Î¼ ´Ù¸¥ Æ®·£Àè¼Ç¿¡¼ ÀÌ·ç¾îÁø º¯°æÀ» ¸·Áö ¸øÇÑ´Ù. ÇÏÁö¸¸ Àбâ
lock¿¡ ´ëÇÑ °æÀï(contention)À» ¿ä±¸ÇÏÁö ¾Ê±â ¶§¹®¿¡ °¡Àå ºü¸£´Ù. °¡Àå ³ôÀº °í¸³ ·¹º§ÀÎ
SerializableÀº À§¿¡ Á¦»çÇÑ °í¸³ÀÇ Á¤ÀÇ¿Í ÀÏÄ¡ÇÑ´Ù. °¢ Æ®·£Àè¼ÇÀº ´Ù¸¥ Æ®·£Àè¼ÇÀÇ È¿°ú·ÎºÎÅÍ ¿ÏÀüÈ÷
°í¸³µÈ´Ù.
Table 2. Æ®·£Àè¼Ç °í¸³ ·¹º§
°í¸³ ·¹º§ |
Dirty read |
Unrepeatable read |
Phantom read |
Read Uncommitted |
Yes |
Yes |
Yes |
Read Committed |
No |
Yes |
Yes |
Repeatable Read |
No |
No |
Yes |
Serializable |
No |
No |
No |
´ëºÎºÐÀÇ µ¥ÀÌÅͺ£À̽º °æ¿ì ±âº» °í¸³ ·¹º§Àº Read Committed Àε¥ Æ®·£Àè¼ÇÀÇ ¾î¶² ÁöÁ¡¿¡¼µµ
¾ÖÇø®ÄÉÀÌ¼Ç µ¥ÀÌÅÍ°¡ º¸ÀÌ´Â °ÍÀ» ¹æÁöÇØÁֱ⠶§¹®¿¡ À¯¿ëÇÏ´Ù. Read Committed´Â °¡Àå ÀüÇüÀûÀΠªÀº
Æ®·£Àè¼Ç¿¡ »ç¿ëÇϱ⠾˸ÂÀº °í¸³ ·¹º§ÀÌ´Ù.
³ôÀº ¼öÁØÀÇ °í¸³ÀÎ Repeatable Read¿Í SerializableÀº Æ®·£Àè¼Ç Àüü¿¡¼ ³ôÀº ¼öÁØÀÇ
ÀÏ°ü¼ºÀÌ ÇÊ¿äÇÒ ¶§ ¾Ë¸Â´Ù. µ¥ÀÌÅÍ ÀÏ°ü¼ºÀÌ Àý´ëÀûÀ¸·Î ÇÊ¿äÇÑ °æ¿ì »õ·Î¿î ¿ »ý¼ºÀ» ¹æ¾îÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. À̶§
SerializableÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.
°¡Àå ³·Àº °í¸³ ·¹º§ÀÎ Read Uncommitted´Â °ÅÀÇ ¾²ÀÌÁö ¾Ê´Â´Ù. Á¤È®ÇÏÁö ¾Ê´Â °ªÀ» ¾ò°íÀÚ ÇÒ
¶§ ¾²À̸ç ÁúÀÇ´Â ¿¹±âÄ¡ ¾ÊÀº ÆÛÆ÷¸Õ½º ¿À¹öÇìµå¸¦ ¸¸µé°Ô µÈ´Ù. ÁÖ¹® ¼ö·® ¶Ç´Â ´çÀÏ ÁÖ¹®¹ÞÀº ´Þ·¯ °°ÀÌ,
ºü¸£°Ô ¼ö·®À» °è»êÇÒ ¶§¿¡´Â Read Uncommitted°¡ ÀüÇüÀûÀ¸·Î »ç¿ëµÈ´Ù.
°í¸³°ú È®À强 »çÀÌ¿¡´Â ¸ð¼øÀÌ Á¸ÀçÇϱ⠶§¹®¿¡ Æ®·£Àè¼Ç¿¡ °í¸³ ·¹º§À» ¼±ÅÃÇÒ ¶§¿¡´Â Ưº°ÇÑ ÁÖÀǸ¦ ±â¿ï¿©¾ß
ÇÑ´Ù. ³Ê¹« ³·Àº ·¹º§À» ¼±ÅÃÇÏ¸é µ¥ÀÌÅÍ¿¡ À§ÇèºÎ´ãÀÌ »ý±ä´Ù. ¶Ç, ³Ê¹« ³ôÀº ·¹º§À» ¼±ÅÃÇϸé ÆÛÆ÷¸Õ½º¿¡ ÁÁÁö
¾Ê´Ù. ÀϹÝÀûÀ¸·Î µ¥ÀÌÅÍ ÀÏ°ü¼º ¹®Á¦´Â ÆÛÆ÷¸Õ½º ¹®Á¦º¸´Ù ´õ ½É°¢ÇÏ´Ù:
Rule 5: µ¥ÀÌÅ͸¦ ¾ÈÀüÇÏ°Ô ÇÏ´Â °¡Àå ³·Àº °í¸³ ·¹º§À» »ç¿ëÇ쵂 ºÒÈ®½ÇÇÒ
°æ¿ì SerializableÀ» »ç¿ëÇÒ°Í!
ÄÄÆ÷³ÍÆ®¸¦ °³¹ß ÇÒ ¶§ °í¸³ÀÇ ¿ä±¸ »çÇ׿¡ ´ëÇØ ½ÅÁßÇÏ°Ô »ý°¢ÇغÁ¾ß ÇÑ´Ù. ¸¸¾à ÆÛÆ÷¸Õ½º°¡ ¹®Á¦°¡ µÈ´Ù¸é
³ªÁß¿¡ ´çȲÇÏÁö ¾Êµµ·Ï ³·Àº °í¸³ ·¹º§µµ °ßµô ¼ö ÀÖ´Â Æ®·£Àè¼ÇÀ» ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¾î¶² ¸Þ¼Òµå°¡ ÀÛµ¿ÇÏ°í °í¸³
·¹º§À» Á¤È®È÷ ¼³Á¤Çϱâ À§ÇÑ ÀÏ°ü¼º ÀüÁ¦Á¶°ÇÀÌ ¹«¾ùÀÎÁö¸¦ ¾Ë ÇÊ¿ä°¡ ÀÖÀ¸¹Ç·Î °³¹ßÇÏ¸é¼ ÀÏ°ü¼º ¿ä±¸»çÇ×°ú
ÀüÁ¦Á¶°ÇÀ» ¼¼½ÉÇÏ°Ô ¹®¼È ÇÏ´Â °ÍÀÌ ÁÁ´Ù.
°á·Ð ÀÌ
±Û¿¡ Á¦½ÃµÈ °¡À̵å¶óÀεéÀÌ ´Ù¼Ò ¸ð¼øó·³ º¸ÀδÙ. Æ®·£Àè¼Ç °æ°èÈ¿Í °í¸³Àº ±Ùº»ÀûÀ¸·Î ¸ð¼ø ±× ÀÚüÀ̱â
¶§¹®ÀÌ´Ù. ¾ÈÀü¼º°ú ÅøÀÇ ÆÛÆ÷¸Õ½º ¿À¹öÇìµå»çÀÌÀÇ ±ÕÇüÀ» À¯ÁöÇØ¾ß ÇÑ´Ù.
Âü°íÀÚ·á
|