[Áöµð³ÝÄÚ¸®¾Æ]Áö³ ±Û¿¡¼´Â ½ºÇÁ¸µ ÇÁ·¹ÀÓ¿öÅ©¸¦ ¼Ò°³ÇÏ°í ½ºÇÁ¸µÀÇ WebMVC ¸ðµâÀ» ÀÌ¿ëÇØ À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÏ´Â ¹æ¹ý°ú ½ºÆ®·µÃ÷¿ÍÀÇ ¿¬µ¿ ¹æ¹ý¿¡ ´ëÇØ »ìÆìº¸¾Ò´Ù. À̹ø ±Û¿¡¼´Â OR ¸ÊÇÎ µµ±¸ÀÇ ¼±µÎ ÁÖÀÚÀÎ ÇÏÀ̹ö³×ÀÌÆ®¿¡ ´ëÇØ »ìÆìº¸°í, ÇÏÀ̹ö³×ÀÌÆ®°¡ ¾î¶»°Ô ½ºÇÁ¸µ°ú °áÇÕÇÏ¿© ½Ã³ÊÁö È¿°ú¸¦ ¹ßÈÖÇÏ´ÂÁö »ìÆìº¸µµ·Ï ÇÏÀÚ.
¿£ÅÍÇÁ¶óÀÌÁî ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß¿¡¼´Â µ¥ÀÌÅͺ£À̽º¿Í ¿¬µ¿ÇÏ¿© CRUD ¿¬»êÀ» ¼öÇàÇÒ ÆÛ½Ã½ºÅϽº °èÃþÀ» ¸¸µé°í, À¯Áö º¸¼öÇÏ´Â ÀÛ¾÷¿¡ »ó´çÇÑ ½Ã°£°ú ³ë·ÂÀ» ÅõÀÚÇÏ°Ô µÈ´Ù. ¸¸ÀÏ µ¥ÀÌÅͺ£À̽ºÀÇ ½ºÅ°¸¶°¡ ¹Ù²î´Â °æ¿ì¿¡´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ ³ª¸ÓÁö ºÎºÐµµ Å©°Ô º¯°æÇØ¾ß ÇÑ´Ù.
´ëºÎºÐÀÇ ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ßÀÌ °´Ã¼ÁöÇâ ±â¼úÀ» »ç¿ëÇϰí ÀÖ´Â µ¥ ¹ÝÇØ, µ¥ÀÌÅͺ£À̽º´Â °ü°èÇü µ¥ÀÌÅÍ ¸ðµ¨À» »ç¿ëÇÏ´Â RDBMS¸¦ ÀÌ¿ëÇϰí ÀÖ´Ù. ÀÌ·Î ÀÎÇØ °´Ã¼ ¸ðµ¨¸µ°ú °ü°èÇü µ¥ÀÌÅÍ ¸ðµ¨¸µ »çÀÌ¿¡ °³³äÀû ºÒÀÏÄ¡°¡ Á¸ÀçÇÏ°Ô µÇ°í, °ÅÀÇ ¸ðµç ÇÁ·ÎÁ§Æ®¿¡¼´Â ÆÛ½Ã½ºÅϽº °èÃþÀÇ ±¸Çö¿¡ ½É°¢ÇÑ ¼öÁØÀÇ º¹Àâµµ ºÎ´ãÀ» ¶°¾È°Ô µÇ´Â °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¹®Á¦µéÀ» ÇØ°áÇϱâ À§ÇØ OR ¸ÊÇÎÀ» ÀÚµ¿ÈÇØ ÁÖ´Â ´Ù¾çÇÑ µµ±¸¿Í ±â¼úµéÀÌ µîÀåÇß´Ù. EJBÀÇ CMP(ÄÁÅ×ÀÌ³Ê °ü¸® ÆÛ½Ã½ºÅϽº) ¹æ½ÄÀÇ ¿£Æ¼Æ¼ ºóµµ ÀÖ°í, CocoBase³ª TopLink¿Í °°Àº Àü¹® Á¦Ç°µéµµ ÀÖ´Ù. ÃÖ±Ù OR ¸ÊÇÎ µµ±¸·Î½á ÁÖ¸ñÀ» ²ø°í ÀÖ´Â °ÍÀº XMLÀ» »ç¿ëÇÏ´Â ÆÛ½Ã½ºÅϽº ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù.
ÆÛ½Ã½ºÅϽº ÇÁ·¹ÀÓ¿öÅ©ÀÇ ´ëÇ¥ ÁÖÀÚ´Â JDO(Java Data Object)ÀÇ ¾ÆÆÄÄ¡ ±¸ÇöÀÎ OJB(ObJect Relational Bridge)¿Í iBatis ±×¸®°í ÇÏÀ̹ö³×ÀÌÆ®(Hibernate)ÀÌ´Ù. OJBÀÇ °æ¿ì ½ãÀÇ Ç¥ÁØ ½ºÆåÀÎ JDO¸¦ ±¸ÇöÇÑ Á¡°ú ¿ÀǼҽºÀÇ »ê½ÇÀÎ ¾ÆÆÄÄ¡ ÇÁ·ÎÁ§Æ®·Î ÁøÇàµÈ´Ù´Â Á¡ÀÌ °Á¡ÀÌ´Ù. OJB¿¡ °üÇØ¼´Â ÀÌ¹Ì ¿¬ÀçµÈ ÀûÀÌ ÀÖÀ¸¹Ç·Î ÀÚ¼¼ÇÑ ³»¿ëÀº ÇØ´ç ±ÛÀ» ã¾Æº¸±â ¹Ù¶õ´Ù.
ÃÖ±Ù¿¡´Â OJBº¸´Ù iBatis¿Í ÇÏÀ̹ö³×ÀÌÆ®¿¡ ´ëÇÑ °ü½ÉÀÌ ´õ ³ôÀº µí ÇÏ´Ù. iBatis¿Í ÇÏÀ̹ö³×ÀÌÆ®ÀÇ °¡Àå Å« Â÷ÀÌÁ¡Àº ¸ÊÇÎ ¹æ¹ý¿¡ ÀÖ´Ù. µÑ ´Ù OR ¸ÊÇÎÀ» À§ÇØ XMLÀ» »ç¿ëÇϰí ÀÖÁö¸¸, iBatis´Â SQL Äõ¸®¸¦ »ç¿ëÇØ¼ ¸ÊÇÎÇÏ´Â ¹Ý¸é¿¡ ÇÏÀ̹ö³×ÀÌÆ®´Â Å×À̺íÀÇ Ä÷³°ú ÀÚ¹Ù °´Ã¼ÀÇ ¼Ó¼ºÀ» ¸ÊÇÎÇÑ´Ù.
iBatis´Â °³¹ßÀڵ鿡°Ô Àͼ÷ÇÑ SQL Äõ¸®¸¦ Á÷Á¢ »ç¿ëÇϱ⠶§¹®¿¡ °³³äÀûÀÎ ¿À¹öÇìµå°¡ ÀûÀº ÆíÀÌ´Ù. µû¶ó¼ OR ¸ÊÇÎ µµ±¸¿¡ Àͼ÷ÇÏÁö ¾ÊÀº °³¹ßÀÚ¶ó°í ÇÏ´õ¶óµµ ½±°Ô ÀûÀÀÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ DB Àü¹®°¡µéÀÇ Æ©´× ³ëÇϿ찡 Á¢¸ñµÈ SQLÀ» ÀÚÀ¯·Ó°Ô ÀÌ¿ëÇØ °¢ DBMSÀÇ ÀåÁ¡À» Àû±Ø ¼ö¿ëÇÒ ¼ö ÀÖ´Ù´Â °Íµµ ÀåÁ¡ÀÌ´Ù. ÇÏÁö¸¸ ±âÁ¸ÀÇ °³¹ß ¹æ¹ý°ú À¯»çÇÑ Á¡ÀÌ ¸¹±â ¶§¹®¿¡ °³¹ß ¼Óµµ³ª ¹®Á¦¸¦ ÇØ°áÇÏ´Â ÆÐ·¯´ÙÀÓ ÀÚü¸¦ ´«¿¡ ¶é ¸¸Å °³¼±ÇØ ÁÖÁö´Â ¸øÇÑ´Ù.
ÇÏÀ̹ö³×ÀÌÆ®ÀÇ °æ¿ì´Â iBatis¿Í ¹Ý´ëÀÌ´Ù. ÇÏÀ̹ö³×ÀÌÆ®´Â SQL ÀÚü¸¦ ³»ºÎÀûÀ¸·Î ¼û°Ü¼ °³¹ßÀÚ¿¡°Ô º¸¿©ÁÖÁö ¾Ê´Â´Ù. µ¥ÀÌÅÍÀÇ ±âº» CRUD ¿¬»êÀº ¸ÊÇÎµÈ ÀÚ¹Ù °´Ã¼¸¦ ÅëÇØ ÀÌ·ç¾îÁø´Ù. ÇÏÀ̹ö³×ÀÌÆ®¸¦ º¸´Ù ´õ °´Ã¼ÁöÇâÀûÀ̸ç, ÀÚ¹Ù´Ù¿î ¹æ¹ýÀ¸·Î ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. ÇÏÁö¸¸ OR ¸ÊÇÎÀÇ °³³ä¿¡ Àͼ÷ÇØÁö±â±îÁö ¿À·£ ½Ã°£ÀÌ °É¸®´Â ´ÜÁ¡ÀÌ ÀÖ¾î, ½Ç¹«¿¡¼ »ç¿ëÇϱâ À§Çؼ´Â ±â¼ú ±³À°¿¡ »ó´çÇÑ ½Ã°£ÀÌ ¼Ò¿äµÇ´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.
°á·ÐÀûÀ¸·Î ¿£Æ¼Æ¼ ºóÀÇ ´ë¾ÈÀ¸·Î °Å·ÐµÇ´Â ÆÛ½Ã½ºÅϽº ÇÁ·¹ÀÓ¿öÅ© Áß ´çÀå ½Ç¹«¿¡¼ »ç¿ëÇϱ⿡ ÀûÇÕÇÑ °ÍÀº iBatisÀÌ´Ù. ÇÏÁö¸¸ ÆÀ¿øµéÀÇ ±³À°¿¡ ÃæºÐÇÑ ½Ã°£À» ÇÒ¾ÖÇÒ ¿©À¯°¡ ÀÖ´Ù¸é ÇÏÀ̹ö³×ÀÌÆ®³ª OJBÀÇ »ç¿ëÀ» ±ÇÇÏ°í ½Í´Ù.
ÇÏÀ̹ö³×ÀÌÆ®ÀÇ °³¿ä
ÇÏÀ̹ö³×ÀÌÆ®´Â ÇöÀç ¼¼°èÀûÀ¸·Î °¡Àå ¸¹Àº °ü½ÉÀ» ¹Þ°í ÀÖ´Â ÀÚ¹Ù ±â¹ÝÀÇ OR ¸ÊÇÎ µµ±¸ÀÌ´Ù. ÇÏÀ̹ö³×ÀÌÆ®´Â LGPL·Î ¹èÆ÷µÇ°í ÀÖ´Ù. µû¶ó¼ ¿ÀǼҽº ÇÁ·ÎÁ§Æ®»Ó ¾Æ´Ï¶ó »ó¾÷¿ë ÇÁ·ÎÁ§Æ®¿¡¼µµ ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÇÏÀ̹ö³×ÀÌÆ®´Â ¿À¶óŬ, DB2, MySQLÀ» ºñ·ÔÇÑ ´ëºÎºÐÀÇ µ¥ÀÌÅͺ£À̽º¸¦ Áö¿øÇϸç, ½ºÆ®·µÃ÷, ½ºÇÁ¸µ, À¥¿öÅ© µîÀÇ À¯¸í ÇÁ·¹ÀÓ¿öÅ©µé°ú À¥·ÎÁ÷, À¥½ºÇǾî, JBoss, ÅèÄÏ µîÀÇ °¢Á¾ ¾ÖÇø®ÄÉÀÌ¼Ç ¼¹öµé°úµµ ½±°Ô ¿¬µ¿µÉ ¼ö ÀÖ´Ù.
ÇÏÀ̹ö³×ÀÌÆ®´Â º¹ÇÕ Å¸ÀÔÀº ¹°·Ð, Ä÷º¼Ç°ú °´Ã¼ °ü°è¸¦ Áö¿øÇÑ´Ù. °´Ã¼¿¡ ´ëÇÑ ÆÛ½Ã½ºÅϽº¸¦ Á¦°øÇÏ´Â °ÍÀº ¹°·ÐÀ̰í, È¿À²ÀûÀΠij½Ì °èÃþ°ú JMX(Java Manage eXtensions)¸¦ Áö¿øÇÑ´Ù. ¶ÇÇÑ µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ °´Ã¼¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Â Äû¸® ¾ð¾îÀÎ HQL(Hibernate Query Language)µµ Á¦°øµÈ´Ù.
ÇÏÀ̹ö³×ÀÌÆ®ÀÇ °¡Àå Å« ÀåÁ¡Àº ¹®¼È°¡ Àß µÇ¾î ÀÖ°í, ¸¹Àº ÀڷḦ È®º¸ÇÑ Ä¿¹Â´ÏƼÀÇ Áö¿øÀÌ Ãæ½ÇÇÏ´Ù´Â Á¡ÀÌ´Ù. ¶ÇÇÑ ¼ö¸¹Àº ³ë°¡´Ù¼º ÄÚµùÀ» ÇÏÁö ¾Êµµ·Ï ÀÚµ¿ÈµÈ ÇÁ·¹ÀÓ¿öÅ©¸¦ Á¦°øÇϰí ÀÖÀ½¿¡µµ ºÒ±¸Çϰí, ÀϹÝÀûÀÎ JDBC ±¸Çö¿¡ ºñ±³Çصµ µÚÁöÁö ¾Ê´Â ³ôÀº ¼º´ÉÀ» º¸ÀåÇÑ´Ù.
ÇÏÀ̹ö³×ÀÌÆ®°¡ Áö¿øÇÏ´Â ³ôÀº ¼º´ÉÀº Lazy Initializing ProxyÀÎ CGLIB¿Í °¢Á¾ ij½Ã Áö¿øÀ¸·Î ÀÌ·ïÁö´Âµ¥, ÇÏÀ̹ö³×ÀÌÆ®ÀÇ Ã¢½ÃÀÚÀÎ °¡ºó IJ(Gavin Kang)Àº ÇѶ§ µ¿ÀÏÇÑ SQLÀ» È£ÃâÇÏ´Â JDBC ÇÁ·Î±×·¥¿¡ ºñÇØ ÇÏÀ̹ö³×ÀÌÆ®°¡ ´À¸®´Ù´Â °ÍÀ» Áõ¸íÇÏ´Â »ç¶÷¿¡°Ô´Â ÀÚºñ·Î 100´Þ·¯¸¦ ÁöºÒÇÏ´Â À̺¥Æ®¸¦ ¹úÀ̱⵵ Çß´Ù. ¹°·Ð ±× µ·À» ¹Þ¾Æ°¬´Ù´Â »ç¶÷Àº ¾ø´Ù.
ÇöÀç ÇÏÀ̹ö³×ÀÌÆ®ÀÇ ÃֽйöÀüÀº 2.1.6À̸ç, 3.0 ¾ËÆÄ Å×½ºÆ® ¹öÀüÀÌ ¹èÆ÷µÇ°í ÀÖ´Ù. ÇÏÀ̹ö³×ÀÌÆ®´Â <±×¸² 1>¿¡¼ º¸¿©Áö´Â °Íó·³ ¾ÖÇø®ÄÉÀ̼ǰú µ¥ÀÌÅͺ£À̽º »çÀÌÀÇ ÆÛ½Ã½ºÅϽº °èÃþÀ» ´ã´çÇÑ´Ù.
 |
| <±×¸² 1> ÇÏÀ̹ö³×ÀÌÆ®ÀÇ ±âº» ±¸Á¶ |
ÇÏÀ̹ö³×ÀÌÆ®´Â ÆÛ½Ã½ºÅϽº ¼ºñ½º¸¦ ¾ÖÇø®ÄÉÀ̼ǿ¡ Á¦°øÇϱâ À§ÇØ ¸î °¡Áö ¼³Á¤ ÆÄÀÏÀ» ÇÊ¿ä·Î ÇÑ´Ù. ±âº» ¼³Á¤ ÆÄÀÏÀÎ hibernate.properties´Â µ¥ÀÌÅͺ£À̽º¿Í Á¢¼ÓÇϰųª ½ºÅ°¸¶¸¦ »ý¼ºÇÏ´Â µ¥ ÇÊ¿äÇÑ ±âº» Á¤º¸¸¦ ´ã°í ÀÖ´Ù. XML ¸ÊÇÎ ÆÄÀÏÀº CLASS_NAME.hbm.xmlÀÇ Çü½ÄÀ» °¡Áö¸ç ¿µ¼Ó °´Ã¼¿Í µ¥ÀÌÅͺ£À̽º Å×À̺íÀ» ¿¬°áÇÏ´Â, Áï OR ¸ÊÇο¡ ÇÊ¿äÇÑ °¢Á¾ ¸ÞŸ µ¥ÀÌÅ͸¦ Á¦°øÇÑ´Ù.
¿¹Á¦·Î ¾Ë¾Æº¸´Â ÇÏÀ̹ö³×ÀÌÆ®ÀÇ ±âÃÊ
ÀÌÁ¦ °£´ÜÇÑ ¿¹Á¦¸¦ ÅëÇØ ÇÏÀ̹ö³×ÀÌÆ®ÀÇ ±âº» °³³äÀ» ÀÍÇôº¸µµ·Ï ÇÏÀÚ. »ìÆìº¼ ¿¹Á¦´Â ÇÏÀ̹ö³×ÀÌÆ® ȨÆäÀÌÁö¸¦ ÅëÇØ Á¦°øµÇ´Â ºí·Î±× ¿¹Á¦ÀÌ´Ù. ÀÌ ¿¹Á¦¿¡¼ »ç¿ëµÇ´Â Å×À̺íÀº BLOGS¿Í BLOG_ITEMSÀÌ´Ù. 1:M °ü°è¸¦ ±¸ÇöÇÑ ¿¹Á¦À̸ç, 1:1 ¶Ç´Â N:M ¿¹Á¦ ¶ÇÇÑ Á¦°øµÇ¹Ç·Î Âü°íÇϱ⠹ٶõ´Ù. ÀÌ ¿¹Á¦´Â JDK 1.4.2 ȯ°æ¿¡¼ Å×½ºÆ®µÇ¾úÀ¸¸ç, »ç¿ëÇÑ ÇÏÀ̹ö³×ÀÌÆ® ¹öÀüÀº 2.1.6ÀÌ´Ù. IDE´Â ÀÌŬ¸³½º 3.1¿¡¼ Hiber8ide Ç÷¯±×ÀÎÀ» ¼³Ä¡Çؼ »ç¿ëÇß°í, µ¥ÀÌÅͺ£À̽º´Â HSQLDB 1.7.2¸¦ ÀÌ¿ëÇß´Ù.
 |
| <±×¸² 2> ºí·Î±× ¿¹Á¦ÀÇ OR ¸ÊÇÎ °ü°è |
¿¹Á¦´Â ÃÑ 4´Ü°è·Î ±¸¼ºµÇ¸ç, ÇÏÀ̹ö³×ÀÌÆ® ¸ÊÇÎ ÆÄÀÏÀÇ ÀÛ¼º¿¡¼ºÎÅÍ, ÆÛ½Ã½ºÅϽº¸¦ Ç¥ÇöÇÏ´Â POJO¿Í DB ½ºÅ°¸¶°¡ »ý¼ºµÇ´Â °úÁ¤À» º¸¿©ÁÖ°Ô µÉ °ÍÀÌ´Ù. ±×¸®°í ¸¶Áö¸·À¸·Î ÇÏÀ̹ö³×ÀÌÆ®¸¦ ÀÌ¿ëÇØ¼ DB¿¡ ÀúÀåµÈ °ªÀ» °¡Á®¿À´Â ¹æ¹ýÀ» »ìÆìº¼ °ÍÀÌ´Ù.
 |
| <±×¸² 3> ºí·Î±× ¿¹Á¦ ÁøÇà °úÁ¤ |
1´Ü°è. ÇÏÀ̹ö³×ÀÌÆ® ¸ÊÇÎ ÆÄÀÏ ÀÛ¼º
¿ì¼± ÇÏÀ̹ö³×ÀÌÆ® ¸ÊÇÎ(HiBernate Mapping) Á¤º¸¸¦ ´ãÀº XML ÆÄÀÏÀÎ hbm.xmlÀ» Å×ÀÌºí¸¶´Ù »ý¼ºÇÑ´Ù. °¢°¢ÀÇ hbm.xml ÆÄÀÏÀº hibernate-mappingÀ̶ó´Â ·çÆ® ¿¤¸®¸ÕÆ®¸¦ °¡Áö¸ç, ÆÐŰÁö Á¤º¸¸¦ package ¼Ó¼ºÀ¸·Î ÁÖ°í ÀÖ´Ù.
Blog.hbm.xml
<hibernate-mapping package="vssh.model">
<class name="Blog" table="BLOGS" lazy="true">
<cache usage="read-write"/> <!--¼º´É °ü·Ã element -->
<id name="id" type="long" column="BLOG_ID">
<generator class="native"/>
</id>
<property name="name" type="string" column="NAME" not-null="true" unique="true"/>
<list name="items" inverse="true" lazy="true" order-by="DATE_TIME" cascade="all">
<key column="BLOG_ID"/>
<one-to-many class="vssh.model.BlogItem"/>
</list>
</class>
</hibernate-mapping>
BlogItem.hbm.xml
<hibernate-mapping package="vssh.model">
<class name="BlogItem" table="BLOG_ITEMS" dynamic-update="true">
<cache usage="read-write"/> <!--¼º´É°ü·Ã element -->
<id name="id" type="long" column="BLOG_ITEM_ID">
<generator class="native"/>
</id>
<property name="title" type="string" column="TITLE" not-null="true"/>
<property name="text" type="string" column="TEXT" not-null="true"/>
<property name="datetime" type="date" column="DATE_TIME" not-null="true"/>
<many-to-one name="blog" class="vssh.model.Blog" column="BLOG_ID" not-null="true"/>
</class>
</hibernate-mapping>
°¢°¢ÀÇ hibernate-mapping ¿¤¸®¸ÕÆ®´Â class ¿¤¸®¸ÕÆ®¸¦ Æ÷ÇÔÇÑ´Ù. class ¿¤¸®¸ÕÆ®´Â OR ¸ÊÇÎÀ» À§ÇÑ ÇÙ½É ¿ä¼Ò·Î °¢ ¼Ó¼ºÀº <Ç¥ 1>°ú °°Àº Àǹ̸¦ °¡Áø´Ù.
 |
| <Ç¥ 1> class ¿¤¸®¸ÕÆ®ÀÇ ¼Ó¼º |
class ¿¤¸®¸ÕÆ® ³»¿¡ Æ÷ÇÔµÈ °¢°¢ÀÇ ¿¤¸®¸ÕÆ®¿¡ ´ëÇØ »ìÆìº¸ÀÚ. id´Â ÆÛ½Ã½ºÅÏÆ® °´Ã¼µéÀ» ±¸ºÐÇϱâ À§ÇØ »ç¿ëµÇ´Â ÇÁ¶óÀ̸Ӹ® Ű¿Í °°Àº Ư¼ö ¼Ó¼ºÀÌ´Ù. generator´Â ÆÛ½Ã½ºÅϽº Ŭ·¡½ºÀÇ ÄÚµå »ý¼º ¹æ¹ýÀ» °áÁ¤Áþ´Â ¼Ó¼ºÀÌ´Ù. increment, identity, sequence, hilo, seqhilo, uuid.hex, uuid.string, native, assigned, foreignÀÇ 10°¡Áö ¾Ë°í¸®ÁòÀÌ Á¦°øµÇ´Âµ¥ ¿¹Á¦¿¡¼´Â DB¿¡ Á¾¼ÓÀûÀÎ native ¹æ½ÄÀ» äÅÃÇß´Ù.
property´Â ID°¡ ¾Æ´Ñ ÀÏ¹Ý ¼Ó¼ºÀ» Á¤ÀÇÇÑ´Ù. µÚ¿¡¼ »ý¼º½Ãų POJO¿¡´Â °¢ ¼Ó¼ºº°·Î ÇÑ ½ÖÀÇ getter/setter°¡ ÀÚµ¿À¸·Î »ý¼ºµÈ´Ù. ¼Ó¼º¿¡´Â Ä÷³ÀÇ ±æÀÌ, ŸÀÔ Á¤º¸, ³Î(null) °ªÀÇ »ç¿ë °¡´É À¯¹« µîÀ» ±â¼úÇÒ ¼ö ÀÖ´Ù. id¿Í property¿¡¼ ¼³Á¤Çϴ ŸÀÔÀº ÇÏÀ̹ö³×ÀÌÆ®ÀÇ
ŸÀÔ Áö¿øÀ» Âü°íÇϱ⠹ٶõ´Ù. ¾Õ¿¡¼ ±â¼úÇÑ Å¸ÀÔµéÀº ¸ðµÎ ÇÏÀ̹ö³×ÀÌÆ®¿¡¼ ±âº»ÀûÀ¸·Î Á¦°øÇÏ´Â ±âº» ŸÀÔÀÌ´Ù.
°¢ ÆÛ½Ã½ºÅϽº °´Ã¼µé°£ÀÇ °ü°è ¼³Á¤¿¡´Â one-to-many, many-to-one°ú °°Àº ¿¤·¯¸ÕÆ®°¡ »ç¿ëµÈ´Ù. ´ÙÀ½ÀÇ ÄÚµå´Â ¼³Á¤ ÆÄÀÏ¿¡¼ °ü°è ¼³Á¤ ºÎºÐ¸¸À» µû·Î ¶¼¾î³½ °ÍÀÌ´Ù.
Blog.hbm.xml
<list name="items" inverse="false" lazy="true" order-by="DATE_TIME" cascade="all">
<key column="BLOG_ID"/>
<one-to-many class="vssh.model.BlogItem"/>
</list>
BlogItem.hbm.xml
<many-to-one name="blog" class="vssh.model.Blog"
column="BLOG_ID" not-null="true"/>
mapping ÆÄÀÏ·Î »ý¼ºµÈ Blog Ŭ·¡½º¿¡´Â ´ÙÀ½°ú °°Àº Äڵ尡 Æ÷ÇԵȴÙ.
private Set items;
list ¿¤¸®¸ÕÆ®ÀÇ À§Ä¡¿¡´Â <set>, <list>, <map>, <bag>, <array>¿Í <primitive-array>°¡ ¿À´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ¿Ü·¡ Ű(Foreign Key)°¡ Á¤ÀǵǸç ۸¦ Áß½ÉÀ¸·Î 1:1, 1:M , N:M µîÀÇ ¿¬°áÀÌ Ä÷º¼Ç API¸¦ ÅëÇØ Ç¥ÇöµÇ´Â °ÍÀÌ´Ù. À§ÀÇ ¿¹¸¦ º¸¸é Áï items¶ó´Â À̸§À» °¡Áø Set Ä÷º¼ÇÀÌ BlogItemÀÇ ÁýÇÕÀ» ´ã°í ÀÖÀ¸¸ç, °¢ BlogItemÀº BLOG_ID Ä÷³À» ¿Ü·¡ Ű·Î »ç¿ëÇØ¼ ÀÚ½ÅÀÌ ¼Ò¼ÓµÈ Blog¸¦ ÂüÁ¶ÇÏ°Ô µÇ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
list ¿¤¸®¸ÕÆ®¿¡´Â lazy¶õ ¼Ó¼ºÀÌ Àִµ¥ ±âº» °ªÀº falseÀÌ´Ù. lazy ¼Ó¼ºÀ» true·Î ±¸¼ºÇÏ°Ô µÇ¸é Blog¸¦ ±¸¼ºÇÒ ¶§ BlogItemÀÇ Á¤º¸¸¦ Ä÷º¼Ç¿¡ ´ãÁö ¾Ê´Â´Ù. Áï, ¾ÖÇø®ÄÉÀ̼ǿ¡¼ BlogItemÀÇ Á¤º¸°¡ ÇÊ¿äÇÒ ¶§±îÁö µ¥ÀÌÅͺ£À̽º¿¡¼ °ªÀ» °¡Á®¿Í¼ Ä÷º¼Ç¿¡ ´ã´Â ÇàÀ§¸¦ ´ÊÃãÀ¸·Î½á °á°úÀûÀ¸·Î ¼º´ÉÀ» Çâ»ó½ÃŰ´Â È¿°ú¸¦ ¾ò°Ô µÈ´Ù. inverse ¼Ó¼ºÀº µÎ °´Ã¼(Blog, BlogItem) °£ÀÇ °ü°è¿¡¼ ¾ç¹æÇ⼺À» ³ªÅ¸³½´Ù.
2´Ü°è. Ant¸¦ ÀÌ¿ëÇÑ POJO ÀÇ »ý¼º
ÇÏÀ̹ö³×ÀÌÆ® ¸ÊÇÎ ÆÄÀÏÀÇ ÀÛ¼ºÀÌ ³¡³ª¸é ÇÏÀ̹ö³×ÀÌÆ®ÀÇ Hbm2Java ±â´ÉÀ» ÀÌ¿ëÇØ¼ POJO °´Ã¼¸¦ ÀÚµ¿ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ Ant ½ºÅ©¸³Æ®¿¡¼ hbm2java·Î Á¤ÀÇµÈ Å½ºÅ©¸¦ ÀÌ¿ëÇØ¼ ¼³Á¤µÈ codegenÀ̶ó´Â Ÿ°ÙÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
build.xml
<taskdef name="hbm2java" classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
classpathref="project.class.path"/>
<!-- hbm to java code codegenarator !!! -->
<target name="codegen">
<hbm2java output="${src.dir}">
<fileset dir="${src.dir}">
<include name="**/*.hbm.xml"/>
</fileset>
</hbm2java>
</target>
»ý¼ºµÈ POJOÀÇ Å¬·¡½º ´ÙÀ̾î±×·¥Àº <±×¸² 4>¿¡¼ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
 |
| <±×¸² 4> Hbm2JavaTask[Hibernate extentions] class¸¦ ÀÌ¿ëÇØ »ý¼ºµÈ POJO ÆÄÀÏ |
3´Ü°è. Ant¸¦ ÀÌ¿ëÇÑ DB ½ºÅ°¸¶ »ý¼º
ÀÌÁ¦ SchemaExportTask ±â´ÉÀ» ÀÌ¿ëÇØ¼ DB ½ºÅ°¸¶¸¦ ÀÚµ¿ »ý¼ºÇØ º¸µµ·Ï ÇÏÀÚ. ´ÙÀ½ÀÇ Ant ½ºÅ©¸³Æ®¿¡¼ schemaexport¶õ À̸§ÀÇ Å½ºÅ©¸¦ Á¤ÀÇÇØ¼ schame¶õ À̸§ÀÇ Å¸°Ù¿¡¼ ÀÌ¿ëÇϰí ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦¿¡¼´Â hbm.xml ÆÄÀÏÀ» Á÷Á¢ »ç¿ëÇÏÁö ¾Ê°í, filesetÀ» ÁÖ¼®À¸·Î ¸·¾Æ hibernate.cfg.xml¸¦ ¼³Á¤ ÆÄÀÏ·Î »ç¿ëÇß´Ù. »ý¼ºµÈ ½ºÅ°¸¶ »ý¼º ½ºÅ©¸³Æ®´Â schema-export.sql ÆÄÀÏ¿¡¼ È®ÀÎ °¡´ÉÇÏ´Ù.
build.xml
<target name="schema">
<taskdef name="schemaexport"
classname="net.sf.hibernate.tool.hbm2ddl.SchemaExportTask"
classpathref="project.class.path"/>
<schemaexport drop="no" text="no" output="schema-export.sql"
config="${build.dir}/hibernate.cfg.xml">
<!--
<fileset dir="${build.dir}">
<include name="**/*.hbm.xml"/>
</fileset>-->
</schemaexport>
</target>
¼³Á¤ ÆÄÀÏ·Î »ç¿ëµÈ hibernate.cfg.xml ÆÄÀÏÀº ´ÙÀ½°ú °°´Ù. HSQLDB ¿¬°áÀ» À§ÇÑ ±âº» ¼³Á¤°ú ¼º´É °ü·Ã ¿¤¸®¸ÕÆ®, ±×¸®°í ¸ÊÇÎ ÆÄÀÏ Á¤º¸¸¦ ´ã°í ÀÖ´Ù.
hibernate.cfg.xml
...DTD »ý·« ...
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
org.hsqldb.jdbcDriver
</property>
<property name="hibernate.connection.url">
jdbc:hsqldb:data/hibernateblog
</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.dialect">net.sf.hibernate.dialect.HSQLDialect</property>
<property name="show_sql">true</property>
<property name="transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory
</property>
<!--¼º´É°ü·Ã element ÀÌÇÏ property 3°³-->
<property name="hibernate.cglib.use_reflection_optimizer">false</property>
<property name="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.Provider
</property>
<mapping resource="vssh/model/BlogItem.hbm.xml"/>
<mapping resource="vssh/model/Blog.hbm.xml"/>
</session-factory>
</hibernate-configuration>
¾Õ¿¡¼ º¸¸é property ¿¤¸®¸ÕÆ®¸¦ ÀÌ¿ëÇØ¼ µ¥ÀÌÅͺ£À̽º ¿¬°á Á¤º¸¸¦ Á÷Á¢ ¼³Á¤Çϰí ÀÖ´Ù. ¹°·Ð À̰ÍÀº Ä¿³Ø¼Ç Ç®À» »ç¿ëÇÒ °æ¿ì ±×¿¡ ´ëÇÑ JNDI À̸§À¸·Î ´ëüµÉ ¼ö ÀÖ´Ù. hibernate.dialect ºÎºÐ¿¡´Â µ¥ÀÌÅͺ£À̽ºº°·Î °íÀ¯ÀÇ Å¬·¡½º¸¦ Àû´çÈ÷ ÀÔ·ÂÇØ Áà¾ß ÇÑ´Ù. ÇÏÀ̹ö³×ÀÌÆ®°¡ Áö¿øÇÏ´Â ¼ö¸¹Àº µ¥ÀÌÅͺ£À̽ºº°·Î °¢°¢ÀÇ dialect °ªÀÌ ¹Ì¸® °áÁ¤µÇ¾î ÀÖ´Ù.
ÇÏÀ̹ö³×ÀÌÆ®´Â ÀÌ dialect¸¦ ÅëÇØ HQL(Hibernate Qurery Language)À» °¢ º¥´õº° SQL ¹®À¸·Î º¯È¯½ÃŲ´Ù. °¢ µ¥ÀÌÅͺ£À̽ºº° dialect Á¤º¸´Â
¿©±â¸¦ Âü°íÇϱ⠹ٶõ´Ù. Property Áß¿¡¼ show_sqlÀÌ true·Î ¼³Á¤µÇ¸é, ÄܼÖâ¿¡ °¢ º¥´õº°·Î ÇÏÀ̹ö³×ÀÌÆ® Dialect¿¡ ÀÇÇØ º¯ÇüµÈ SQL ¹®À» Ãâ·ÂÇÏ°Ô µÈ´Ù. ±× ¾Æ·¡¿¡ ÀÖ´Â transaction.factory_class´Â ÇÏÀ̹ö³×ÀÌÆ®¿¡¼ ÀÚ¹Ù °¡»ó¸Ó½Å ¼öÁØÀÇ Ä³½Ã¸¦ »ç¿ëÇϱâ À§ÇØ °¢ WAS º¥´õ º°·Î
±¸ÇöµÇ¾î ÀÖ´Ù.
¾ÕÀÇ Blog.hbm.xml, BlogItem.hbm.xml, hibernate.cfg.xmlÀÇ ¼º´É °ü·Ã element¶ó°í ÁÖ¼®À¸·Î Ç¥±âµÈ ºÎºÐÀ» º¸±â ¹Ù¶õ´Ù.
hibernate.cfg.xml
<hibernate-configuration>
<!--¼º´É°ü·Ã element ÀÌÇÏ property 3°³-->
<property name="hibernate.cglib.use_reflection_optimizer">false</property><!-(1)-->
<property name="hibernate.cache.provider_class"><!-(2)-->
net.sf.ehcache.hibernate.Provider
</property>
</hibernate-configuration>
(1)Àº CGLIBÀÇ ¸®Ç÷º¼Ç ¿ÉƼ¸¶ÀÌÀúÀÇ »ç¿ë À¯¹«¸¦ °áÁ¤Áþ´Â °ÍÀÌ´Ù. ¸®Ç÷º¼ÇÀ» ÀÌ¿ëÇÏ°Ô µÇ¸é µð¹ö±ë µî¿¡ À¯¸® ÇÒ ¼öµµ ÀÖÀ¸³ª, À̸¦ ¾²Áö ¾Ê´Â °ÍÀÌ ¼º´É¿¡ µµ¿òÀÌ µÈ´Ù.
(2)´Â cache provider¸¦ ¼³Á¤ÇÏ´Â °÷À¸·Î ÇÏÀ̹ö³×ÀÌÆ®ÀÇ °æ¿ì Ç÷¯±×ÀÎ ÇüÅ·ΠÁ¸ÀçÇÑ´Ù. ¼³Á¤µÈ EHCache°¡ ±âº» °ªÀε¥ ÀÌ ¹Û¿¡µµ Hashtable, OSCache, SwarmCache, JBoss TreeCache µîÀÌ ÀÖÀ¸¸ç °¢°¢ÀÇ Ä³½Ã¸¦ ¾²±â À§Çؼ´Â Provider class¸¦ ±â¼úÇØ¾ß ÇÑ´Ù. ¶Ç EHCacheÀÇ °æ¿ì classpath°¡ ÀâÈù °÷¿¡ ´ÙÀ½°ú °°ÀÌ ehcache.xml¸¦ ÀÛ¼ºÇØ Áà¾ß ÇÑ´Ù.
ehcache.xml ÆÄÀÏÀÇ ·çÆ® ¿¤¸®¸ÕÆ®´Â enhance·Î defaultCache¿Í cache¸¦ ¼ºê ¿¤¸®¸ÕÆ®·Î °®°í ÀÖ´Ù. ´ÙÀ½ÀÇ °æ¿ì defaultCache¸¦ ÅëÇØ ¸ðµç ÆÛ½Ã½ºÅϽº °´Ã¼¿¡ ´ëÇØ Àû¿ëÇÒ Ä³½Ã ·êÀ» Á¤ÀÇÇϰí, vssh.model.Blog Ŭ·¡½º¿¡ ´ëÇØ¼´Â ´Ù¸¥ ij½Ã ¼³Á¤À» ÇØµÎ¾ú´Ù. ij½ÃÀÇ »ç¿ë ¿É¼ÇÀº hbm.xml ÆÄÀÏ¿¡¼ Á¤ÀÇÇÏ°Ô µÈ´Ù. Áö±Ý±îÁö ÀÛ¼ºµÈ ¿¹Á¦´Â ij½ÃÀÇ »ç¿ë ¿É¼Ç Áß read-write¸¦ »ç¿ëÇß´Ù. ±× ¹ÛÀÇ ¿É¼ÇÀ¸·Î´Â transactional, nonstrict-read-write, read-only°¡ ÀÖ´Ù.
ÇÏÀ̹ö³×ÀÌÆ® ¼º´É Çâ»ó ±â¹ý,
Second Level Cache¸¦ ÀÌ¿ëÇÑ ÇÏÀ̹ö³×ÀÌÆ® ¼º´É Çâ»ó ¸µÅ©¸¦ ÂüÁ¶Çϵµ·Ï Ç϶ó.
ehcache.xml
<ehcache>
<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
/>
<!-- for vssh.model.Blog -->
<cache name="vssh.model.Blog" maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"
/>
</ehcache>
hibernate.cfg.xml ÆÄÀÏÀº Ŭ·¡½ºÆÐ½º°¡ ÀâÈù °÷¿¡ µÎ¸é µÈ´Ù. ±×¸®°í log4j¸¦ »ç¿ëÇÒ °æ¿ì, log4j.xml ¶ÇÇÑ °°Àº À§Ä¡¿¡ µÎ¸é ±âº»ÀûÀ¸·Î »ç¿ëÀÌ °¡´ÉÇÏ´Ù. Log4j°¡ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é ÇÏÀ̹ö³×ÀÌÆ®´Â °æ°í ¸Þ½ÃÁö¸¦ °è¼ÓÇØ¼ º¸¿©Áֱ⠶§¹®¿¡, log4j´Â ²À ¼³Á¤Çؼ ÇÏÀ̹ö³×ÀÌÆ®¿Í ÇÔ²² »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. À§ÀÇ ³»¿ëÀ» ÀÌŬ¸³½º¿Í °ü·Ã Ç÷¯±×ÀÎ, xDoclet µîÀ» ÀÌ¿ëÇØ¼ ó¸®ÇÏ´Â °úÁ¤Àº
VSSH Æ÷·³¿¡ ÀÚ¼¼È÷ ±â·ÏÇØ µÎ¾ú´Ù. ÅøÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ °ü½ÉÀÌ ÀÖ´Â ºÐÀº Æ÷·³À» ÀÌ¿ëÇϽñ⠹ٶõ´Ù.
eclipse.new21.org¿¡¼µµ °ü·Ã Á¤º¸¸¦ ã¾Æº¼ ¼ö ÀÖ´Ù.
4´Ü°è. ÇÏÀ̹ö³×ÀÌÆ®·Î µ¥ÀÌÅͺ£À̽º °ª °¡Á®¿À±â
ÀÌÁ¦ ¸¶Áö¸·À¸·Î ÇÏÀ̹ö³×ÀÌÆ®¸¦ ÀÌ¿ëÇØ µ¥ÀÌÅͺ£À̽º¿¡ ±â·ÏµÈ °ªÀ» °¡Á®¿Í º¸ÀÚ. µ¥ÀÌÅͺ£À̽º Á¶ÀÛÀ» À§ÇØ »ç¿ëÇÏ´Â ÇÙ½É Å¬·¡½º´Â SessionFactoryÀÌ´Ù. SessionFactory´Â hibernate.cfg.xml¿¡¼ ¼³Á¤µÈ ÇϳªÀÇ µ¥ÀÌÅͺ£À̽º¿Í ¿¬°áÀ» ÇÏ°Ô µÈ´Ù. À¥À¸·Î Æ÷ÆÃÇÏ´Â °æ¿ì, SessionFactory´Â À¥ ÄÁÅ×À̳ʰ¡ ½ÃÀÛµÉ ¶§ Çѹø¸¸ ±âµ¿µÇ¸ç À̶§ ¸ðµç Á¤º¸°¡ ·ÎµåµÈ´Ù. ¸¸ÀÏ ¿©·¯ Á¾·ùÀÇ µ¥ÀÌÅͺ£À̽º¿¡ ¿¬°áÀ» ÇϰíÀÚ ÇÑ´Ù¸é hibernate.cfg.xml¿¡ ¿¬°áÇϰíÀÚ ÇÏ´Â µ¥ÀÌÅͺ£À̽ºÀÇ ¼ö¸¸Å SessionFactory¸¦ ±â¼úÇØ¾ß ÇÒ °ÍÀÌ´Ù.
BlogMain.java
private SessionFactory sessionFactory;
public void configure() throws HibernateException {
sessionFactory = new Configuration().configure()
.buildSessionFactory();
}
public Blog getBlogAndAllItems(Long blogid) throws HibernateException {
Session session = sessionFactory.openSession();
Transaction tx = null;
Blog blog = null;
try {
tx = session.beginTransaction();
// (1) HQLÀ» ¹Ù·Î »ç¿ëÇϱâ
Query q = session.createQuery("from Blog as blog "
+ "left outer join fetch blog.items "
+ "where blog.id = :blogid");
// (2) À̸§À¸·Î Äõ¸® Á¤º¸ °¡Á®¿À±â
//Query q = session.getNamedQuery("model.Blog");
q.setParameter("blogid", blogid);
blog = (Blog) q.list().get(0);
tx.commit();
} catch (HibernateException he) {
if (tx != null) tx.rollback();
throw he;
} finally {
session.close();
}
return blog;
}
...<Áß·«>...
¾ÕÀÇ ¿¹Á¦´Â BlogMain Ŭ·¡½º·Î SessionFactory¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. SessionÀ» ÀÌ¿ëÇÏ´Â °úÁ¤ÀÌ JDBC¿¡¼ connectionÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú À¯»çÇÔÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ±×¸®°í TransactionÀº sessionÀ» ÅëÇØ °¡Á®¿À´Âµ¥, begin ¹× commit, rollbackÇÏ´Â °úÁ¤ ¿ª½Ã À¯»çÇÑ °ÍÀ» º¼ ¼ö ÀÖ´Ù.
¾ÕÀÇ ¿¹Á¦¿¡¼ ÁÖ¸ñÇÒ °÷Àº (1)¿¡ ÁÖ¼® ó¸®µÈ HQLÀÇ »ç¿ëÀÌ´Ù. Âü°í·Î Äõ¸® ÀÚü¸¦ *.hbm.xml ¾È¿¡ ÀÔ·ÂÇØµÎ°í, À̸§À¸·Î Äõ¸® Á¤º¸¸¦ °¡Á®¿À´Â ¹æ½Äµµ Àû¿ë °¡´ÉÇÏ´Ù. ´ÙÀ½ÀÇ ¿¹Á¦´Â Äõ¸® Á¤º¸¸¦ XML ¹®¼¿¡ ÀÔ·ÂÇÑ »ùÇà ÄÚµåÀÌ´Ù. Äõ¸® Á¤º¸¸¦ XML ¹®¼¿¡ ÀÔ·ÂÇÏ´Â ¹æ½Ä(Named SQL Query)À» ÀÌ¿ëÇÒ °æ¿ì (2)¿Í °°Àº ÄÚµùÀÌ °¡´ÉÇÏ´Ù.
Blog.hbm.xml
... DTD »ý·« ...
<hibernate-mapping package="vssh.model">
<class name="Blog" table="BLOG lazy="true">
...Áß·«...
</class>
<query name="model.Blog">
<![CDATA[
from Blog as blog left outerin fetch blog.items where blog.id = :blogid
]]>
</query>
</hibernate-mapping>
ÇÏÀ̹ö³×ÀÌÆ®¿¡¼ »ç¿ëÇÏ´Â HQLÀº EJB QL°ú ¸¶Âù°¡Áö·Î °´Ã¼ÁöÇâÀûÀÎ ¼º°ÝÀ» °¡Áø´Ù. HQLÀº ¾Õ¿¡¼ ¼³Á¤ÇÑ Dialect¿¡ ÀÇÇØ °¢ º¥´õº°·Î ÃÖÀûÈµÈ SQL ¹®À¸·Î ÀÚµ¿ º¯È¯µÈ´Ù.
HQL°ú Dialect¿¡ ÀÇÇØ º¯ÇüµÈ SQL
HQL
from Blog as blog
left outer join fetch blog.items
where blog.id = 1
¾ÕÀÇ HQLÀº hiber8ide¸¦ ÅëÇØ °ªÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
HQLÀÌ hibernate.dialect¸¦ ÅëÇØ °¢ º¥´õ¿¡ ¸Â´Â SQL·Î º¯È¯
HSQLÀÇ SQL
select blog0_.BLOG_ID as BLOG_ID0_,
items1_.BLOG_ITEM_ID as BLOG_ITE1_1_,
blog0_.NAME as NAME0_,
items1_.TITLE as TITLE1_,
items1_.TEXT as TEXT1_,
items1_.DATE_TIME as DATE_TIME1_,
items1_.BLOG_ID as BLOG_ID1_
from BLOGS blog0_ left outer join BLOG_ITEMS items1_ on blog0_.BLOG_ID=items1_.BLOG_ID
where (blog0_.BLOG_ID=1 )
¾ÕÀÇ HSQL Databse Manager¸¦ ÅëÇØ SQLÀ» È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù. ÀÌŬ¸³½ºÀÇ ÇÏÀ̹ö³×ÀÌÆ® Ç÷¯±×ÀÎÀÎ Hiber8IDE¸¦ »ç¿ëÇϸé HQL °á°ú¸¦ º¸´Â °ÍÀÌ °¡´ÉÇϰí, JOI(Java Object Inspector)¶ó´Â ÅøÀ» ÀÌ¿ëÇϸé Ä÷º¼ÇÀÇ ³»ºÎµµ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
ÀÌ °÷À» Âü°íÇϵµ·Ï Ç϶ó.
 |
| <±×¸² 5> Hibern8IDE¿Í JOI |
À̰ÍÀ¸·Î ÇÏÀ̹ö³×ÀÌÆ®¿¡ ´ëÇÑ ¼Ò°³¸¦ ¸¶Ä¡µµ·Ï ÇϰڴÙ. ÇÏÀ̹ö³×ÀÌÆ®´Â °ü·Ã ÀÚ·á°¡ ºñ±³Àû dzºÎÇϱ⠶§¹®¿¡, ÀÚ¼¼ÇÑ ³»¿ëÀº Âü°íÀڷḦ ÅëÇØ ½º½º·Î ÀÍÇô³ª°¡±æ ¹Ù¶õ´Ù.
½ºÇÁ¸µ°ú ÇÏÀ̹ö³×ÀÌÆ® ¿¬µ¿Çϱâ
ÀÌÁ¦ Áö³ ±Û¿¡¼ ¼Ò°³ÇÑ °í°´ µî·Ï ¿¹Á¦¸¦ ÅëÇØ ½ºÇÁ¸µ°ú ÇÏÀ̹ö³×ÀÌÆ®°¡ ¾î¶»°Ô ¿¬µ¿µÇ´ÂÁö¿¡ ´ëÇØ »ìÆìº¸µµ·Ï ÇÏÀÚ. °í°´ µî·Ï ¿¹Á¦´Â ½ºÇÁ¸µ »ç¿ë ½Ã³ª¸®¿À Áß¿¡¼ ½áµåÆÄƼ WAF¿Í OR ¸ÊÇÎ µµ±¸¸¦ ¿¬°èÇÑ À¥ ¾ÖÇø®ÄÉÀÌ¼Ç ÇüÅÂÀÌ´Ù.
¿¹Á¦´Â ÇÁ¸®Á¨Å×ÀÌ¼Ç °èÃþ°ú Á¦¾î °èÃþÀ» Æ÷ÇÔÇÏ´Â À¥ °èÃþÀÇ Ã³¸®¸¦ À§ÇØ ½ºÆ®·µÃ÷¸¦ »ç¿ëÇϰí ÀÖÀ¸¸ç, OR ¸ÊÇÎ µµ±¸·Î ÇÏÀ̹ö³×ÀÌÆ®¸¦ äÅÃÇØ¼ ÆÛ½Ã½ºÅϽº °èÃþÀ» ´ã´çÇϵµ·Ï Çϰí ÀÖ´Ù. ½ºÆ®·µÃ÷¿Í ÇÏÀ̹ö³×ÀÌÆ®¸¦ ¿¬°áÇÏ´Â À§Ä¡¿¡¼ ¾ÖÇø®ÄÉÀÌ¼Ç ·ÎÁ÷À» ü°èÀûÀ¸·Î °ü¸®Çϱâ À§ÇØ ½ºÇÁ¸µÀÌ »ç¿ëµÇ´Â °ÍÀÌ´Ù.
 |
| <±×¸² 6> ½áµåÆÄƼ WAF¿Í ORMÀ» ¿¬°èÇÑ À¥ ¾ÖÇø®ÄÉÀÌ¼Ç ±¸Á¶ÀÇ ½ºÇÁ¸µ »ç¿ë ½Ã³ª¸®¿À |
¿¹Á¦¿¡ ´ëÇÑ ±âº» ¼³¸í°ú ½ºÆ®·µÃ÷ ¿¬µ¿ ºÎºÐÀº Áö³ ±Û¿¡¼ ´Ù·ðÀ¸¹Ç·Î ¿©±â¼´Â Á¶±Ý ´õ »ó¼¼ÇÏ°Ô ÀüüÀûÀÎ °üÁ¡¿¡¼ »ìÆìº¸µµ·Ï ÇÏÀÚ.
UML ´ÙÀ̾î±×·¥À¸·Î »ìÆìº¸´Â °í°´ µî·Ï ¿¹Á¦
¿ì¼± <±×¸² 7>¿¡ ¼Ò°³µÈ ÆÐŰÁö ´ÙÀ̾î±×·¥À» ÁÖ¸ñÇØ Áֱ⠹ٶõ´Ù.
 |
| <±×¸² 7> °í°´ µî·Ï ¿¹Á¦ÀÇ ÆÐŰÁö ´ÙÀ̾î±×·¥ |
°í°´ µî·Ï ¿¹Á¦´Â ±âº»ÀûÀ¸·Î 4°³ÀÇ ÆÐŰÁö°¡ ÁÖÃàÀ» ÀÌ·é´Ù. Model ÆÐŰÁö¿¡´Â ÇÏÀ̹ö³×ÀÌÆ®¿¡¼ OR ¸ÊÇÎ Á¤º¸¸¦ ±â·ÏÇÏ´Â µ¥ »ç¿ëµÇ´Â hbm.xml ÆÄÀϰú hbm2java ŽºÅ©¸¦ ÀÌ¿ëÇØ¼ »ý¼ºµÈ ¸ðµ¨¿ë Ŭ·¡½º¸¦ Æ÷ÇÔÇÑ´Ù. DAO ÆÐŰÁö¿¡´Â ÇÏÀ̹ö³×ÀÌÆ®¸¦ ÀÌ¿ëÇØ¼ µ¥ÀÌÅÍ Ã³¸®¸¦ ¼öÇàÇÒ ÀÎÅÍÆäÀ̽º¿Í ±× ±¸Çö °´Ã¼°¡ Æ÷ÇԵǾî ÀÖ´Ù.
Business ÆÐŰÁö¿¡´Â DAO °´Ã¼¸¦ ÀÌ¿ëÇØ¼ ÇÊ¿äÇÑ ºñÁî´Ï½º ·ÎÁ÷À» ¼öÇàÇÏ´Â ºñÁî´Ï½º µ¨¸®°ÔÀÌÆ®°¡ Æ÷ÇԵǾî ÀÖÀ¸¸ç, ±× °á°ú´Â Model ÆÐŰÁö¿¡¼ Á¤ÀÇµÈ ¸ðµ¨À» ÅëÇØ Àü´ÞµÈ´Ù. Control ÆÐŰÁö¿¡´Â ½ºÆ®·µÃ÷ÀÇ ¾×¼Ç Ŭ·¡½º°¡ Á¤ÀǵǾî ÀÖÀ¸¸ç, Business ÆÐŰÁö¿¡¼ Á¤ÀÇµÈ µ¨¸®°ÔÀÌÆ® °´Ã¼¸¦ ÀÌ¿ëÇØ¼ »ç¿ëÀÚ ¿äûÀ» ó¸®ÇÑ´Ù.
°¢ ÆÐŰÁö¿¡ Æ÷ÇÔµÈ ÁÖ¿ä Ŭ·¡½ºµéÀÇ Å¬·¡½º ´ÙÀ̾î±×·¥Àº <±×¸² 8>¿¡ Á¤¸®µÇ¾î ÀÖ´Ù.
 |
| <±×¸² 8> °í°´ µî·Ï ¿¹Á¦ÀÇ Å¬·¡½º ´ÙÀ̾î±×·¥ |
<±×¸² 9>´Â »ç¿ëÀÚ°¡ °í°´ ¸®½ºÆ®¸¦ ¿äûÇßÀ» ¶§ 󸮵Ǵ °úÁ¤À» ½ÃÄö½º ´ÙÀ̾î±×·¥À¸·Î Ç¥ÇöÇÑ °ÍÀÌ´Ù.
 |
| <±×¸² 9> °í°´ ¸®½ºÆ®¸¦ ¿äûÇßÀ» °æ¿ìÀÇ ½ÃÄö½º ´ÙÀ̾î±×·¥ |
hibernate.cfg.xml¸¦ ´ëüÇÏ´Â ½ºÇÁ¸µÀÇ applicationContext.xml
ÇÏÀ̹ö³×ÀÌÆ®¸¸À» »ç¿ëÇÏ´Â ºí·Î±× ¿¹Á¦¿¡¼ hibernate.cfg.xmlÀ» ÀÌ¿ëÇØ¼ µ¥ÀÌÅͺ£À̽º ¿¬°á Á¤º¸¿Í OR ¸ÊÇÎ Á¤º¸µéÀ» ¼³Á¤ÇØ ÁØ °ÍÀ» ±â¾ïÇÒ °ÍÀÌ´Ù. ½ºÇÁ¸µ°ú ÇÏÀ̹ö³×ÀÌÆ®¸¦ ÅëÇÕÇØ¼ »ç¿ëÇÒ ¶§´Â hibernate.cfg.xmlÀ» ÀÛ¼ºÇÒ Çʿ䰡 ¾ø´Ù. ½ºÇÁ¸µÀÇ ±âº» ¼³Á¤ ÆÄÀÏÀÎ applicationContext.xml¿¡ ºó(bean) ¼³Á¤À» ÅëÇØ ÇØ°áÇϱ⠶§¹®ÀÌ´Ù. ´ÙÀ½ÀÇ ÄÚµå´Â DataSource¿Í SessionFactory¸¦ IoC ÀûÀΠƯ¡À» °®´Â ½ºÇÁ¸µÀÇ ºó ÆÑÅ丮 ¼³Á¤ ¹æ½ÄÀ¸·Î ÇØ°áÇÏ´Â °úÁ¤À» º¸¿©ÁØ´Ù.
applicationContext.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>
<property name="url"><value>jdbc:hsqldb:data/vsshdb</value></property>
<property name="username"><value>sa</value></property>
<property name="password"><value></value></property>
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list>
<value>model/Customer.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.HSQLDialect</prop>
<!-- http://www.hibernate.org/194.html -->
<prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop> (1)
</props>
</property>
</bean>
JDBC µå¶óÀ̹ö¿Í URL, ¾ÆÀ̵ð, ÆÐ½º¿öµå·Î ±¸¼ºµÇ´Â µ¥ÀÌÅÍ ¼Ò½º ¼³Á¤Àº ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÀ̹ö³×ÀÌÆ®ÀÇ ¼¼¼Ç ÆÑÅ丮°¡ ¾î¶»°Ô ½ºÇÁ¸µ¿¡¼ ¼³Á¤µÇ´ÂÁö¿¡ ´ëÇØ¼ Á¶±Ý ´õ ÀÚ¼¼È÷ »ìÆìº¸ÀÚ.
ÇÏÀ̹ö³×ÀÌÆ® ¼¼¼Ç ÆÑÅ丮´Â ½ºÇÁ¸µÀÇ ORM ÆÐŰÁö Áß ÇÏÀ̹ö³×ÀÌÆ®¿ÍÀÇ ¿¬µ¿À» À§ÇÑ LocalSessionFactoryBean Ŭ·¡½º¿¡ ÀÇÇØ 󸮵ȴÙ. ÀÌ ºóÀº DataSource, mappingResources, hibernatePropertiesÀÇ 3°¡Áö ¼Ó¼ºÀ» ÇÊ¿ä·Î ÇÑ´Ù. ´Ù¸¥ ¼³Á¤ °ªÀº hibernate.cfg.xml¿¡¼ º¸¾Ò´ø °ÍÀ̹ǷΠ¼³¸íÀ» »ý·«ÇÑ´Ù. ¼Ò½ºÄÚµå Áß (1)·Î Ç¥±âµÈ ºÎºÐÀº ¾ÖÇø®ÄÉÀ̼ÇÀÌ ½ÃÀÛµÉ ¶§ ÀÚµ¿À¸·Î ½ºÅ°¸¶ÀÇ DDL ¹®À» ÀͽºÆ÷Æ®(export)Ç϶ó´Â ¼³Á¤ÀÌ´Ù.
À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ½ºÇÁ¸µÀÇ applicationContext.xmlÀÇ ¼³Á¤À» ¹Ý¿µÇϵµ·Ï ÇÏ·Á¸é web.xml¿¡ ´ÙÀ½°ú °°Àº Ãß°¡ Á¤º¸¸¦ ÀÔ·ÂÇÏ¸é µÈ´Ù.
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext1.xml,applicationContext2.xml
</param-value>
</context-param>
¸¸ÀÏ ¿¹Á¦¿Í °°ÀÌ ½ºÆ®·µÃ÷¿Í ½ºÇÁ¸µÀ» ÇÔ²² »ç¿ëÇÏ´Â °æ¿ì¶ó¸é ½ºÆ®·µÃ÷ÀÇ ±âº» ¼³Á¤ ÆÄÀÏÀÎ struts-config.xml¿¡ ContextLoaderPlugInÀ» ÀÌ¿ëÇØ ´ÙÀ½°ú °°Àº Ç÷¯±×ÀÎ ¼³Á¤À» Ãß°¡·Î ÀÔ·ÂÇÑ´Ù.
struts-config.xml
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml,
/WEB-INF/action-servlet.xml"/>
</plug-in>
½ºÇÁ¸µ°ú ÇÏÀ̹ö³×ÀÌÆ® ¿¬µ¿À» À§ÇÑ °³¹ß ÆÁ!
1. HibernateTemplateÀ» »ç¿ëÇÏÀÚ
´ÙÀ½ÀÇ ÄÚµå´Â DAO ±¸Çö Áß °í°´ ¸®½ºÆ®¸¦ °¡Á®¿À´Â ºÎºÐÀÌ´Ù. ù ¹øÂ° ÄÚµå´Â ÇÏÀ̹ö³×ÀÌÆ®¸¦ »ç¿ëÇÏ´Â ÀϹÝÀûÀÎ ¹æ½ÄÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Ù. ¼¼¼Ç ÆÑÅ丮¸¦ ÀÌ¿ëÇØ¼ ¼¼¼ÇÀ» »ý¼ºÇÑ ´ÙÀ½, »ý¼ºµÈ ¼¼¼ÇÀ» ÀÌ¿ëÇØ¼ °í°´ ¸®½ºÆ®¸¦ °¡Á®¿À°í ÀÖ´Ù. ó¸® °úÁ¤ Áß¿¡ ¹ß»ýÇÏ´Â ¿¹¿Ü¿¡ ´ëÇÑ Ã³¸®µµ ÀÌ·ç¾îÁö°í ÀÖÀ½À» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
| <¸®½ºÆ® 1> ½ºÇÁ¸µ¿¡¼ ÇÏÀ̹ö³×ÀÌÆ® ±â´ÉÀ» »ç¿ëÇÏ´Â ±âº»ÀûÀÎ ÄÚµå | | | |
public List getCustomers() {
Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
try{
List list = session.createQuery("from Customer").list();
return list;
}catch(HibernateException e){
throw SessionFactoryUtils.convertHibernateAccessException(e);
}
} | |
 |
½ºÇÁ¸µ¿¡¼´Â ÀÌ·¯ÇÑ º¹ÀâÇÑ °úÁ¤À» DAO ÆÐÅÏÀ» ÀÌ¿ëÇØ¼ °¨ÃçÁÖ´Â HibernateTemplate Ŭ·¡½º¸¦ Á¦°øÇÑ´Ù. HibernateTemplateÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°ÀÌ ´Ü ÇÑ ÁÙÀÇ ÄÚµå·Î ¿øÇÏ´Â °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 2> ½ºÇÁ¸µÀÇ HibernateTemplate¸¦ »ç¿ëÇØ¼ º¹ÀâÇÑ ÄÚµå °¨Ãß±â | | | |
public List getCustomers() {
return getHibernateTemplate().find("from Customer");
} | |
 |
2. IoC¿¡ ´ëÇÑ °³³ä ÀÌÇØ¸¦ È®½ÇÈ÷ ÇÏÀÚ
ºñÁî´Ï½º µ¨¸®°ÔÀÌÆ®·Î »ç¿ëµÇ´Â CustomerBizManagerImpl Ŭ·¡½ºÀÇ ¼Ò½ºÄڵ带 »ìÆìº¸¸é, »ç¿ëÇÏ´Â DAO Ŭ·¡½º¿¡ ´ëÇÑ ÀνºÅϽº¸¦ ¸¸µå´Â Äڵ尡 ¾ø´Â °ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù. ´ë½Å setCustomerDAO()¶ó´Â ¸Þ½îµå¸¦ ±¸ÇöÇϰí ÀÖ´Ù.
CustomerBizManagerImpl.java
public class CustomerBizManagerImpl implements ICustomerBizManager {
private ICustomerDAO dao;
public void setCustomerDAO(ICustomerDAO dao) {
this.dao = dao;
}
...»ý·«...
½ºÇÁ¸µ¿¡¼ °¢ Ŭ·¡½º°£ÀÇ ¿¬°ü °ü°è´Â Äڵ忡¼ Á÷Á¢ µå·¯³ª´Â °Ô ¾Æ´Ï¶ó, applicationContext.xml¿¡¼ ±â·ÏµÈ ºó ¼³Á¤À» ÀÌ¿ëÇØ¼ 󸮵ȴÙ. °¢ Ŭ·¡½º°¡ ÇÊ¿ä·Î ÇÏ´Â ÀνºÅϽº¸¦ ÀÚ½ÅÀÌ Á÷Á¢ °áÁ¤ÇÏ´Â °Ô ¾Æ´Ï¶ó ¼³Á¤ Á¤º¸¿¡ µû¶ó IoC ÄÁÅ×À̳ÊÀÎ ½ºÇÁ¸µ¿¡ ÀÇÇØ °áÁ¤µÇ¾î °¢ Ŭ·¡½º¿¡ ÀÖ´Â setter ¸Þ½îµå¸¦ ÀÌ¿ëÇØ¼ °Å²Ù·Î ¿¬°áµÇ´Â °Í(Setter Injection)ÀÌ´Ù. ÀÌ·¯ÇÑ Á¦¾îÀÇ ¹ÝÀü(Inversion of Control)ÀÌ ½ºÇÁ¸µ¿¡¼´Â ´Ã ÀϾ±â ¶§¹®¿¡ Áö³ ±Û¿¡ ¼Ò°³ÇÑ IoC¿¡ ´ëÇÑ °³³äÀ» È®½ÇÈ÷ ÀÌÇØÇϰí ÀÖ´Â °ÍÀÌ ÁÁ´Ù.
applicationContext.xml
<bean id="customerDAO" class="dao.CustomerDAOImpl">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
3. Æ®·£Àè¼Ç ó¸® °úÁ¤À» ÀÚµ¿ÈÇÏÀÚ.
ÆÛ½Ã½ºÅϽº °èÃþÀ» ±¸ÇöÇÏ´Â µ¥ ÀÖ¾î °¡Àå Áß¿äÇÏ°Ô ¿©±â´Â ºÎºÐ Áß Çϳª´Â Æ®·£Àè¼Ç ó¸®ÀÌ´Ù. ½ºÇÁ¸µÀ» ÀÌ¿ëÇÏ¸é ºñÁî´Ï½º µ¨¸®°ÔÀÌÆ®¿¡¼ ÇÏÀ̹ö³×ÀÌÆ®·Î ±¸ÇöµÈ DAO¸¦ È£ÃâÇÒ ¶§ ¸¶Ä¡ EJB¿¡¼ CMT(Container Managed Transaction)¸¦ »ç¿ëÇÏ´Â °Íó·³ Æ®·£Àè¼Ç ó¸® °úÁ¤À» ÀÚµ¿ÈÇÒ ¼ö ÀÖ´Ù.
applicationContext.xml
<bean id="customerBizManager"
class="org.springframework.transaction.interceptor
.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="target"><ref local="customerBizManagerTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="customerBizManagerTarget" class="business.CustomerBizManagerImpl">
<property name="customerDAO"><ref local="customerDAO"/></property>
</bean>
¾ÕÀÇ ¿¹Á¦¸¦ º¸¸é customerBizManager¶ó´Â id¸¦ °¡Áö´Â ºó¿¡¼ Æ®·£Àè¼Ç 󸮰¡ ¼³Á¤µÇ¾î ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. customerBizManager ºóÀÇ ±¸Çö Ŭ·¡½º´Â TransactionProxyFactoryBeanÀ¸·Î¼ ÀÌ Å¬·¡½ºÀÇ API¸¦ ÂüÁ¶Çϸé ÇÊ¿äÇÑ ¼Ó¼º Á¤º¸¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
transactionManager ¼Ó¼ºÀº ½ºÇÁ¸µÀÇ ORM ÆÐŰÁöÀÇ ÇÏÀ̹ö³×ÀÌÆ® È®Àå ±â´É Áß HibernateTransactionManager¸¦ »ç¿ëÇϰí ÀÖ´Ù. <±×¸² 10>Àº ½ºÇÁ¸µÀÇ Æ®·£Àè¼Ç °ü·Ã Ŭ·¡½ºµéÀ» Á¤¸®ÇÑ °ÍÀÌ´Ù. Æ®·£Àè¼Ç ¸Å´ÏÀú´Â PlaformTransactionManager ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ ¼ºê Ŭ·¡½º Áß Çϳª¸¦ ¼±ÅÃÇØÁÖ¸é µÈ´Ù. ¿¹¸¦ µé¾î JDOÀÇ ¾ÆÆÄÄ¡ ±¸ÇöÀÎ OJB¸¦ OR ¸ÊÇÎ µµ±¸·Î »ç¿ëÇϰí ÀÖ´Ù¸é, JdoTransactionManager¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù.
 |
| <±×¸² 10> ½ºÇÁ¸µÀÇ Æ®·£Àè¼Ç °ü·Ã Ŭ·¡½ºµé |
¼³Á¤µÈ Æ®·£Àè¼Ç ±â´ÉÀÌ »ç¿ëµÉ Ÿ°Ù Ŭ·¡½º´Â business ÆÐŰÁö¿¡ ÀÖ´Â CustomerBizManagerImpl Ŭ·¡½º°¡ ¼³Á¤µÇ¾î ÀÖ´Ù. transactionAttributes ¼Ó¼º¿¡´Â CRUD½Ã¿¡ ÇÊ¿äÇÑ Æ®·£Àè¼Ç 󸮸¦ ´ÙÀ½ °ª Áß Çϳª·Î ¼³Á¤ÇØÁÖ¸é µÈ´Ù. Æ®·£Àè¼Ç ¼Ó¼ºÀº ¸ðµÎ 6°¡Áö ·¹º§À» Áö¿øÇÑ´Ù. Á» ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº
ÀÌ °÷¿¡¼ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
¡ß PROPAGATION_REQUIRED
¡ß PROPAGATION_SUPPORTS
¡ß PROPAGATION_MANDATORY
¡ß PROPAGATION_REQUIRES_NEW
¡ß PROPAGATION_NOT_SUPPORTED
¡ß PROPAGATION_NEVER
¿ÀǼҽº·Î °³¹ß ¹®È¸¦ ¹Ù²îÀÚ!
À̰ÍÀ¸·Î ¾ÖÇø®ÄÉÀÌ¼Ç °èÃþº°·Î °æÀï·Â ÀÖ´Â ¿ÀǼҽº ÇÁ·¹ÀÓ¿öÅ©¸¦ ¼±Á¤Çϰí, °¢°¢ÀÇ ÇÁ·¹ÀÓ¿öÅ©ÀÇ ÀåÁ¡À» »ì·Á ¾àÇÑ °áÇÕµµ¸¦ °¡Áö´Â ÅëÇÕ ÇÁ·¹ÀÓ¿öÅ©¸¦ ±¸¼ºÇÏ´Â ¹æ¹ý¿¡ °üÇÑ ¿¬Àç±ÛÀ» ¸¶Ä¡°Ô µÇ¾ú´Ù.
ÀÌ ¿¬Àç´Â ÇÁ¸®Á¨Å×ÀÌ¼Ç °èÃþ¿¡´Â ÅÛÇø´ ¿£ÁøÀÎ º§·Î½ÃƼ¸¦, Á¦¾î °èÃþ¿¡´Â Service to Worker ÆÐÅÏÀÌ ±¸ÇöµÈ ½ºÆ®·µÃ÷¸¦, ¾ÖÇø®ÄÉÀÌ¼Ç ·ÎÁ÷ °èÃþ¿¡´Â AOP(Aspect Oriented Programming)¿Í IoCÀÇ °³³äÀÌ °áÇÕµÈ °æ·®±Þ ÄÁÅ×À̳ÊÀÎ ½ºÇÁ¸µÀ», ÆÛ½Ã½ºÅϽº °èÃþ¿¡´Â OR ¸ÊÇÎ µµ±¸ÀÇ ¼±µÎ ÁÖÀÚÀÎ ÇÏÀ̹ö³×ÀÌÆ®¸¦ ¼±Á¤ÇØ ÁøÇàµÇ¾ú´Ù. ³Ê¹« ¸¹Àº ±â¼úµéÀ» ¼Ò°³ÇÏ´Ùº¸´Ï ¾î¿ ¼ö ¾øÀÌ °¢ ÇÁ·¹ÀÓ¿öÅ©°£ÀÇ °áÇÕ¿¡ ´ëÇØ Á¶±Ý ´õ ±íÀÌ ÀÖ´Â ¼³¸íÀ» µå¸®Áö ¸øÇÑ Á¡ÀÌ ¾Æ½¬¿òÀ¸·Î ³²´Â´Ù.
ÇÊÀÚµéÀÌ ¸¸µç VSSH¶ó´Â ¿ë¾î°¡ ¸¶Ä¡ ÇϳªÀÇ Æ®·»µåó·³ ÀÚ¹Ù Ä¿¹Â´ÏƼ¿¡¼ »ç¿ëµÇ°í ÀÖ´Â °Íµµ ½É½ÉÄ¡ ¾Ê°Ô ¹ß°ßÇÒ ¼ö ÀÖ¾ú´Ù. ±×·² ¶§¸é ¿ÀǼҽº ÇÁ·¹ÀÓ¿öÅ©ÀÇ È°¿ë¿¡ ´ëÇØ ¸¹Àº ÀÚ¹Ù °³¹ßÀÚµéÀÌ °ü½ÉÀ» °¡Áöµµ·Ï À¯µµÇϰíÀÚ Çß´ø ÃÖ¼ÒÇÑÀÇ ¸ñÀûÀº ´Þ¼ºµÈ °Í °°¾Æ ´ÙÇེ·± ¸¶À½µµ ´À³¤´Ù.
¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î 2004³â 10¿ùÈ£¿¡ ½Ç¸° ¡¸WAS ½ÃÀåÀ» µÚÈçµç ¿ÀǼҽºÀÇ µµÀüÀ塹À̶õ ±â»ç¿¡¼ ´ã´ç ±âÀÚ´Â "Àü ¼¼°èÀûÀ¸·Î ƯÁ¤ º¥´õÀÇ µ¶Á¡ÀûÀÎ Á¦Ç°µéÀÌ ¼ÒÇÁÆ®¿þ¾î ½ÃÀåÀ» Áö¹èÇÏ´Â ÇöÀç »óȲ¿¡¼ ¿ÀǼҽº´Â ÀÚ±¹ ¼ÒÇÁÆ®¿þ¾î »ê¾÷ÀÇ ÀÚ»ý·ÂÀ» È®º¸Çϱâ À§ÇÑ °ÅÀÇ À¯ÀÏÇÑ ´ë¾ÈÀ̸ç, ±â¼úÀûÀ¸·Î´Â ÀÌ¹Ì ±× °¡´É¼ºÀ» ÀÔÁõÇÑ ´Ü°è¿¡ ¿Ô´Ù°í ÇÒ ¼ö ÀÖ´Ù"°í ¸»Çß´Ù. ÇÊÀÚµéÀº À̹ø ¿¬À縦 ÁøÇàÇÏ¸é¼ ¿ÀǼҽº°¡ ¿ì¸®³× ±â¼ú ¼öÁØÀ» ÇÑ ´Ü°è Çâ»ó½Ãų »Ó ¾Æ´Ï¶ó ÃæºÐÈ÷ ½Ç¹«¿¡¼ Ȱ¿ëµÉ ¼ö ÀÖ´Â ¼öÁØ¿¡ µµ´ÞÇßÀ½À» ´À³¥ ¼ö ÀÖ¾ú´Ù.
¿ÀǼҽº¿¡ °üÇÑ ºÎÁ¤Àû Æí°ß°ú °¢ ±â¼úÀ» ¼÷·ÃµÇ°Ô ÀÍÈ÷°í ÀÖ´Â °³¹ßÀÚÀÇ ºÎÁ· ¹®Á¦¸¸ ÇØ°áµÈ´Ù¸é ¿ÀǼҽº¸¦ ÀÌ¿ëÇØ¼ ¿ì¸®³× °³¹ß ¹®È¸¦ ȹ±âÀûÀ¸·Î °³¼±ÇÏ´Â °Íµµ °¡´ÉÇÒ °ÍÀÌ´Ù. @
¢º
Àüü ¼Ò½º ´Ù¿î·Îµå
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ ÀÚ¸ÅÁöÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.