ÀÚ¹ÙÀÇ ÀåÁ¡Àº JCP, ÇÁ·¹ÀÓ¿öÅ©, ¿ÀǼҽºÀÌ´Ù. JCP¸¦ ÅëÇØ¼ ȣȯ¼º°ú ¼º´É, ¾ÈÁ¤¼ºÀÌ º¸ÀåµÈ ½ºÆåÀ» ¸¸µé°í, Àß ¼³°èµÈ ½ºÆåµéÀº »óÈ£ ¿¬°ü¼ºÀ» °®°í ±¸Á¶ÈµÈ ±¸Á¶·Î È®ÀåÇÑ´Ù. ÀÌ·¯ÇÑ °á°ú¹°ÀÌ ÇÁ·¹ÀÓ¿öÅ©À̰í ÇÁ·¹ÀÓ¿öÅ©¸¦ Áö¿øÇÏ´Â ÇÙ½ÉÀº ¿ÀǼҽº¿Í º¥´õÀÌ´Ù. ÀÌ·¸µí ÇÁ·¹ÀÓ¿öÅ©´Â ÀÚ¹Ù ±¸ÇöüÀÇ ÇÙ½ÉÀ̱⵵ ÇÏ´Ù. ƯÁý 4ºÎ¿¡¼´Â ¼ö ¾øÀÌ ¸¹Àº ÀÚ¹Ù ÇÁ·¹ÀÓ¿öÅ© Áß¿¡¼ µ¥ÀÌÅͺ£À̽º¿Í º¸¾È ±â´É ±¸Çö¿¡ È¿°úÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â iBatis¿Í Acegi SecurityÀÇ È°¿ë ¹æ¹ýµé¿¡ ´ëÇØ ¾Ë¾Æº»´Ù.
À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÏ¸é¼ °¡Àå Áß¿äÇϸ鼵µ º¹ÀâÇÑ ±â´É µÑÀ» ²ÅÀ¸¶ó¸é ´Ü¿¬ µ¥ÀÌÅͺ£À̽º¿Í º¸¾È ±â´ÉÀÏ °ÍÀÌ´Ù. ƯÁý 4ºÎ¿¡¼´Â µ¥ÀÌÅͺ£À̽º ±â´ÉÀ» È¿°úÀûÀ¸·Î ±¸ÃàÇÒ ¼ö ÀÖ´Â iBatis¿Í º¸¾È ±â´É ±¸Çö¿ë ÇÁ·¹ÀÓ¿öÅ©ÀÎ Acegi Security¿¡ ´ëÇØ ¾Ë¾Æº¼ °ÍÀÌ´Ù.
µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÏ´Â ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÏ·Á¸é JDBC ÄÚµùÀÌ ÇʼöÀûÀÌ´Ù. JDBC ÄÚµùÀ» ÇÒ ¶§¿¡´Â µ¥ÀÌÅͺ£À̽º Ä¿³Ø¼Ç ÀÚ¿øÀ» ÄÚµå »ó¿¡¼ °ü¸®ÇØ¾ß ÇÑ´Ù. ¶Ç °³¹ß Äڵ忡 SQL ¹®µµ Æ÷ÇԵȴÙ.
µ¥ÀÌÅͺ£À̽º Ä¿³Ø¼Ç ÀÚ¿øÀ» °ü¸®ÇÏ´Â °Íµµ ¹®Á¦Áö¸¸ °³¹ß °úÁ¤¿¡¼ »ó´ç¼öÀÇ ºñÁî´Ï½º ·ÎÁ÷ÀÌ SQL ¹®¿¡ Æ÷ÇԵǰí, ´Ù½Ã ÀÌ·± SQL ¹®ÀÌ Äڵ忡 Æ÷ÇԵǾî SQL ¹®À» °ü¸®ÇÏ´Â °ÍÀÌ »ó´çÈ÷ º¹ÀâÇØÁö°Ô ¸¶·ÃÀÌ´Ù. iBatis´Â µ¥ÀÌÅͺ£À̽º ÀÚ¿ø °ü¸®¸¦ ¿Ïº®ÇÏ°Ô Ãß»óÈÇϰí, SQL ¹®À» Äڵ忡¼ ºÐ¸®ÇÏ¿© XML·Î °ü¸®ÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁÖ´Â ¿ÀÇ ¼Ò½º ÇÁ·ÎÁ§Æ®ÀÌ´Ù.
Acegi Security´Â ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß °úÁ¤¿¡¼ °¡Àå ¹Î°¨Çϸ鼵µ º¹ÀâÇÑ º¸¾È ±â´ÉÀ» º¸´Ù ¾ÈÁ¤ÀûÀÌ°í ½±°Ô ±¸¿¬ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ´Â ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù. º¸¾È °³³äÀ» »çÀü¿¡ °í·ÁÇÏ¿© ¾ÆÅ°ÅØÃ³¸¦ Á¤ÀÇÇÏ´Â °ÍÀº ¾î·Á¿î ÀÏÀÌ´Ù. ±×·¸´Ù°í º¸¾È ±â´ÉÀ» ¹«ÀÛÁ¤ Ãß°¡ÇÏ¿© °³¹ßÇÏ´Ù º¸¸é ºñÁî´Ï½º ·ÎÁ÷ÀÌ º¸¾È ÄÚµå Å¿¿¡ ¾û¸ÁÀÌ µÇ´Â °æ¿ì°¡ ºñÀϺñÀçÇÏ´Ù.
Acegi Security´Â ÀÌ·± ¹®Á¦¸¦ º¸´Ù È¿°úÀûÀ¸·Î ÇØ°áÇÒ ¼ö ÀÖ´Â ¹æ¹ýµéÀ» Á¦°øÇÑ´Ù. ¶Ç, ¿äÁò Àα⸦ ²ø°í ÀÖ´Â AOP(Aspect Orient Programming) °³³äÀ» µµÀÔÇÏ¿© ±âÁ¸ Äڵ忡 ¿µÇâÀ» ¹ÌÄ¡Áö ¾ÊÀ¸¸é¼µµ ´Ù¾çÇÑ º¸¾È ÆÐÅÏÀ» Àû¿ë ½Ãų ¼ö ÀÖ´Â ½ºÇÁ¸µ ±â¹Ý ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù.
 | SQL ¸ÊÆÛ iBatis SQLMap
|  |
iBatis´Â www.ibatis.org¿¡¼ ÁøÇà ÁßÀÎ ¿ÀÇ ¼Ò½º ÇÁ·ÎÁ§Æ®ÀÌ´Ù. iBatisÀÇ ±â´ÉÀ» ÇÑ ¸¶µð·Î ¿ä¾àÇÏÀÚ¸é SQL ¸ÊÆÛ¶ó°í ¸»ÇÒ ¼ö ÀÖ´Ù. iBatis¸¦ »ç¿ëÇÏ¸é °³¹ß Äڵ忡¼ SQL¹®À» ºÐ¸®ÇÏ¿© Àç»ç¿ë¼ºÀ» ³ôÀÏ ¼ö ÀÖ´Ù. ¶Ç, ¹Ýº¹ÀûÀÎ JDBC Äڵ嵵 ÁÙÀÏ ¼ö ÀÖ´Ù. ÀϹÝÀûÀ¸·Î µ¥ÀÌÅͺ£À̽º¿Í ¿¬µ¿ÇÏ´Â ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇϱâ À§Çؼ´Â JDBC ÄÚµùÀ» ÇÑ´Ù.
JDBC ÄÚµùÀº ´ÙÀ½°ú °°ÀÌ 6´Ü°èÀÇ ÀýÂ÷·Î ÀÌ·ç¾îÁö´Âµ¥, ÀÌ Áß¿¡¼ 1¹ø°ú 2¹øÀº Ä¿³Ø¼Ç Ç®À» »ç¿ëÇϰųª °øÅë ¸ðµâ·Î Ãß»óÈ ½ÃÄѳõ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. °³¹ß °úÁ¤¿¡¼ ºó¹øÇÏ°Ô Á¢ÇÏ´Â °ÍÀº 3¹øºÎÅÍ 6¹ø±îÁöÀÇ ÀýÂ÷ÀÌ´Ù. ÀÌÁß¿¡¼µµ 3¹øÀ» ¼öÇàÇÏ·Á¸é ½ºÆ®¸µ °´Ã¼·Î SQL¹®À» ¸¸µé¾î¾ß ÇÑ´Ù.
´õºÒ¾î ¸Þ¸ð¸®ÀÇ È¿°úÀûÀΠȰ¿ëÀ» À§ÇØ StringBuffer¸¦ »ç¿ëÇÏ¿© SQL¹®À» ¸¸µé¾î ³ª°¡´Â °úÁ¤¿¡¼ ¿©·¯ Á¶°Ç¿¡ ÇØ´çÇÏ´Â if¹® ·ÎÁ÷µµ Æ÷ÇÔµÇ°Ô µÈ´Ù.
¹®Á¦´Â ÀÌó·³ ÄÚµå¿Í SQL¹®À» °áÇÕÇÏ¿© »ç¿ëÇÒ °æ¿ì Áߺ¹µÈ SQL¹®ÀÌ ¿©·¯ Ŭ·¡½º¿¡ È¥ÀçÇÏ°Ô µÇ¾î SQL¹®ÀÇ Àç »ç¿ë¼º°ú °¡µ¶¼ºÀÌ ¶³¾îÁø´Ù´Âµ¥ ÀÖ´Ù. 4¹ø¿¡¼ SQL¹®À» ½ÇÇàÇÑ ÈÄ °á°ú °ªÀÎ ResultSetÀ¸·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÃßÃâÇÏ°í °´Ã¼¿¡ ÀúÀåÇÏ´Â Äڵ带 5¹ø ÀýÂ÷¿¡¼ ¼öÇàÇϰí 6¹ø¿¡¼ ÀÚ¿øÀ» closeÇÏ´Â ÀýÂ÷¸¦ ÅëÇØ¼ JDBC Äڵ尡 °³¹ßµÈ´Ù.
À̶§, 5¹ø ÀýÂ÷¿¡¼ µ¥ÀÌÅ͸¦ ÃßÃâÇϰí ÀÚ¹Ù ºó¿¡ °ªÀ» ¼¼ÆÃÇÏ´Â Äڵ带 ¸Å¹ø Ãß°¡ÇØ¾ß Çϰí 6¹ø ÀýÂ÷¿¡¼ ¿¹¿Ü»çÇ×ÀÌ ¹ß»ýÇÒ °æ¿ì, ¿¹¿Ü󸮸¦ À߸øÇÏ¸é ¸Þ¸ð¸® ´©¼ö°¡ ¹ß»ýÇϱ⠽¬¿î ±¸°£ÀÌ´Ù.
| |
|
1. Driver : JDBC Driver¸¦ µî·ÏÇÑ´Ù.
2. Connection : µ¥ÀÌÅͺ£À̽º¿¡ ¿¬°áÇÑ´Ù.
3. Statement : query¹® ¼öÇఴü¸¦ »ý¼ºÇÑ´Ù.
4. Execute : query¹®À» ½ÇÇàÇÑ´Ù.
5. Result : query ½ÇÇà °á°ú¸¦ ¹Þ´Â´Ù.
6. Close : Connection, Statement¸¦ ´Ý´Â´Ù.
| | | | | |
| |
iBatis´Â 6´Ü°èÀÇ JDBC °³¹ß Àüü¸¦ Ãß»óÈÇÏ¿© °³¹ß »ý»ê¼ºÀ» ³ôÀ̰í ÀÖ´Ù. iBatis¸¦ ÀÌ¿ëÇϸé SqlMapConfig.xml¿¡ µ¥ÀÌÅͺ£À̽º Á¤º¸¸¦ µî·ÏÇϰí ÀÌ Á¤º¸¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅͺ£À̽º Ä¿³Ø¼ÇÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù. SqlMapConfig.xml ÆÄÀϰú Áö¿ø ¶óÀ̺귯¸®¸¦ ÅëÇØ¼ JDBC °³¹ß ÀýÂ÷ÀÇ 1¹ø°ú 2¹ø, 6¹øÀ» Ãß»óÈ Çϰí ÀÖ´Ù.
iBatis´Â ¶ÇÇÑ SqlMapÀ̶ó´Â xml ÆÄÀÏÀ» °ü¸®ÇÑ´Ù. SqlMap xml ÆÄÀÏÀº SQL Á¤º¸, ƯÁ¤ SQL ¹®°ú ÀÔ·ÂµÈ µ¥ÀÌÅ͸¦ ¾î¶»°Ô °áÇÕÇÒ °ÍÀΰ¡, SQLÀÇ ½ÇÇà ÈÄ ¾î¶² ÀÚ¹Ù ºó¿¡ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ °ÍÀΰ¡¿Í °ü·ÃµÈ Á¤º¸¸¦ °ü¸®ÇÑ´Ù. µû¶ó¼ iBatis´Â SqlMap xml ÆÄÀϰú 3¹ø, 5¹ø ÀýÂ÷¸¦ Ãß»óÈÇÑ´Ù. ¸¶Áö¸·À¸·Î 4¹ø SQL¹®À» ½ÇÇàÇÏ´Â ´Ù¾çÇÑ ¶óÀ̺귯¸®¸¦ Á¦°øÇÑ´Ù.
ÀÌ¿Í °°ÀÌ iBatis¸¦ »ç¿ëÇϸé SqlMap xml ÆÄÀÏÀ» »ç¿ëÇÏ¿© SQL¹®À» Áß¾Ó ÁýÁßÀûÀ¸·Î °ü¸®ÇÒ ¼ö ÀÖ´Ù. ¶Ç, SQL¹®°ú °áÇյǴ ÀÔ·Â °ª°ú SQL¹®ÀÇ °á°ú¸¦ ´ã´Â ÀÚ¹Ù ºóÀ» ÀϰýÀûÀ¸·Î °ü¸®ÇÏ¿© SQL¹®ÀÇ Àç»ç¿ë¼ºµµ ³ôÀÏ ¼ö ÀÖ´Ù. ´õºÒ¾î SQL¹®°ú ÀÔ·Â °ªÀ» ¼³Á¤ÇÏ´Â ÄÚµå ¹× ResultSetÀ¸·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÃßÃâÇÏ´Â ¹Ýº¹ÀûÀÎ Äڵ带 ÁÙÀÌ´Â È¿°úµµ ¾òÀ» ¼ö ÀÖ´Ù. ¶ÇÇÑ Connection, PrepareStatement, ResultSet °´Ã¼¸¦ ÇÁ·¹ÀÓ¿öÅ© ³»ºÎ¿¡ ¼û°Ü ³õ¾Æ °³¹ß°úÁ¤¿¡¼ ÀÌµé °´Ã¼¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Ù. ¶§¹®¿¡ °³¹ß°úÁ¤¿¡¼ ÀÚ¿ø ÇØÁ¦¿Í °ü·ÃµÈ ºÎºÐÀ» ½Å°æ ¾µ Çʿ䰡 ¾ø¾îÁø´Ù.
iBatis
www.ibatis.org¿¡¼´Â iBatis¸¦ µ¥ÀÌÅͺ£À̽º ÄÚµùÀ» ½±°Ô Çϱâ À§ÇÑ µ¥ÀÌÅÍ ¸ÊÆÛ ÇÁ·¹ÀÓ¿öÅ©(Data Mapper Framework)¶ó°í ¼Ò°³Çϰí ÀÖ´Ù. ÀÚ¹Ù, ´å³Ý ±×¸®°í ·çºñ ¼¼ °¡Áö ¹öÀüÀÇ ÇÁ·¹ÀÓ¿öÅ©¸¦ Á¦°øÇϰí ÀÖ´Ù.
iBatis ÇÁ·ÎÁ§Æ®´Â iBatis SQL Map°ú iBatis DAO ÄÄÆ÷³ÍÆ®·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÀÌ Áß iBatis SQL MapÀº SQL¹® °ü¸®¿¡ ÃÊÁ¡À» ¸ÂÃß°í ÀÖ´Ù. iBatis DAO ÄÄÆ÷³ÍÆ®´Â ÇÏÀ̹ö³×ÀÌÆ®(hibernate)¿Í iBatis SQL MapÀ» ÇÔ²² »ç¿ëÇÒ °æ¿ì Æ®·£Àè¼Ç ÅëÇÕ°ú °°Àº ÀúÀå ¸ÞÄ¿´ÏÁò¿¡ ÃÊÁ¡À» ¸ÂÃß°í ÀÖ´Ù.
ÇöÀç iBatis´Â ¾ÈÁ¤È ¹öÀüÀ¸·Î 2.1.7¹öÀüÀ», °³¹ß¹öÀüÀ¸·Î´Â 2.2.0¹öÀüÀ» º£Å¸·Î ¸±¸®ÁîÇÑ »óÅ´Ù.
<±×¸² 1>Àº iBatisÀÇ ÀÛµ¿ ¹æ½ÄÀ» Àß ¼³¸íÇϰí ÀÖ´Ù. iBatis´Â µ¥ÀÌÅͺ£À̽º Ä¿³Ø¼Ç¿¡ °üÇÑ Á¤º¸¿Í ij½Ã »ç¿ë ¿©ºÎ, Æ®·£Àè¼Ç ÃÖ´ë °³¼ö, ÃÖ´ë ¼¼¼Ç °³¼ö µî µ¥ÀÌÅͺ£À̽º Ä¿³Ø¼Ç°ú °ü·ÃµÈ Àü¹ÝÀûÀÎ Á¤º¸·Î ±¸¼ºµÈ´Ù.
¶Ç, SQL 󸮸¦ À§ÇØ SQL Map xml ÆÄÀϵéÀÇ À§Ä¡ Á¤º¸¸¦ ±â·ÏÇÏ´Â SqlMapConfig.xml ÆÄÀϰú SQL¹®°ú PrepareStatement ÆÄ¶ó¹ÌÅÍ, ResultSet °á°ú ¸ÊÇÎ Á¤º¸¸¦ ±â·ÏÇÏ´Â Çϳª ÀÌ»óÀÇ SqlMap.xml·Î ±¸¼ºµÈ´Ù.
PrepareStatement ÆÄ¶ó¹ÌÅÍ·Î ÀԷµǴ ÇüÅ´ ÀÚ¹Ù ºó°ú ¸Ê °´Ã¼, ¿ø½Ã µ¥ÀÌÅÍÇü º¯¼ö, XML¹®ÀÇ ÇüÅ·Π¸¸µé ¼ö ÀÖ´Ù. ResultSet °á°ú ¸ÊÇÎÀº ÀÚ¹Ù ºóÀ̳ª ¸Ê °´Ã¼, ¿ø½Ã µ¥ÀÌÅÍÇü, XMLÀÇ ÇüÅ·Π¸¸µé ¼ö ÀÖ´Ù.
SqlMapConfig.xml
<¸®½ºÆ® 1>À» º¸¸é SqlMapConfig.xmlÀÇ ·çÆ® ¿¤¸®¸ÕÆ®(Root Element)´Â ¡®sqlMapConfig¡¯ÀÌ´Ù. ¡®sqlMapConfig¡¯´Â ´Ù¼¸ °³ÀÇ ÀÚ½Ä ¿¤¸®¸ÕÆ®(Element ÀÌÇÏ ¡®¿ä¼Ò¡¯)¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 1> SqlMapConfig.xml ¿¹Á¦ | | | |
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="SqlMapConfig.properties " />
<settings cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false" />
<typeAlias alias="emp" type="com.imaso.vo.EmpVO"/>
<typeAlias alias="dept" type="com.imaso.vo.DeptVO"/>
<transactionManager type="JDBC" >
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<property name="JDBC.DefaultAutoCommit" value="true" />
</dataSource>
</transactionManager>
<sqlMap resource="sqlmap /emp.xml" />
<sqlMap url="file:///c:/dept.xml" />
</sqlMapConfig>
| |
 |
¡Üproperties ¿ä¼Ò
SqlMapConfig.xmlÀº ¡®${key_name}¡¯ ÇüÅÂÀÇ º¯¼ö¸¦ °ªÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. <¸®½ºÆ® 1>ÀÇ °æ¿ì driver, url, username, password°¡ ¡®${key_name}¡¯ ÇüÅÂÀÇ º¯¼ö¸¦ »ç¿ëÇÑ ¿¹ÀÌ´Ù. ÀÌ·¯ÇÑ key_nameÀº SqlMapClient ÀνºÅϽº°¡ »ý¼ºµÉ ¶§ ½ÇÁ¦ °ªÀ¸·Î ´ëÄ¡µÈ´Ù. key_nameÀÇ ½ÇÁ¦ °ªÀº ¡®keyname=value¡¯ÀÇ ÇüÅ·Πproperties ÆÄÀÏ¿¡ ÀúÀåµÈ´Ù. sqlMapConfig¿¡¼ »ç¿ëÇÏ´Â properties ÆÄÀÏÀº properties ¿ä¼ÒÀÇ resource ¼Ó¼ºÀ» ÀÌ¿ëÇÏ¿© µî·ÏµÈ´Ù.
¡Üsettings ¿ä¼Ò
iBatis SqlMapÀ» »ç¿ëÇϱâ À§Çؼ´Â SqlMapClient ÀνºÅϽº¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù. setting ¿ä¼Ò´Â SqlMapClient ÀνºÅϽº¸¦ À§ÇÑ ¿É¼Ç°ú ÃÖÀûȸ¦ À§ÇÑ ¼³Á¤ÇÏ´Â ¿ªÇÒÀ» ´ã´çÇÑ´Ù. setting ¿ä¼Ò´Â Àϰö °³ÀÇ ¼Ó¼ºÀ» °®°í ÀÖ°í °¢ ¼Ó¼ºÀÇ Àǹ̴ <Ç¥ 1>°ú °°´Ù.
¡ÜtypeAlias ¿ä¼Ò
typeAlias ¿ä¼Ò¸¦ ÀÌ¿ëÇÏ¿© ±ä Ŭ·¡½º ¸íÀ» ÂüÁ¶Çϱâ À§ÇÑ ÂªÀº À̸§À» ¸í½ÃÇÑ´Ù. <¸®½ºÆ® 1>ÀÇ °æ¿ì com.imaso.vo.EmpVO¿Í com.imaso.vo.DeptVO¸¦ °¢°¢ emp¿Í dept·Î ¸í½ÃÇϰí ÀÖ´Ù. typeAlias¿¡¼ ¼³Á¤µÈ º°ÄªÀº sqlMapConfig.xml°ú sqlMapConfig¿¡¼ µî·ÏµÈ SqlMap.xml¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
¡ÜtransactionManager ¿ä¼Ò
transactionManager ¿ä¼Ò´Â Æ®·£Àè¼Ç°ú °ü·ÃµÈ ¼³Á¤À» ´ã´çÇÑ´Ù. transactionManager ¿ä¼Ò´Â type ¼Ó¼ºÀ» °®°í ÀÖ´Ù. type¿¡´Â Ŭ·¡½º ¸íÀ» »ç¿ëÇϰųª »çÀü¿¡ Á¤ÀÇµÈ º°ÄªÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. iBatis SqlMaps´Â »çÀü¿¡ ¼¼ °³ÀÇ º°ÄªÀ» Á¤ÀÇÇϰí ÀÖ´Ù. ±× º°ÄªÀÇ Á¾·ù¿Í Àǹ̴ <Ç¥ 2>¿Í °°´Ù.
transactionManager´Â dataSource ¿ä¼Ò¸¦ °®´Â´Ù. dataSource ¿ä¼Ò´Â typeÀ¸·Î ¡®SIMPLE¡¯, ¡®DBCP¡¯, ¡®JNDI¡¯¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¡®SIMPLE¡¯Àº iBatis SimpleDataSource connection Ç®À» »ç¿ëÇÏ¿© µ¥ÀÌÅÍ ¼Ò½º¸¦ Á¦°øÇÑ´Ù´Â ¼³Á¤À̰í DBCP´Â ÀÚÄ«¸£Å¸ DBCP¸¦ »ç¿ëÇÑ´Ù´Â ÁöÁ¤ÀÌ´Ù. ¡®JNDI¡¯´Â WASÀÇ JNDI ÄÁÅØ½ºÆ®·ÎºÎÅÍ DataSource¸¦ °¡Á®¿Â´Ù´Â ÀǹÌÀÌ´Ù.
¡ÜsqlMap ¿ä¼Ò
sqlMap ¿ä¼Ò´Â iBatis Sql Maps¿¡¼ »ç¿ëÇÒ sqlMap xml ÆÄÀϵéÀ» ÁöÁ¤ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. sqlMap ¿ä¼Ò´Â ÇÑ °³ ÀÌ»ó µî·ÏÇØ¾ß Çϸç sqlMap xml ÆÄÀÏÀ» ÁöÁ¤ÇÏ´Â ¹æ½ÄÀº Ŭ·¡½º ÆÐ½º¿Í Àý´ë°æ·Î¸¦ ÀÌ¿ëÇÏ¿© ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. <¸®½ºÆ® 1>¿¡¼ emp.xmlÀº resource ¼Ó¼ºÀ» »ç¿ëÇÏ¿© Ŭ·¡½º ÆÐ½º·Î ¼³Á¤ÇÑ °ÍÀ̰í, dept.xmlÀº url ¼Ó¼ºÀ» ÅëÇÏ¿© Àý´ë°æ·Î·Î ¼³Á¤ÇÑ ¿¹ÀÌ´Ù.
SqlMap xml ÆÄÀÏ
<¸®½ºÆ® 2>´Â ¿À¶óŬ µðÆúÆ® ½ºÄ«¹ÌÀÎ scottÀÇ emp Å×À̺íÀ» ´ë»óÀ¸·Î Á¶È¸, ¼öÁ¤, ÀÔ·Â, »èÁ¦¸¦ ´ë»óÀ¸·Î ÇÏ´Â SqlMap xmlÀÇ ¿¹Á¦ÀÌ´Ù. SqlMap xml ÆÄÀÏÀº sqlMap ¿¤¸®¸ÕÆ®¸¦ ·çÆ®·Î ÇÑ´Ù. <¸®½ºÆ® 2>¿¡¼ sqlMapÀº select, insert, update, delete ¿ä¼Ò¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. °¢ ¿ä¼Ò´Â parameterClass ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Ù. ¶Ç, ÀÌ ¼Ó¼º¿¡ typeAlias·Î º°ÄªÀÌ ¼³Á¤µÈ EmpVO Ŭ·¡½º¸¦ ÁöÁ¤Çϰí ÀÖ´Ù.
parameterClass·Î ÁöÁ¤µÈ Ŭ·¡½º´Â ÀÔ·Â ÆÄ¶ó¹ÌÅ͸¦ ÀǹÌÇÑ´Ù. id°¡ getEMPÀÎ select ¿ä¼Ò´Â parameterClass·Î º°ÄªÀÌ empÀÎ EmpVO °´Ã¼°¡ ¼³Á¤µÇ¾î ÀÖ´Ù. ÀÔ·Â ÆÄ¶ó¹ÌÅÍ·Î EmpVO ÀνºÅϽº°¡ ÀԷµǸé id°¡ getEMPÀÎ SQL¹®°ú °áÇÕÇÏ°Ô µÈ´Ù.
ÀÌ ¶§ EmpVO °´Ã¼ÀÇ ÀνºÅϽº´Â empno¶ó´Â ¸â¹ö º¯¼ö¸¦ °¡Áö°í ÀÖÀ¸¸ç, getter ¸Þ¼Òµå¿Í setter ¸Þ¼Òµå°¡ ¼±¾ðµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. EmpVO°¡ ¾ÕÀÇ Á¶°ÇµéÀ» ÃæÁ·ÇÏ´Â ÀÚ¹ÙºóÀ̶ó¸é EmpVO ÀνºÅϽºÀÇ empno ¸â¹ö º¯¼öÀÇ °ªÀº #empno#¿Í °áÇÕÇÏ¿© PrepareStatement °´Ã¼¸¦ »ý¼ºÇÏ°í ½ÇÇàµÈ´Ù. ³ª¸ÓÁö SQL¹® ¿ª½Ã °°Àº ¿ø¸®·Î ÀÛµ¿µÈ´Ù.
id°¡ getEmpListÀÎ select ¿ä¼ÒÀÇ SQL¹®Àº CDATA ¼½¼ÇÀ¸·Î º¸È£µÇ°í ÀÖ´Ù. À̰ÍÀº SQL¹®¿¡ ¡®<¡¯, ¡®>¡¯ ÀÌ Æ÷Ç﵃ °æ¿ì SqlMap xml ¹®¼´Â web-formed ÇÏÁö ¾Ê´Â »óŰ¡ µÈ´Ù. ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ´Â ¡®<¡¯, ¡®>¡¯¹®ÀÚ¸¦ ¡®<¡¯, ¡®>¡¯·Î ¹Ù²Ù°Å³ª CDATA ¼½¼ÇÀ¸·Î ¼³Á¤ÇÏ¿© ¸ðµç °ªÀ» ¹®ÀÚ·Î ÀνÄÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. getEmpList´Â CDATA ¼½¼ÇÀ» Àû¿ëÇÑ ¿¹ÀÌ´Ù.
| <¸®½ºÆ® 2> SqlMap xml ÆÄÀÏ ¿¹Á¦(sqlmap /emp.xml) | | | |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Emp">
<typeAlias alias="emp" type="com.imaso.vo.EmpVO"/>
<select id="getEmp" parameterClass="emp" resultClass="emp">
SELECT EMPNO empno, ENAME ename, JOB job, MGR mgr,
HIREDATE hiredate, SAL sal, COMM comm , DEPTNO deptno
FROM EMP
WHERE EMPNO = #empno#
</select>
<select id="getEmpList" parameterClass="date" resultClass="emp">
<![CDATA[
SELECT EMPNO empno, ENAME ename, JOB job, MGR mgr,
HIREDATE hiredate, SAL sal, COMM comm , DEPTNO deptno
FROM EMP
WHERE hiredate > #hiredate#
]]>
</select>
<update id="updateEmp" parameterClass="emp">
UPDATE EMP SET
ENAME = #ename#, JOB = #job#, MGR = #mgr#,
HIREDATE = #hiredate#, SAL = #sal#, COMM = #comm#,
DEPTNO = #deptno#
WHERE EMPNO = #empno#
</update>
<insert id="insertEmp" parameterClass="emp">
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ( #empno#, #ename#, #job#, #mgr#, #hiredate#, #sal#, #comm#, #deptno#)
</insert>
<delete id="deleteEmp" parameterClass="emp" >
DELETE FROM EMP
WHERE EMPNO = #empno#
</delete>
</sqlMap>
| |
 |
´Ù¸¥ ¿ä¼Ò¿Í ´Þ¸® select ¿ä¼Ò´Â resultClass ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Â °ÍÀÌ Æ¯Â¡ÀÌ´Ù. <¸®½ºÆ® 2>¿¡¼´Â emp º°ÄªÀ» »ç¿ëÇÏ¿© EmpVO¸¦ ¼³Á¤Çϰí ÀÖ´Ù. resultClass´Â SQL¹®ÀÌ Ã³¸®µÈ ÈÄ Á¶È¸µ¥ÀÌÅ͸¦ row º°·Î ´ãÀ» ÀÚ¹Ù ºó Ŭ·¡½º¸¦ ÁöÁ¤Çϴ Ŭ·¡½ºÀÌ´Ù.
resultClass¿¡ ÁöÁ¤µÈ ÀÚ¹Ù ºóÀÇ selectÀý Ä÷³¸í°ú µ¿ÀÏÇÑ ¸â¹ö º¯¼ö¸¦ Æ÷ÇÔÇÏ°í °¢ ¸â¹ö º¯¼ö¿¡ ´ëÇÑ getter ¸Þ¼Òµå¿Í setter ¸Þ¼Òµå°¡ Á¤ÀÇµÈ ÀÚ¹Ù ºóÀ̶ó´Â Á¦¾àÁ¶°ÇÀ» °®´Â´Ù.
¡ÜParameterMap°ú ResultMap
SqlMap xml ÆÄÀÏ¿¡¼ ÀÔ·Â ÆÄ¶ó¹ÌÅÍ¿Í °á°ú¸¦ ¸®ÅÏ ÇÏ´Â µ¥ÀÌÅÍÇüÀ» ÁöÁ¤ÇÏ´Â ¹æ½ÄÀ¸·Î parameterClass¿Í resultClass ¼Ó¼ºÀ» »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸¾Ò´Ù. parameterClass¿Í resultClass¿¡ ÁöÁ¤µÈ ÀÚ¹Ù ºóÀÇ parameterClass´Â #º¯¼ö¸í#°ú µ¿ÀÏÇÑ ¸â¹ö º¯¼ö¸íÀ» °®´Â ÀÚ¹Ù ºóÀ̾î¾ß ÇÑ´Ù.
¶Ç, resultClass´Â select ÀýÀÇ ¸ðµç Ä÷³¸í°ú ÀÏÄ¡ÇÏ´Â ¸â¹öº¯¼öµéÀ» °®´Â ÀÚ¹Ù ºóÀ̾î¾ß ÇÑ´Ù´Â Á¦¾àÁ¶°ÇÀÌ ÀÖ´Ù. ÀÌ·¯ÇÑ Á¦¾àÁ¶°ÇÀ» ÇØ°áÇÏ´Â ¹æ¾ÈÀ¸·Î ParameterMap°ú ResultMapÀ» Áö¿øÇÑ´Ù.
<¸®½ºÆ® 3>Àº <¸®½ºÆ® 2>ÀÇ getEmpList ¿ä¼Ò¿¡ resultMapÀ» »ç¿ëÇϵµ·Ï º¯ÇüÇÑ ¿¹Á¦ÀÌ´Ù. <¸®½ºÆ® 3>Àº selectÀýÀÇ Ä÷³¸íÀÌ ¸ðµÎ ´ë¹®ÀÚ·Î ¼³Á¤µÇ¾î ÀÖ´Ù. ÀÌ SQL¹®ÀÌ ½ÇÇàµÉ °æ¿ì °á°ú´Â ·Î¿ì(Row) º°·Î EmpVO ÀνºÅϽº¿¡ ¼³Á¤µÇµµ·Ï select ¿ä¼ÒÀÇ resultMap ¼Ó¼ºÀ¸·Î empMapÀ» ÁöÁ¤Çϰí ÀÖ´Ù.
id°¡ empMapÀÎ resultMap ¿ä¼Ò´Â µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¶§ »ç¿ëÇÒ ºó(class ¼Ó¼º)°ú Ä÷³º°(column ¼Ó¼º) ´ë»ó ¸â¹ö º¯¼ö¸í(property)À» ¼³Á¤ÇÑ´Ù. ´õºÒ¾î Àüü 8 Ä÷³ Áß ´Ù¼¸ °³ÀÇ Ä÷³¸¸À»resultMap ¿ä¼Ò¿¡ ¼³Á¤ÇÏ¿© ´Ù¼¸ °³ÀÇ Ä÷³ µ¥ÀÌÅ͸¸ÀÌ EmpVO ÀνºÅϽº¿¡ ÀúÀåµÇµµ·Ï ¼³Á¤Çϰí ÀÖ´Ù.
| <¸®½ºÆ® 3>resultMapÀ» Àû¿ëÇÑ ¿¹ | | | |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Emp">
<typeAlias alias="emp" type="com.imaso.vo.EmpVO"/>
<resultMap id="empMap" class="emp">
<result property="empno" column="EMPNO"/>
<result property="ename" column="ENAME"/>
<result property="job" column="JOB"/>
<result property="mgr" column="MGR"/>
<result property="hiredate" column="HIREDATE"/>
</resultMap>
<select id="getEmpList" parameterClass="date" resultMap="empMap">
<![CDATA[
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM EMP
WHERE hiredate > #hiredate#
]]>
</select>
</sqlMap>
| |
 |
Sql Maps API »ç¿ëÇϱâ
Áö±Ý±îÁö SqlMapConfig.xml°ú sqlMap.xmlÀ» ¼³Á¤ÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸¾Ò´Ù. ÀÌÁ¦ À̰ÍÀ» ¹ÙÅÁÀ¸·Î xml ¼³Á¤À» »ç¿ëÇÏ´Â API¿¡ ´ëÇØ ¾Ë¾Æº¼ Â÷·ÊÀÌ´Ù. Sql Maps´Â ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ°¡ com.ibatis.sqlmap.client.SqlMapClient ÀÎÅÍÆäÀ̽º¸¸À» »ç¿ëÇÏ¸é µÇµµ´Â °£·«ÇÑ ±¸¼ºÀÇ API¸¦ Áö¿øÇÑ´Ù.
¡ÜSqlMapClient ÀνºÅϽº »ý¼º
SqlMapClient ÀνºÅϽº¸¦ ¸¸µé±â À§Çؼ´Â SqlMapClientBuilder Ŭ·¡½ºÀÇ static ¸Þ¼ÒµåÀÎ buildSqlMap()¸Þ¼Òµå¸¦ »ç¿ëÇÑ´Ù. buildSqlMap ¸Þ¼Òµå¿¡ Ŭ·¡½º ÆÐ½º »ó¿¡ Á¸ÀçÇÏ´Â SqlMapConfig.xml ÆÄÀÏÀÇ Reader ÀνºÅϽº¸¦ ÀÔ·ÂÇÏ¿© SqlMapClient ÀνºÅϽº¸¦ ¸¸µé ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 4>SqlMapClient ÀνºÅϽº »ý¼º ÄÚµå | | | |
Reader reader = Resources.getResourceAsReader (sqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMap(reader);
| |
 |
¡ÜSqlMapClient API
SqlMapClient ÀνºÅϽº¸¦ »ý¼ºÇÏ¸é ´ÙÀ½°ú °°Àº ¸Þ¼Òµå¸¦ Ȱ¿ëÇÒ ¼ö ÀÖ´Ù.
 | SqlMapClient Ŭ·¡½ºÀÇ ÁÖ¿ä ¸Þ¼Òµå |  | |  | |
|
* public void startTransaction () throws SQLException
* public void commitTransaction () throws SQLException
* public void endTransaction () throws SQLException
* public Object insert(String id, Object param) throws SQLException
* public int update(String id, Object param) throws SQLException
* public int delete(String id, Object param) throws SQLException
* public Object queryForObject(String id, Object param) throws SQLException
* public List queryForList(String id, Object param) throws SQLException
| | | | | |
| |
<¸®½ºÆ® 5>´Â iBatis Sql Maps¸¦ ÀÌ¿ëÇÑ Æ®·£Àè¼Ç ¿¹Á¦ÄÚµåÀÌ´Ù. updateEmpHiredate() ¸Þ¼Òµå´Â SqlMapClient ÀνºÅϽºÀÎÀÇ startTransaction() ¸Þ¼Òµå·Î Æ®·£Àè¼ÇÀ» ½ÃÀÛÇϰí commitTransaction()·Î Á¾·áÇÑ´Ù. Æ®·£Àè¼Ç ó¸® Áß SQLExceptionÀÌ ¹ß»ýÇÒ °æ¿ì endTransaction() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© Æ®·£Àè¼ÇÀ» ·Ñ¹éÇϰí Á¾·áÇÏ´Â ·ÎÁ÷À» ´ã°í ÀÖ´Ù.
queryForObject() ¸Þ¼Òµå¿¡ SQL id¿Í ÀÔ·Â ÆÄ¶ó¹ÌÅÍ °´Ã¼ ¡®inputEmp¡¯ °´Ã¼¸¦ Àü´ÞÇϸé [ÄÚµå 2]ÀÇ ¡®getEmp¡¯ select ¿ä¼Ò¿Í °áÇÕÇÏ¿© SQL¹®ÀÌ ½ÇÇàµÇ°í °á°ú¸¦ Object ÇüÀ¸·Î ¸®ÅÏ ÇÑ´Ù.
Á¶È¸ °á°úÀÎ ¡®emp¡¯ °´Ã¼ÀÇ hiredate¸¦ ¼³Á¤ÇÑ µÚ¿¡ update ¸Þ¼Òµå¿¡ ¡®updateEmp¡¯ÀÎ SQL id¿Í ¼öÁ¤ÇÑ µ¥ÀÌÅ͸¦ ÀúÀåÇÏ´Â emp °´Ã¼¸¦ ÆÄ¶ó¹ÌÅÍ·Î Àü´ÞÇÏ¿© µ¥ÀÌÅ͸¦ ¼öÁ¤ÇÏ´Â ·ÎÁ÷À¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
<¸®½ºÆ® 5>´Â ÀüÇüÀûÀÎ iBatis Sql Maps ÄÚµù ¹æ½ÄÀÌ´Ù. µ¥ÀÌÅͺ£À̽º Äڵ带 ÀÛ¼ºÇÏ´Â °úÁ¤¿¡¼ ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ´Â Connection, PrepareStatement, ResultSet °´Ã¼¸¦ Á¦¾îÇÒ Çʿ䰡 ¾ø´Ù´Â »ç½ÇÀ» È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 5>iBatis Sql Maps Æ®·£Àè¼Ç ¿¹Á¦ | | | |
private Reader reader = new Resources.getResourceAsReader ("sqlMapConfig.xml");
private SqlMapClient sqlMap = XmlSqlMapBuilder.buildSqlMap(reader);
public updateEmpHiredate (String empno, Date hiredate)
throws SQLException {
try {
sqlMap.startTransaction ();
EmpVO inputEmp = new EmpVO();
inputEmp.setEmpno(empno);
EmpVO emp = (EmpVO) sqlMap.queryForObject ("getEMP", inputEmp);
emp.setHiredate (hiredate);
sqlMap.update ("updateEmp", emp);
sqlMap.commitTransaction ();
} finally {
sqlMap.endTransaction ();
}
| |
 |
iBatis Sql MapsÀÇ À§Ä¡
¿äÁò Object Relational Mapping(ÀÌÇÏ ORM)À̶ó´Â ÀÚÁÖ µè°Ô µÈ´Ù. ORMÀº °´Ã¼ ÁöÇâ µ¥ÀÌÅÍ¿Í °ü°èÇü µ¥ÀÌÅͺ£À̽ºÀÇ µ¥ÀÌÅ͸¦ ¿¬°á½ÃÄÑ ÁÖ´Â ±â¼úÀÌ´Ù. SQL¹®À» »ç¿ëÇÏÁö ¾Ê°í µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ µ¥ÀÌÅ͸¦ Á¶È¸ÇÏ°í ¾ÖÇø®ÄÉÀÌ¼Ç °´Ã¼ÀÇ »óŰ¡ º¯ÇÔ¿¡ µû¶ó µ¥ÀÌÅͺ£À̽º¿¡ º¯°æ »çÇ×ÀÌ ¹Ù·Î ÀúÀåµÇµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.
°´Ã¼ ÁöÇâ ¾ð¾î¿¡¼ °´Ã¼´Â 3Â÷¿ø µ¥ÀÌÅÍÀÌ´Ù. ´ÜÀÏ °´Ã¼¿Í ¸®½ºÆ®°¡ ¼¯¿© ÀÖ°í ´ÜÀÏ °´Ã¼´Â ¶Ç µû¸¥ °´Ã¼¿Í ¸®½ºÆ®¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é °ü°èÇü µ¥ÀÌÅͺ£À̽º´Â 2Â÷¿ø µ¥ÀÌÅÍ·Î Ä÷³°ú ·Î¿ì·Î ±¸¼ºµÇ¾î ÀÖ´Ù. 2Â÷¿ø µ¥ÀÌÅ͸¦ Àоî¿Í »ïÂ÷¿ø µ¥ÀÌÅÍ·Î º¯°æÇÏ´Â ÀÛ¾÷Àº SQL¹®À» ÀÌ¿ëÇÏ´Â ÀüÅëÀûÀÎ ¹æ¹ýÀÌ´Ù.
ORM ±â¼ú·Î À¯¸íÇÑ Åøµé·Î EJB, ÇÏÀ̹ö³×ÀÌÆ®, TopLink, JDO µîÀÌ ÀÖ´Ù. ORM ±â¼úÀÌ ¸¹Àº ÀåÁ¡À» °®°í ÀÖ´Â °Í °°Áö¸¸ Çö½Ç¿¡ Àû¿ëÇØ º¸¸é ¹®Á¦Á¡ÀÌ ¸¹´Ù. ÇÁ·ÎÁ§Æ®¿¡ Âü¿©ÇÏ´Â ÀηÂÀÇ ´ëºÎºÐÀº °ü°èÇü µ¥ÀÌÅͺ£À̽º °üÁ¡¿¡¼ µ¥ÀÌÅ͸¦ ¹Ù¶óº¸´Âµ¥ Àͼ÷Çϰí SQL¹®À» »ç¿ëÇÏ´Â JDBC ÄÚµù¿¡ Àͼ÷ÇÑ °ÍÀÌ »ç½ÇÀÌ´Ù.
ÀÌ·± »óȲ¿¡¼ °úµµÇÏ°Ô ORM ±â¼úÀ» Àû¿ëÇÒ °æ¿ì È¥¶õ¸¸ °¡Áß½ÃŰ´Â °æ¿ì°¡ ´ëºÎºÐÀÌ´Ù. ±×·¯³ª ±âÁ¸ ¹æ½Ä´ë·Î ¹æ´ëÇÑ SQL¹®¿¡ ºñÁî´Ï½º ·ÎÁ÷ÀÌ ´ã°ÜÀÖ°í, SQL¹®ÀÌ °³¹ß ÄÚµå¿Í ¼¯¿© ÀÖ´Â °ÍÀº SQL¹® °ü¸®³ª Àç»ç¿ë¼ºÀ» ¶³¾î¶ß¸®´Â ¹®Á¦¸¦ °¡Áø´Ù.
iBatis Sql Maps´Â ±âÁ¸ JDBC ÄÚµåÀÇ ºñÈ¿À²¼ºÀ» ȹ±âÀûÀ¸·Î °³¼±ÇÏ´Â µ¿½Ã¿¡ JDBC ÄÚµåÀÇ ÆÐ·¯´ÙÀÓÀº ±×´ë·Î À¯ÁöÇϰí ÀÖ´Ù. ORM ±â¼ú°ú ºñ±³ÇÒ ¼ö´Â ¾øÁö¸¸ Á¶È¸ °á°ú¸¦ SQL ¸ÊÇÎ Á¤º¸¿¡ µû¶ó ƯÁ¤ °´Ã¼¿¡ ¼³Á¤ÇÏ°í ¹ÝȯÇÏ´Â ºÎºÐÀ» ÀÚµ¿ÈÇϰí ÀÖ´Ù. ¶Ç, SQL¹®À» Áß¾Ó ÁýÁßÀûÀ¸·Î °ü¸®ÇÒ ¼ö ÀÖ´Â ¹æ¾Èµµ Á¦°øÇÑ´Ù.
±×»Ó ¾Æ´Ï´Ù. ÀÚü µ¥ÀÌÅÍ Ä³½Ã ±â´ÉÀ» Æ÷ÇÔÇϰí ÀÖ°í XML¹®¿¡ ±â¼úµÈ SQL¹®À» µ¥ÀÌÅÍÀÇ »óÅ¿¡ µû¶ó µ¿ÀûÀ¸·Î º¯°æÇÏ´Â Dynamic SQL¹®À» Á¦°øÇÑ´Ù. Log4J ¼³Á¤À» ÇÒ ¶§¿¡´Â ÀÚ¼¼ÇÑ ³»ºÎ ·Î±×µµ Á¦°øÇÑ´Ù.
µ¥ÀÌÅͺ£À̽º º¥´õ º°·Î °³º°ÀûÀ¸·Î Á¦°øÇÏ´Â ¸ðµç SQL ¹®ÀÇ Ç¥Çö ¹æ½Ä, ÇÁ·Î½ÃÀú, ƯÁ¤ ÇÔ¼öµéÀ» ¸ðµÎ Áö¿øÇÑ´Ù. ÀÌ·¸µí iBatis Sql Maps´Â ORMÀÇ Æ¯¼º°ú ±âÁ¸ JDBC ÄÚµåÀÇ ´ÜÁ¡À» º¸¾ÈÇϰí ÀåÁ¡À» Èí¼öÇÏ´Â Áß°£ÀûÀÎ À§Ä¡¿¡ Á¸ÀçÇÏ´Â ÆÛ½Ã½ºÅϽº(Persistence) ·¹À̾î ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù.
 | À¥ ¾ÖÇø®ÄÉÀÌ¼Ç º¸¾È ÇÁ·¹ÀÓ¿öÅ© - Acegi Security
|  |
Acegi Security(ÀÌÇÏ Acegi) ÇÁ·¹ÀÓ¿öÅ©´Â ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿öÅ©ÀÇ ¼ºê ÇÁ·ÎÁ§Æ®·Î °³¹ßµÇ°í ÀÖ´Â º¸¾È ¿ÀǼҽº ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù. Acegi´Â ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿öÅ©ÀÇ °øÀÎ ¼ºê ÇÁ·ÎÁ§Æ®À̸ç http://acegisecurity.org ¿¡¼ ¿î¿µµÇ°í ÀÖ´Â ¿ÀǼҽº ÇÁ·ÎÁ§Æ®´Ù.
½ºÇÁ¸µ ÇÁ·¹ÀÓ¿öÅ©¸¦ ±â¹ÝÀ¸·Î AOPÀÇ °³³äÀ» Ãß°¡ÇÏ¿© ¸¸µé¾îÁö´Â ¸¸Å ¸ðµâ¼º°ú À̽ļºÀÌ ¸Å¿ì ¶Ù¾î³ª´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù. º¸¾ÈÀº óÀ½¿¡ »ó´çÈ÷ ºÎ´ãµÇ´Â ¿ë¾îµéÀ» ¸¹ÀÌ Á¢ÇÏ°Ô µÇ´Â ºÐ¾ßÀÌ´Ù. ÀÌ·¯ÇÑ Å¿¿¡ Acegi ¶ÇÇÑ Ã³À½¿¡ ÀûÀÀÇϴµ¥ »ó´çÈ÷ ¾î·Æ°Ô ´À²¸Áö´Â °ÍÀÌ »ç½ÇÀÌ´Ù. ¿©±â¿¡¼´Â Acegi°¡ ³ª¿À°Ô µÈ ÀÌÀ¯¿Í ±× »ç¿ë¹ýµé¿¡ ´ëÇØ °£´ÜÈ÷ ¾Ë¾Æº¸ÀÚ.
Ç¥ÁØ À¥ ÄÁÅ×ÀÌ³Ê º¸¾È ¸ÞÄ¿´ÏÁò
Acegi¸¦ »ìÆìº¸±â Àü¿¡ ÀÚ¹Ù À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ º¸¾È Ç¥ÁØÀº ¾ø´Â °ÍÀϱî? ´ç¿¬È÷ ÀÖ´Ù. JAAS(Java Authentication and Authorization Service) Ç¥ÁØÀÌ Á¸ÀçÇÑ´Ù. ¶ÇÇÑ Java EE ±â¹Ý À¥ ÄÁÅ×À̳ʴ ÀÎÁõ(Authentication)°ú ±ÇÇÑ(Authorization)À» ó¸®ÇÏ´Â ¸ÞÄ¿´ÏÁòÀ» Æ÷ÇÔÇϰí ÀÖ´Ù.
ÀÌ ¸ÞÄ¿´ÏÁòÀ» CMA(Container Managed Authentication)¶ó°í ÇÑ´Ù. CMA´Â BASIC, Form-BASED, Mutual Authentication(»óÈ£ ÀÎÁõ)ÀÇ ¼¼ °¡Áö À¯ÇüÀ» Áö¿øÇÑ´Ù. ¿©±â¿¡¼´Â Form-Based ÀÎÁõ À§ÁÖ·Î »ìÆì º¼ °ÍÀÌ´Ù. ÅèĹ(Tomcat)¿¡¼ CMP¸¦ »ç¿ëÇÏ·Á¸é <¸®½ºÆ® 6>°ú °°ÀÌ web,xml°ú server.xmlÀ» ¼öÁ¤ÇØ ÁÖ¾î¾ßÇÑ´Ù.
web.xml¿¡
¸¦ FORMÀ¸·Î ¼³Á¤µÈ À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡ actionÀÌ j_security_checkÀÎ ¸®Äù½ºÆ®°¡ Àü´ÞµÇ¸é CMA ¸ÞÄ¿´ÏÁòÀÌ ½ÇÇàµÈ´Ù. CMA ¸ÞÄ¿´ÏÁòÀº server.xmlÀÇ ¼³Á¤À» ÅëÇØ¼ j_security_chech ÆûÀÇ j_username°ú j_password ÆÄ¶ó¹ÌÅ͸¦ ÀÌ¿ëÇÏ¿© ÀÎÁõÀ» ó¸®Çϰí ÀÎÁõ󸮰¡ ¼º°øÀûÀ̸é ÀÎÁõ »ç¿ëÀÚÀÇ ±ÇÇÑÀ» Á¶È¸ÇÑ´Ù. ÅèĹÀº JDBCRealm, DataSourceRealm, JNDIRealm, MemoryRealm, JAASRealmÀ» Áö¿øÇÑ´Ù.
<¸®½ºÆ® 6>Àº JDBCRealmÀÇ ¼³Á¤ ¿¹Á¦ÀÌ´Ù. web.xmlÀÇ Àº À¥ ¾ÖÇø®ÄÉÀÌ¼Ç ÀÚ¿øÀÇ Á¢±Ù ±ÇÇÑÀ» Á¤ÀÇÇÑ´Ù. <¸®½ºÆ® 6>Àº URLÀÌ ¡®/admin/*¡¯ ÆÐÅÏÀÎ ÀÚ¿øÀº ¡®manager¡¯ ±ÇÇÑÀÌ ÀÖÀ» °æ¿ì¿¡¸¸ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ¼³Á¤ÀÌ´Ù.
ÀÎÁõÀÌ ¿Ï·áµÈ »ç¿ëÀÚÀÇ ¸®Äù½ºÆ®°¡ ÀÇ ÆÐÅϰú ¸ÅÄ¡µÉ °æ¿ì, ÀÎÁõµÈ »ç¿ëÀÚ°¡ ¡®manager¡¯ ±ÇÇÑÀ» °¡Áö°í ÀÖÀ¸¸é ÇØ´ç ÀÚ¿øÀÇ Á¢±ÙÀ» Çã¿ëÇÏ°í ±ÇÇÑÀÌ ¾øÀ¸¸é Á¢±ÙÀ» Á¦ÇÑÇÑ´Ù.
CMA¸¦ »ç¿ëÇÒ °æ¿ì ÀÎÁõ°ú ±ÇÇÑ¿¡ ´ëÇÑ º°µµÀÇ °³¹ß °úÁ¤ ¾øÀÌ WAS(Web Application Server)¿¡ ³»ÀåµÈ ¸ÞÄ¿´ÏÁòÀ» ÀÌ¿ëÇÏ¿© ó¸®ÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °®´Â´Ù. CMA´Â ¸®Äù½ºÆ® ÀÎÁõ°ú ±ÇÇÑ °úÁ¤À» ¿Ï·áÇÑ µÚ¿¡ ÀÎÁõ°ú ±ÇÇÑ Á¤º¸¸¦ EJB ÄÁÅ×À̳ʿ¡¼µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
¶Ç, HttpServletRequest.getRemoteUser(), HttpServletRequest.getUserPrincipal(), HttpServletRequest.isUserInRole(String role)¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥ ÀûÀ¸·Î ÀÎÁõ ¹× ±ÇÇÑ Á¤º¸¸¦ »ç¿ëÇÒ ¼ö µµ ÀÖ´Ù.
| <¸®½ºÆ® 6> ÅèĹ CMA¸¦ »ç¿ëÇϱâ À§ÇÑ ¿¹Á¦ | | | |
* web.xml ¼³Á¤ »çÇ×
<login-config>
<auth-method>FORM
<form-login-config>
<form-login-page>/login.jsp
<form-error-page>/fail_login.html
</form-login-config>
</login-config>
* login.jsp
<form method="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="password" name="j_password">
</form>
* $CATALINA_HOME/conf/server.xml ¼³Á¤
<Realm
className="org.apache.catalina.realm.JDBCRealm"
debug="99"
driverName="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@{IPAddress}:{Port}:{Servicename}"
connectionName="{DB Username}"
connectionPassword="{Password}"
userTable="users" userNameCol="username" userCredCol="password"
userRoleTable="user_roles" roleNameCol="rolename"
/>
* web.xml º¸¾È¸®¼Ò½º Á¤ÀÇ ¹× Á¢±Ù°¡´É ·Ñ Á¤ÀÇ
<security-constraint>
<web-resource-collection>
<web-resource-name>AdminPages</web-resource-name>
<url-pattern>/admin/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
| |
 |
CMA°¡ ÁÁÀº °Í ¾Æ´Ñ°¡?
º¸¾ÈÀÇ °¡Àå Áß¿äÇÑ ¿ä¼Ò´Â ÀÎÁõ°ú ±ÇÇÑÀÌ´Ù. ÀÌ·¯ÇÑ º¸¾ÈÀº ´ëºÎºÐÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ±âº»ÀûÀ¸·Î Á¦°øµÇ¾î¾ß ÇÏ´Â Çʼö±â´ÉÀÌ´Ù. Æû À̸§°ú ÇÊµå ¸íÀ» ¸ÂÃß°í ¼¹ö¿¡ ¼³Á¤À» ÇÏ´Â °Í¸¸À¸·Î WAS¿¡¼ Á¦°øÇÏ´Â º¸¾È ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇÒ ¼ö ÀÖ´Â CMA´Â Á¤¸» ÁÁ±â¸¸ ÇÑ °ÍÀϱî? CMA´Â Á¤¸» ÁÁÀº ±â´ÉÀÌ´Ù.
±×·¯³ª ¸ðµç »óȲ¿¡¼ ÁÁÀ» ¼ö´Â ¾ø´Ù. CMA¸¦ »ç¿ëÇϸé CMAÀÌÀü¿¡ ¸®Äù½ºÆ®¸¦ Àü ó¸®Çϱâ À§ÇÑ filter¸¦ ¼³Á¤ÇÒ ¼ö°¡ ¾ø´Ù. ¶Ç À̽ļºÀÌ ¶³¾îÁø ´Ù´Â °Íµµ CMAÀÇ Å« ´ÜÁ¡ÀÌ´Ù.
ÅèŰú ·¹ÁøÀ» WAS·Î »ç¿ëÇÒ °æ¿ì °£´ÜÇÑ ¹æ¹ýÀ¸·Î CMA ¼³Á¤ÇÒ ¼ö´Â ÀÖÁö¸¸, ÅèŰú ·¹ÁøÀÇ CMA ¼³Á¤ ¹æ½ÄÀº ÀüÇô ´Ù¸£´Ù. À¥ ·ÎÁ÷À̳ª À¥ ½ºÇÇ¾î °°Àº °æ¿ì ¼³Á¤¿¡ ÇÊ¿äÇÑ XML¿¡ Á¢±ÙÇÒ ¼ö ¾ø°í Á¦°øÇÏ´Â ÄַܼΠ¼³Á¤ÇØ¾ß ÇÑ´Ù. ÀÌ °æ¿ì¿¡´Â ¼³Á¤ÇÏ´Â ¹æ½Ä ÀÚü°¡ ´Ù¸£´Ù. ±âÁ¸¿¡ ÅèĹ »ó¿¡¼ <¸®½ºÆ® 6>°ú °°ÀÌ JDBCRealmÀ¸·Î °³¹ßµÈ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÀÖ´Ù.
À̰ÍÀ» À¥ ·ÎÁ÷¿¡ Æ÷ÆÃ ÇÏ´Â °ÍÀº ½±Áö ¾Ê´Ù. À¥ ·ÎÁ÷Àº JDBC ±â¹ÝÀÇ RealmÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù. À¥ ·ÎÁ÷Àº ±âº»ÀûÀ¸·Î LDAP ±â¹ÝÀÇ Realm¸¸À» Áö¿øÇÑ´Ù. º¸¾È Ãø¸éÀÇ ±â´ÉÀº WASº°·Î ´Ù¸¥ ¹æ½Ä°ú ÀýÂ÷·Î ¼³Á¤µÇ¾î¾ß ÇÑ´Ù´Â ¾î·Á¿òÀÌ ÀÖ´Ù. µ¿ÀÏÇÑ ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÏÁö ¾Ê´Â °æ¿ìµµ ÀÖ´Ù. µû¶ó¼ CMAÀ» »ç¿ëÇÒ °æ¿ì À̽ļºÀÌ ¶³¾îÁö´Â °á°ú¸¦ ³º´Â °ÍÀÌ´Ù.
¾ÖÇø®ÄÉÀÌ¼Ç ·¹º§ º¸¾È
¾Õ¼ À̾߱â ÇÑ °Íó·³ Acegi´Â ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿öÅ©¸¦ ±â¹ÝÀ¸·Î °³¹ßµÈ º¸¾È ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù. Acegi´Â ÇÊÅ͸¦ ÀÌ¿ëÇÏ¿© URL °Ë»ç¸¦ Çϰí, »ç¿ëÀÚ ·Î±×ÀÎ ¹× ¿ªÇÒÀ» ÇÒ´çÇÏ°í ºñÁî´Ï½º ·ÎÁ÷ ¸Þ¼ÒµåÀÇ »ç¿ëÀÚ ±ÇÇÑ °Ë»çÇÏ´Â ¿ªÇÒÀ» ´ã´çÇÑ´Ù.
Acegi°¡ ½ºÇÁ¸µ ±â¹ÝÀ¸·Î ¸¸µé¾îÁ³´Ù°í´Â ÇÏÁö¸¸ ²À ½ºÇÁ¸µÀ» »ç¿ëÇÏ´Â À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¸¸ Àû¿ëÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. Acegi´Â »ç¿ëÀÚ ÀÎÁõ°ú ±ÇÇÑÀ» ó¸® ´ë»óÀ¸·Î ÇÑ´Ù.
»ç¿ëÀÚ ÀÎÁõÀº À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÇÊÅ͸¦ ÅëÇØ¼ ÀÎÁõ ´ë»ó ¸®Äù½ºÆ®¸¦ ó¸®ÇÑ´Ù. »ç¿ëÀÚ¸¦ ±¸ºÐÇϱâ À§ÇÏ¿© PrincipalÀ» »ç¿ëÇϰí ÀÎÁõÀ» Çϱâ À§ÇÏ¿© Credentials¸¦ »ç¿ëÇÑ´Ù. Principal°ú Credentials¶ó´Â ¿ë¾î°¡ »ý¼ÒÇÒ °ÍÀÌ´Ù. À̰ÍÀº Æû ±â¹Ý ÀÎÁõ¿¡¼ »ç¿ëµÇ´ø id¿Í ÆÐ½º¿öµå¸¦ ÀǹÌÇÑ´Ù.
º¸¾ÈÃø¸é¿¡¼ »ç¿ëÀÚ¸¦ ±¸ºÐÇϰí È®ÀÎ ÇÏ´Â ¹æ¹ýÀº ¸Å¿ì ´Ù¾çÇÏ´Ù. Æû ±â¹ÝÀÇ ¾ÆÀ̵ð/ÆÐ½º¿öµå°¡ ÀϹÝÀûÀÌÁö¸¸, À̰ÍÀº »ç¿ëÀÚ¸¦ ±¸ºÐÇϰí È®ÀÎÇÏ´Â º¸¾ÈÀÇ ´Ù¾çÇÑ ¹æ¹ý Áß¿¡ ÇϳªÀÏ »ÓÀÌ´Ù.
Acegi´Â HTTP Basic ¹æ½Ä, HTML Form ÅÂ±× ¹æ½Ä, ½Ì±Û»çÀοÂ(CAS, Central Authentication Service¸¸À» Áö¿ø) ¹æ½ÄÀ» ±âº»À¸·Î Áö¿øÇÑ´Ù. ±× ¿ÜÀÇ ÀÎÁõ ¹æ½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï È®À强µµ Á¦°øÇÑ´Ù. µû¶ó¼ »ç¿ëÀÚ ±¸ºÐ°ú È®ÀÎ Á¤º¸¸¦ Principal°ú Credentials·Î Ç¥ÇöÇÑ´Ù. Acegi´Â AOP¸¦ ÀÌ¿ëÇÏ¿© ¸Þ¼Òµå ½ÇÇà ÀüÈÄ¿¡ ±ÇÇÑÀ» üũÇÑ´Ù.
¡ÜÀ¥ ¾ÖÇø®ÄÉÀÌ¼Ç Acegi web.xml ¼³Á¤
À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¼ Acegi¸¦ »ç¿ëÇϱâ À§Çؼ´Â web.xml¿¡ <¸®½ºÆ® 7>°ú °°Àº ¼³Á¤À» ÇØ¾ß ÇÑ´Ù. Acegi´Â ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿öÅ©¸¦ »ç¿ëÇÑ´Ù. °ú °¡ ¹Ù·Î ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿öÅ©¸¦ ¼³Á¤ÇÏ´Â °úÁ¤ÀÌ´Ù.
¼³Á¤À» ÅëÇØ¼ ¸ðµç HTTP ¸®Äù½ºÆ®´Â FilterToBeanProxy ÇÊÅÍ·Î Àü´ÞµÈ´Ù. FilterToBeanProxy´Â µî·ÏµÈ ÇÊÅ͵éÀ» ¼øÂ÷ÀûÀ¸·Î ½ÇÇàÇÏ¿© º¸¾È üũ¸¦ ó¸®ÇÑ´Ù.
| <¸®½ºÆ® 7>À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡ Acegi¸¦ Àû¿ëÇϱâ À§ÇÑ web.xml ¼³Á¤ | | | |
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-acegi-security.xml</param-value>
</context-param>
<!- Acegi º¸¾È ÇÊÅÍ µî·Ï -->
<filter>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
<!- »ç¿ëÀÚ ¸®Äù½ºÆ®¸¦ Acegi¸¦ º¸³»±â À§ÇÑ ÆÐÅÏ ¼³Á¤ -->
<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!- À¥ ¾ÖÇø®ÄÉÀÌ¼Ç ±¸µ¿ ½Ã ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿÷ ÀνºÅϽº¸¦ »ý¼ºÇϱâ À§ÇÑ ¸®½º³Ê -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener>
| |
 |
¡ÜAcegi ¼³Á¤ – filterChainProxy
web.xml¿¡ ¼³Á¤µÈ FilterChainProxy ÇÊÅÍ´Â applicationContext-acegi-security.xml¿¡ µî·ÏµÈ filterChainProxy ºóÀ» »ç¿ëÇÑ´Ù. <¸®½ºÆ® 8>Àº filterChainProxyÀÇ ¼³Á¤ ¿¹Á¦ÀÌ´Ù. org.acegisecurity.util.FilterChainProxy Ŭ·¡½º¸¦ ¹Ýµå½Ã ¡®filterChainProxy¡¯·Î µî·ÏÇØ¾ß ÇÑ´Ù. filterChainProxy´Â HTTP ¸®Äù½ºÆ®¸¦ ó¸® ÇÒ ¼øÂ÷ÀûÀÎ ÇÊÅ͵éÀÌ µî·ÏµÈ´Ù.
<¸®½ºÆ® 8>¿¡¼ ¡®CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON¡¯Àº ÇöÀç URLÀ» ¸ðµÎ ¼Ò¹®ÀÚ·Î ÀüȯÇ϶ó´Â ¸í·ÉÀÌ´Ù. ¡®PATTERN_TYPE_APACHE_ANT¡¯Àº ó¸®ÇÒ URL ÆÐÅÏÀ» µî·ÏÇÏ´Â ¹æ½ÄÀ¸·Î Á¤±Ô Ç¥Çö½Ä ´ë½Å ANT ½ºÅ¸ÀÏÀÇ ÆÐÅÏÀ» »ç¿ëÇϰڴٴ ÀǹÌÀÌ´Ù.
¡®/**¡¯ ÆÐÅÏ¿¡ ÀÏÄ¡ÇÏ´Â ¸®Äù½ºÆ®¿¡ ´ëÇÏ¿© ´ÙÀ½¿¡ Á¤ÀÇµÈ ¿ °³ÀÇ ÇÊÅ͸¦ µî·ÏµÈ ¼ø¼´ë·Î ½ÇÇàÇ϶ó´Â ÀǹÌÀÌ´Ù.
| <¸®½ºÆ® 8> applicationContext-acegi-security.xmlÀÇ FilterChainProxy ¼³Á¤ | | | |
<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,logoutFilter,
authenticationProcessingFilter,basicProcessingFilter,
securityContextHolderAwareRequestFilter, rememberMeProcessingFilter,
anonymousProcessingFilter, switchUserProcessingFilter,
exceptionTranslationFilter, filterInvocationInterceptor
</value>
</property>
</bean>
| |
 |
Acegi ÇÊÅÍ¿Í ÀÚ¿ø Á¢±Ù ¼³Á¤
<¸®½ºÆ® 8>ÀÇ ¼³Á¤ Áß¿¡¼ ÁÖ·Î »ç¿ëµÇ´Â ³× °³ÀÇ ºó¿¡ ´ëÇØ Á¶±Ý ´õ ÀÚ¼¼È÷ »ìÆìº¸ÀÚ. ¿©±â¿¡¼ ¾Ë¾Æ º¼ ³× °³ÀÇ ºóÀº AuthenticationProcessingFilter¿Í HttpSessionContextIntegrationFilter, ExceptionTranslationFilter ±×¸®°í FilterSecurityInterceptorÀÌ´Ù. °¢ ºóÀÇ ¿ªÇÒ¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.
¡ÜAuthenticationProcessingFilter
authenticationProcessingFilter´Â URL(authenticationFailureUrl) ÀÎÁõÀÌ ½ÇÆÐÇßÀ» °æ¿ì¿¡ À̵¿ÇÒ URL(filterProcessesUrl)À» ¼³Á¤ÇÑ´Ù. ¶ÇÇÑ ÀÎÁõ ÀýÂ÷¸¦ ¾î¶»°Ô ¼³Á¤ÇÒ °ÍÀΰ¡¸¦ µî·ÏÇϴµ¥ À̰ÍÀÌ ¹Ù·Î authenticationManagerÀÌ´Ù. AuthenticationManager¸¦ ÅëÇØ¼ »ç¿ëÀÚÀÇ Principal°ú Credentials°¡ Á¤È®ÇÑ Áö ÆÄ¾ÇÇϰí ÀûÀýÇÑ Ã³¸®¸¦ ¼öÇàÇÏ°Ô µÈ´Ù.
| <¸®½ºÆ® 9> applicationContext-acegi-security.xmlÀÇ AuthenticationProcessingFilter ¼³Á¤ | | | |
<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationFailureUrl" value="/acegilogin.jsp?login_error=1"/>
<property name="defaultTargetUrl" value="/"/>
<property name="filterProcessesUrl" value="/j_acegi_security_check"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
<bean>
| |
 |
<¸®½ºÆ® 9>ÀÇ authenticationProcessingFilter ºóÀº authenticationManager ºó¿¡ ÀÇÁ¸¼ºÀ» °¡Áö°í ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. autenticationManager ºó ÀÌÇÏÀÇ ÀÇÁ¸¼ºÀº <¸®½ºÆ® 10>°ú °°´Ù. authenticationManager´Â ÀÎÁõÀ» ó¸®ÇÏ´Â º¹¼öÀÇ Provider¸¦ Æ÷ÇÔÇÏ°í ¼øÂ÷ÀûÀ¸·Î Provider¿¡°Ô ÀÎÁõ ÀýÂ÷¸¦ À§ÀÓÇÏ´Â ¿ªÇÒ¸¸À» ÇÑ´Ù.
authenticationManager ¿¹Á¦¿¡¼ »ç¿ëÇÏ´Â Provider´Â DaoAuthenticationProvider¸¦ »ç¿ëÇϰí ÀÖ´Ù. DaoAuthenticationProvider´Â ¸Þ¸ð¸®¿Í ÇØ½Ã, µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÈ µ¥ÀÌÅ͸¦ ÀÎÁõÇÏ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. DaoAuthenticationProvider´Â userDetailsService¿¡ ¾î¶² ÀúÀå¼Ò¸¦ »ç¿ëÇÒ °ÍÀΰ¡¸¦ ¼³Á¤ÇÑ´Ù.
<¸®½ºÆ® 10>Àº <¸®½ºÆ® 12>ÀÇ users.properties Á¤º¸¸¦ ¸Þ¸ð¸®¿¡ °ü¸®ÇÏ´Â userDetailsServiceºóÀ» »ç¿ëÇϵµ·Ï ¼³Á¤µÈ ¿¹Á¦ÀÌ´Ù. Acegi¿¡¼ »ç¿ëÇÏ´Â ÀÎÁõÀÇ ÇÙ½É ÀÎÅÍÆäÀ̽º´Â Authentication°ú AuthenticationManagerÀÌ´Ù.
ProviderManager´Â AuthenticationManagerÀÇ ±¸Çö Ŭ·¡½ºÀÌ´Ù. AuthenticationÀº ³»ºÎÀûÀ¸·Î ¼¼ °³ÀÇ ÁÖ¿ä ¸â¹ö º¯¼ö¸¦ °¡Áø´Ù. ÀÌ ¸â¹ö º¯¼ö´Â Principal, credentials, authorities ¹è¿ÀÌ´Ù. PrincipalÀº »ç¿ëÀÚÀÇ ±¸ºÐÀÚ(ID), credentials´Â ÀÎÁõÀ» È®ÀÎÇϱâ À§ÇÑ µ¥ÀÌÅÍ(ÆÐ½º¿öµå)À̰í credentials´Â »ç¿ëÀÚ ·ÑÀ» ÀúÀåÇÑ´Ù.
authenticationProcessingFilter°¡ ½ÇÇàµÉ ¶§ authenticationProcessingFilter´Â principal°ú credentials¸¦ ÀÌ¿ëÇÏ¿© Authentication °´Ã¼¸¦ »ý¼ºÇÑ´Ù. À̶§±îÁö credentials ¹è¿Àº ÃʱâÈ µÈ »óÅÂÀÌ´Ù. authenticationProcessingFilter´Â AuthenticationManager.authenticate(Authentication) ÀÌ¿ëÇÏ¿© Authentication °´Ã¼ÀÇ credentials¸¦ ¼³Á¤ÇÏ¿© ¿ÏÀüÇÑ Authentication °´Ã¼¸¦ ¸¸µé°Ô µÈ´Ù.
| <¸®½ºÆ® 10> ProviderManager¿Í ÀÇÁ¸¼º ¿¹Á¦ | | | |
bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list><ref local="daoAuthenticationProvider"/></list>
</property>
</bean>
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
<bean id="userDetailsService" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
<property name="userProperties">
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="/WEB-INF/users.properties"/>
</bean>
</property>
</bean>
| |
 |
| <¸®½ºÆ® 11> user.properties ¿¹Á¦ | | | |
marissa=koala,ROLE_SUPERVISOR
dianne=emu,ROLE_USER
scott=wombat,ROLE_USER
peter=opal,disabled,ROLE_USER
| |
 |
¡ÜHttpSessionContextIntegrationFilter
HttpSessionContextIntegrationFilter´Â AcegiÀÇ SecurityContext¸¦ ¼ºí¸´ ¼¼¼Ç°ú ¿¬°áÇÏ´Â ¿ªÇÒÀ» ´ã´çÇÑ´Ù. »ç¿ëÀÚÀÇ Authentication °´Ã¼¸¦ ¸Å¹ø ¸¸µå´Â °ÍÀº ºñÈ¿À²ÀûÀÌ´Ù. Acegi´Â AuthenticationÀ» ÀúÀåÇϰí Àç»ç¿ëÇÑ´Ù. Acegi´Â SecurityContextHolderÀÇ ThreadLocal ¸â¹ö º¯¼ö¿¡ SecurityContext¸¦ ÀúÀåÇÑ´Ù.
<¸®½ºÆ® 12>´Â ¾ÖÇø®ÄÉÀ̼ǿ¡¼ Authentication °´Ã¼¸¦ »ç¿ëÇϱâ À§ÇØ ¾ò¾î¿À´Â ÄÚµå¿Í HttpSessionContextIntegrationFilter¸¦ ¼³Á¤ÇÏ´Â XMLÀÇ ¿¹Á¦ÀÌ´Ù.
| <¸®½ºÆ® 12> HttpSessionContextIntegrationFilter ½ºÇÁ¸µ ºó ¼³Á¤ ¿¹Á¦ ¹× ÄÚµå | | | |
* applicationContext-acegi-security.xml¿¡ AuthenticationProcessingFilter ºó ¼³Á¤
<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
* Authenticaion °´Ã¼ ȹµæ ¿¹Á¦ ÄÚµå
SecurityContext sc = SecurityContextHolder.getContext();
Authentication authentication = sc.getAuthentication();
| |
 |
¡ÜExceptionTranslationFilter
ExceptionTranslationFilter´Â ¿¹¿Ü »óȲÀÌ ¹ß»ýÇÑ °æ¿ì ¾î¶»°Ô ó¸®ÇÒ °ÍÀΰ¡¸¦ Á¤ÀÇÇÑ´Ù. ÀÎÁõÀÌ µÇÁö ¾Ê¾Æ¼ ¿¹¿Ü°¡ ¹ß»ýÇÑ °æ¿ì¶ó¸é <¸®½ºÆ® 13>¿¡¼´Â ¡®/acegilogin.jsp¡¯°¡ Àü´ÞµÈ´Ù. ¹Ý¸é ±ÇÇÑÀÌ ¾ø¾î¼ ¿¹¿Ü°¡ ¹ß»ýÇÑ »óȲÀ̶ó¸é ¡®/accessDenied.jsp¡¯°¡ Àü´ÞµÈ´Ù.
| <¸®½ºÆ® 13> ExceptionTranslationFilterÀÇ ½ºÇÁ¸µ ºó ¼³Á¤ ¿¹Á¦ | | | |
<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/acegilogin.jsp"/>
<property name="forceHttps" value="false"/>
</bean>
</property>
<property name="accessDeniedHandler">
<bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
<property name="errorPage" value="/accessDenied.jsp"/>
</bean>
</property>
</bean>
| |
 |
¡ÜFilterSecurityInterceptor
FilterSecurityInterceptor´Â º¸¾È ´ë»ó ÀÚ¿øÀ» ¼³Á¤ÇÏ´Â ºÎºÐÀÌ´Ù. <¸®½ºÆ® 14>¿¡¼´Â objectDefinitionSource¿¡¼ »ç¿ëÇÒ ÀÚ¿øÀÇ ±ÇÇÑÀ» ¼³Á¤ÇÑ´Ù. HTTP ¸®Äù½ºÆ® URLÀ» ¸ðµÎ ¼Ò¹®ÀÚ·Î ¹Ù²Ù°í ant ½ºÅ¸ÀÏÀÇ ÆÐÅÏÀ» »ç¿ëÇϰڴٴ ¼³Á¤À» Çϰí ÀÖ´Ù. ¶Ç, ¡®/secure/extreme/¡¯ÀÌÇÏÀÇ URLÀº ROLE_SUPERVISOR ±ÇÇÑÀ» °®´Â »ç¿ëÀÚ¸¸ Á¢±Ù °¡´ÉÇϵµ·Ï ¼³Á¤ÇÏ´Â ¿¹Á¦ÀÌ´Ù.
ÇöÀç HTTP ¸®Äù½ºÆ®ÀÇ »ç¿ëÀÚ°¡ ¾ÆÁ÷ ÀÎÁõ ¹ÞÁö ¾Ê¾Ò´Ù¸é authenticationManager¸¦ »ç¿ëÇÏ¿© ÀÎÁõ ÀýÂ÷¸¦ °ÅÄ£´Ù. ÀÎÁõ ÀýÂ÷¸¦ °ÅÄ¡°í ±ÇÇÑ Á¤º¸¸¦ ¼öÁýÇÑ µÚ¿¡ objectDefinitionSourceÀ» È®ÀÎÇÏ¿© accessDecisionManager°¡ ÇöÀç »ç¿ëÀÚÀÇ Á¢±Ù ¿©ºÎ¸¦ °áÁ¤ÇÏ°Ô µÈ´Ù.
| <¸®½ºÆ® 14> FilterSecurityInterceptor ÀÇ ½ºÇÁ¸µ ºó ¼³Á¤ ¿¹Á¦ | | | |
<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager">
<bean class="org.acegisecurity.vote.AffirmativeBased">
<property name="allowIfAllAbstainDecisions" value="false"/>
<property name="decisionVoters">
<list>
<bean class="org.acegisecurity.vote.RoleVoter"/>
<bean class="org.acegisecurity.vote.AuthenticatedVoter"/>
</list>
</property>
</bean>
</property>
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/secure/extreme/**=ROLE_SUPERVISOR
/**=ROLE_USER
</value>
</property>
</bean>
| |
 |
Acegi¿Í Ä£ÇØÁö±â
Acegi´Â ÀÚ¹Ù Ç÷§Æû¿¡ »ç¿ë °¡´ÉÇÑ º¸¾È ÇÁ·¹ÀÓ¿öÅ© Áß ÃÖ°íÀÇ °ÉÀÛÀÌ´Ù. ÀÌ ¹øÈ£¿¡¼´Â Acegi ÇÁ·¹ÀÓ¿÷¿¡ ÀûÀÀÇϱâ À§ÇÑ °¡Àå ±âº»ÀûÀÎ ¼³Á¤¹ý°ú ±âº» °³³ä¸¸À» »ìÆìº¸¾Ò´Ù. Acegi ÇÁ·¹ÀÓ¿öÅ©°¡ ÁÁ±â´Â ÇÏÁö¸¸ óÀ½¿¡ Á¢±ÙÇÏ´Â °ÍÀº ½±Áö ¾ÊÀº °ÍÀÌ »ç½ÇÀÌ´Ù. CMA¿¡ ´ëÇÏ¿© Àü¹ÝÀûÀ¸·Î »ìÆìº¸°í ½Í´Ù¸é ¡®J2EE Form-based Authentication¡¯ (http://www.onjava.com/pub/a/onjava/2002/06/12/form.html)À» ÃßõÇÑ´Ù.
Acegi ÀÚü¿¡ ´ëÇÑ ÀÚ·á·Î´Â www.acegisecurity.org¿¡¼ Á¦°øÇÏ´Â ·¹ÆÛ·±½º ¸Å´º¾óÀÌ °¡Àå ÁÁÀº ÀÚ·áÁö¸¸ ±× ÀڷḦ Á¢Çϱâ Àü¿¡ http://www.acegisecurity.org/articles.html¿¡ Á¤¸®µÈ ¹®¼¸¦ Àо´Â °ÍÀ» ÃßõÇÑ´Ù. À̰÷¿¡´Â ºí·Î±×³ª ±âŸ À¥ ¹®¼·Î Á¸ÀçÇÏ´Â ÁÖ¿ä ÀÚ·áÀÇ ¸®½ºÆ®¸¦ Á¦°øÇÑ´Ù.
ÀÌ Áß¿¡¼ ¡®Securing Your Java Applications - Acegi Security Style¡¯´Â ¹Ýµå½Ã ÀÐ¾î º¸´Â °ÍÀÌ ÁÁ´Ù. ÀÌ ¹®¼¸¦ ¹ø¿ªÇÑ ¹®¼´Â ¡®http://openframework.or.kr/JSPWiki/Wiki.jsp?page=SecuringYourJavaApplications¡¯¿¡ ÀÖ´Ù.
¸¶Áö¸·À¸·Î ÀÚ¹ÙÁö±â À§Å°(http://wiki.javajigi.net/)¿¡ Spring Framework °Á¿¡ AcegiÀÇ Àü¹ÝÀûÀÎ °³³äÀ» Á¤¸®ÇÑ ¹®¼¸¦ Á¦°øÇϰí ÀÖ´Ù. ¶ÇÇÑ 2006³â 1¿ùºÎÅÍ 3°³¿ù°£ ¸¶¼Ò¿¡ ¿¬ÀçµÈ ¡®Acegi Security¡¯ ¿¬À縦 ÅëÇØ¼ acegiÀÇ Àü¹ÝÀûÀÎ °³³äÀ» ÀâÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ ¹®¼µéÀ» »ìÆìº¸°í SpringFrmaeworkÀÇ Reference ManualÀ» Àо´Â °ÍÀÌ °¡Àå È¿°úÀûÀÎ Á¢±Ù¹ýÀ̶ó°í »ý°¢ÇÑ´Ù. @
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.