EJB(Enterprise JavaBeans)´Â ÇѸ¶µð·Î ¸»ÇØ ºÐ»ê ÄÄÆ÷³ÍÆ®¿Í DB¿¡ ´ëÇÑ Á¢±Ù ¹æ¹ýÀ» Á¦°øÇÏ´Â ±â¼úÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù.
EJB´Â ÀÚ¹ÙEE ÇÁ·¹ÀÓ¿öÅ©¿¡¼ ¹é¿£µå¸¦ ´ã´çÇÏ´Â Áß¿äÇÑ ¿ªÇÒÀ» ÇØ¿ÔÁö¸¸ ±âÁ¸ EJB 2.1Àº °³¹ßÀÚ¿¡°Ô ´Ù°¡°¡±â ½¬¿î Á¸Àç´Â ¾Æ´Ï¾ú´Ù. ÀϹÝÀûÀÎ ÀÚ¹Ù OOP ÇÁ·Î±×·¡¹Ö°ú´Â ´Ù¸¥ º¹ÀâÇÑ ±¸Á¶¿Í ¸¹Àº ÄÚµå, º¹ÀâÇÑ XML Á¤Àǰ¡ ÇÊ¿äÇÑ µîÀÇ ¹®Á¦ Å¿À̾ú´Ù. EJB ÇÁ·Î±×·¡¹ÖÀ» À§Çؼ´Â ¸¹Àº ³ë·ÂÀÌ ÇÊ¿ä Çß°í, ´ç¿¬È÷ óÀ½ Á¢ÇÏ´Â »ç¶÷µé¿¡°Ô´Â ³ôÀº º®À¸·Î ´À²¸Áú ¼ö ¹Û¿¡ ¾ø¾ú´Ù.
ÇÏÁö¸¸ EJB 3.0¿¡¼´Â EJB¸¸ÀÇ º¹ÀâÇÑ ÇÁ·Î±×·¡¹Ö ¸ðµ¨¿¡¼ Å»ÇÇÇÏ¿© ÀϹÝÀûÀÎ ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¸ðµ¨ÀÎ POJO(Plain Old Java Object) ½ºÅ¸ÀÏ·Î ¹Ù²î¸é¼ ´Ü¼øÈµÈ ÇÁ·Î±×·¡¹ÖÀÌ °¡´É ÇØÁ³´Ù.
POJO ½ºÅ¸ÀÏ ÇÁ·Î±×·¡¹ÖÀº ÀÌ¹Ì ½ºÇÁ¸µ(Spring)À̳ª ÇÏÀ̹ö ³×ÀÌÆ®(Hibernate)¿Í °°Àº ¿ÀÇ ¼Ò½º ÇÁ·¹ÀÓ¿öÅ©¿¡¼ ¸¹ÀÌ »ç¿ë µÇ°í ÀÖ´Ù. ´Ü¼øÈµÈ ÇÁ·Î±×·¡¹Ö ¸ðµ¨°ú ÄÚµåÀÇ ÀçȰ¿ë °¡´É¼ºÀ» ³ô¿©ÁÙ »Ó¸¸ ¾Æ´Ï¶ó IDEÀÇ ¸®ÆÑÅ丵 ±â´ÉÀ» ½ÊºÐ Ȱ¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡µéÀÌ ÀÌ ÇÁ·¹ÀÓ¿öÅ©µéÀÇ Àα⠺ñ°áÀÌ´Ù.
¶ÇÇÑ ÀÚ¹ÙSE 5¿¡¼ Ãß°¡µÈ ¸ÞŸµ¥ÀÌÅÍ ¾î³ëÅ×À̼Ç(Metadata annotation) ¾ð¾î ±â´ÉÀ» »ç¿ëÇÏ¿© EJB¿¡ °ü·ÃµÈ ¼³Á¤À» XML µð½ºÅ©¸³ÅÍ(deployment descriptor)´ë½Å ÄÚµå »ó¿¡¼ Á÷Á¢ ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ÀÌ·¸°Ô ÇÏ¸é¼ °³¹ßÀÚ´Â º¹ÀâÇÑ XML ¼³Á¤¿¡¼ Å»ÇÇÇÒ ¼ö ÀÖ°Ô µÇ°í ÄÚµå »ó¿¡¼ ¿¬°üµÈ ¼³Á¤À» ÇÒ ¼ö Àֱ⠶§¹®¿¡ ÄÚµåÀÇ °¡µ¶¼ºµµ ³ô¾ÆÁö°Ô µÇ¾ú´Ù. ¹°·Ð ±× ¿Ü¿¡µµ ¿©·¯ ¹æ¸é¿¡¼ °³¹ßÀÚ ÆíÀǼºÀ» ³ôÀ̱â À§ÇÑ ³ë·ÂÀÌ ÀÌ·ç¾îÁ³´Ù.
ÀÚ¹Ù ÆÛ½Ã½ºÅϽº(Java Persistence) API 1.0Àº DB¿¡ Á¢±ÙÇϱâ À§ÇØ »ç¿ëµÇ¾ú´ø ±âÁ¸ ¿£Æ¼Æ¼ ºóÀ» ´ëüÇÏ´Â »õ·Î¿î ±â¼úÀÌ´Ù. ÀÚ¹Ù ÆÛ½Ã½ºÅϽº´Â ¿£Æ¼Æ¼ ºó°ú´Â ¾ÆÁÖ ´Ù¸¥ POJO ±â¹ÝÀÇ ORM(Object-Relational Mapping) ÇÁ·Î±×·¡¹Ö ¸ðµ¨À» Á¦°øÇÏ¸ç ±âÁ¸¿¡ Á¸ÀçÇÏ´ø ÇÏÀ̹ö³×ÀÌÆ®(Hibernate)¿Í °°Àº ORM ¼Ö·ç¼Ç°ú À¯»çÇÏ´Ù. ¶ÇÇÑ EJB¿¡ ±¹ÇѵÇÁö ¾ÊÀº ¹ü¿ëÀûÀÎ ±â¼ú·Î ¸¸µé¾îÁ³±â ¶§¹®¿¡ ÀÚ¹ÙEE ȯ°æ¿¡¼»Ó¸¸ ¾Æ´Ï¶ó ÀÚ¹ÙSE ȯ°æ ¿¡¼µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÀÚ¹Ù ÆÛ½Ã½ºÅϽº´Â EJB 3.0°ú´Â º°µµ·Î ´Ù·ç±â·Î ÇÏ°í ¿©±â¿¡¼´Â ¸ÕÀú EJB 3.0¿¡ ´ëÇØ¼ ¾Ë¾Æº¸ÀÚ.
 | EJB 3.0 |  |
EJB 3.0 ÇÁ·Î±×·¡¹Ö ¸ðµ¨ÀÌ EJB 2.1¿¡ ºñÇØ¼ ¾ó¸¶³ª °³¼±µÇ¾úÀ»±î? ¹é¹®ÀÌ ºÒ¿©ÀϰßÀ̶ó ÇßÀ¸´Ï Hello ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ´Â °£´ÜÇÑ ¿¹Á¦ ÄÚµåÀÎ HelloEJB¸¦ ÅëÇØ »ìÆìº¸µµ·Ï ÇÏÀÚ. <¸®½ºÆ® 1>Àº ±âÁ¸ EJB 2.1 ¹æ½ÄÀ¸·Î ±¸ÇöÇÑ °ÍÀÌ´Ù.
| <¸®½ºÆ® 1> EJB 2.1·Î ±¸ÇöÇÑ HelloEJB¿Í Ŭ¶óÀÌ¾ðÆ® | | | |
// ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º
public interface Hello extends EJBObject {public String sayHello() throws RemoteException;}
// Ȩ ÀÎÅÍÆäÀ̽º
public interface HelloHome extends EJBHome {Hello create() throws RemoteException, CreateException;}
// ºó Ŭ·¡½º
public class HelloBean implements SessionBean {public String sayHello(){
return "Hello EJB!";
}
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext sc) {}}
// ejb-jar.xml
xmlns="http://java.sun.com/xml/ns/j2ee">
HelloEJB
hello.HelloHome
hello.Hello
hello.HelloBeanStateless
// Ŭ¶óÀ̾ðÆ®
public class HelloClient {
public static void main(String[] args) throws Exception {Context ic = new InitialContext();Object objref =
ic.lookup("java:comp/env/ejb/HelloEJB");HelloHome home =
(HelloHome)PortableRemoteObject.narrow(objref,HelloHome.class);
Hello hello = home.create();
System.out.println(hello.sayHello());}
}
| |
 |
 | ÀÚ¹ÙEE 5 ¾ÖÇø®ÄÉÀÌ¼Ç ¼¹ö |  | |  | |
|
ÇöÀç ¿©·¯ º¥´õµéÀÌ ÀÚ¹ÙEE 5ÀÇ Ç÷§ÆûÀ» ³»³õ°í ÀÖ´Ù. ¿Ï¼ºµÈ »ó¿ë ¼öÁØÀÇ Á¦Ç°Àº ¾Æ´ÏÁö¸¸ ÃæºÐÈ÷ °³¹ß¿ëÀ¸·Î ¾µ ¸¸ÇÏ´Ù. ±¹³» Á¦Ç°À¸·Î´Â ÀÚ ¹ÙEE 5 ȣȯ ÀÎÁõÀ» ¼¼°è ÃÖÃÊ·Î Åë°úÇÑ Æ¼¸Æ½º ¼ÒÇÁÆ®ÀÇ Á¦¿ì½º (JEUS) 6.0 ÇÁ¸®ºä°¡ ÀÖ´Ù. ¶ÇÇÑ ½ã¸¶ÀÌÅ©·Î½Ã½ºÅÛÁîÀÇ ÀÚ¹ÙEE 5 SDK(¶Ç´Â ÀÌÀÇ ¿ÀǼҽº ±¸ÇöÀÎ ±Û·¡½ºÇǽÃ(GlassFish))µµ ³ª¿Í ÀÖ´Ù.
±× ¿Ü¿¡µµ EJB 3.0¸¸ Áö¿øÇÏ´Â JBoss EJB 3.0°ú Oracle Application
Server 10.1.3, BEA WebLogic Server EJB 3.0 ÇÁ¸®ºä¿Í °°Àº Á¦Ç°µµ ÀÖÀ¸´Ï Âü°íÇÏÀÚ.
¿©±â¿¡ Á¦½ÃµÈ ¿¹Á¦µéÀº ±âº»ÀûÀ¸·Î Á¦¿ì½º 6.0À» ±â¹ÝÀ¸·Î ÀÛ¼º µÇ¾úÀ¸¸ç ÀÚ¹ÙEE 5 SDK¸¦ ÅëÇØ¼µµ ±¸µ¿ÇÒ ¼ö ÀÖ´Ù.
¡Ü TmaxSoft JEUS 6.0 - http://www.tmax.co.kr
¡Ü Java EE 5 SDK - http://java.sun.com/javaee/
¡Ü GlassFish - https://glassfish.dev.java.net/
¡Ü JBoss - http://jboss.com/products/jbossas
¡Ü Oracle AS - http://www.oracle.com/technology/products/ias/index.html
¡Ü BEA WebLogic Server - http://www.bea.com/products/weblogic/server/
| | | | | |
| |
ÀÌ¹Ì EJB ÇÁ·Î±×·¡¹ÖÀ» ÇØº» µ¶ÀÚ¶ó¸é ¾Ë°ÚÁö¸¸ ¸Å¿ì °£´ÜÇÑ HelloEJB ¿¹Á¦¿¡µµ ¸¹Àº Äڵ尡 ÇÊ¿äÇÏ´Ù. ¶ÇÇÑ ÀϹÝÀûÀÎ ÀÚ¹Ù OOP ÇÁ·Î±×·¡¹Ö°ú ´Þ¸® EJB ¸¸ÀÇ Æ¯¼öÇÑ ¸ðµ¨¿¡ ¸Â°Ô ÇÁ·Î±×·¡¹Ö ÇØ¾ß Çß´Ù. ´ÙÀ½Àº EJB 2.1ÀÇ ´ëÇ¥ÀûÀÎ ºÒÆí»çÇ×µéÀ» Á¤¸® ÇØ ³õÀº °ÍÀÌ´Ù.
¡Ü ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º - ºñÁî´Ï½º ¸Þ¼Òµå¸¦ Á¤ÀÇÇÑ ºÎºÐÀ¸·Î EJBObject/EJBLocalObject¸¦ extendsÇÏ¿© Á¤ÀÇÇÑ´Ù. EJB¸¸ÀÇ ÀÎÅÍÆäÀ̽º »ó¼Ó±¸Á¶¸¦ µû¶ó¾ß ÇϹǷΠ±âÁ¸¿¡ Á¸ÀçÇÏ´ø ÀÏ¹Ý ÀÚ¹Ù ÀÎÅÍÆäÀ̽º¸¦ ¹Ù·Î ÀçȰ¿ë ÇÒ ¼ö ¾ø´Ù. ¶ÇÇÑ EJBObject¸¦ extendsÇÑ ¿ø°Ý ÀÎÅÍÆäÀ̽ºÀÇ °æ¿ì RMI(Remote Method Invocation) ÀÎÅÍÆäÀ̽ºÀ̹ǷΠ¸ðµç ¸Þ¼Òµå Á¤ÀÇ¿¡ RemoteExceptionÀÌ ²À µé¾î°¡¾ß ÇÑ´Ù.
¡Ü Ȩ ÀÎÅÍÆäÀ̽º - Stateless ¼¼¼Ç ºóÀÇ °æ¿ì Ç×»ó ¶È °°ÀÌ À§¿Í °°Àº create() ¸Þ¼Òµå¸¦ Á¤ÀÇÇØ¾ß ÇÑ´Ù. EJB°¡ ¸¹¾ÆÁö¸é ¹Ýº¹ÀûÀ¸·Î ÄÚµùÇØ¾ß ÇÑ´Ù.
¡Ü ºó Ŭ·¡½º - ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º¿¡ Á¤ÀÇµÈ ºñÁî´Ï½º ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù. ÇÏÁö¸¸ ÇØ´ç ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º¸¦ ¹®¹ýÀûÀ¸·Î implements ÇÏÁö ¾Ê¾Æ ½ÇÁ¦ ÀÎÅÍÆäÀ̽º¿ÍÀÇ °ü°è°¡ ¸í½ÃÀûÀ¸·Î ÀνĵÇÁö ¾Ê´Â´Ù(IDEÀÇ ¸®ÆÑÅ丵 ±â´Éµµ ¾µ ¼ö ¾ø´Ù).
SessionBean ÀÎÅÍÆäÀ̽º¸¦ Ç×»ó implementsÇØ¾ß Çϱ⠶§¹® ¿¡ ¾²Áöµµ ¾Ê´Â ÄÝ¹é ¸Þ¼Òµå¸¦ ¸ðµÎ ±¸ÇöÇØ¾ß ÇÑ´Ù.
¡Ü ejb-jar.xml - EJB¿¡ ´ëÇÑ ¼³Á¤À» ¼±¾ðÀûÀ¸·Î ÇØÁÖ¸ç Ç×»ó ÀÖ¾î¾ß ÇÑ´Ù. ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º, Ȩ ÀÎÅÍÆäÀ̽º, ºó Ŭ·¡½ºÀÇ °ü°è°¡ ¿©±â¼ ³ªÅ¸³ª±â ¶§¹®¿¡ ÀÚ¹Ù ÄÚµå¿Í º°µµ·Î Ç×»ó ÀÌ XMLÀ» Âü°íÇØ¾ß EJB ±¸Á¶¸¦ ¾Ë ¼ö ÀÖ´Ù. ¼³Á¤ÀÌ ¸¹¾ÆÁö¸é XML ³»¿ë°ú ±¸Á¶°¡ º¹ÀâÇØÁø´Ù.
¡Ü Ŭ¶óÀÌ¾ðÆ® - EJB¸¦ ¾ò±â À§ÇØ ¿©·¯ ´Ü°è¸¦ °ÅÄ£´Ù. JNDI lookup, Ȩ °´Ã¼ ij½ºÆÃ, create ¸Þ¼Òµå È£Ãâ µî ºñÁî´Ï½º ·ÎÁ÷°ú °ü°è ¾ø´Â Äڵ尡 ¸¹´Ù. ¶ÇÇÑ ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º°¡ RemoteExceptionÀ» ´øÁú ¼ö Àֱ⠶§¹®¿¡ Ç×»ó ¿¹¿Ü(checked Exception 󸮸¦ ÇØÁÖ¾î¾ß ÇÑ´Ù.
EJB 3.0¿¡¼´Â À§¿¡¼ Á¦±âÇÑ »ó´ç¼öÀÇ ¹®Á¦¸¦ ÇØ°áÇÏ¿´´Ù.
<¸®½ºÆ® 2>´Â ¶È°°Àº ¿¹Á¦¸¦ EJB 3.0 ¹æ½ÄÀ¸·Î ±¸ÇöÇÑ °ÍÀÌ´Ù.
½ÇÁ¦ ·ÎÁ÷¿¡ ºÒÇÊ¿äÇÑ ÄÚµåÀÇ ¾çÀÌ È® ÁÙ¾ú°í POJO ¹æ½ÄÀ¸·Î ÇÁ·Î±×·¡¹Ö ¸ðµ¨ÀÌ ´Ü¼øÇØÁø °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. »õ·Ó°Ô µµÀÔ µÈ ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º´Â ÀÌÁ¦ º¸ÅëÀÇ ÀÚ¹Ù ÀÎÅÍÆäÀ̽ºÀÌ°í ºó Ŭ·¡½º°¡ À̸¦ ±¸Çö(implements)ÇÏ´Â POJO °´Ã¼ÀÌ´Ù. EJB¿¡ °ü·ÃµÈ ³»¿ëÀº ¾î³ëÅ×À̼ÇÀ» ÅëÇØ Ç¥±âµÇ¹Ç·Î EJB ±¸Á¶¸¦ ÄÚµå »ó¿¡¼ ÆÄ¾ÇÇÒ ¼ö ÀÖ´Ù. µû¶ó¼ XML ¼³Á¤(ejb-jar.xml)Àº ´õ ÀÌ »ó »ç¿ëÇÒ Çʿ䰡 ¾ø´Ù. ¹Ýº¹µÇ´ø Ȩ ÀÎÅÍÆäÀ̽º Á¤Àǵµ ¾ø¾îÁ³ ´Ù. Ŭ¶óÀÌ¾ðÆ® Äڵ嵵 ¸Å¿ì ±ò²ûÇØÁ³´Âµ¥ ÀÎÁ§¼Ç(Injection)À» ÅëÇØ EJB¸¦ ¾ò´Â °úÁ¤ÀÌ ´Ü¼øÈ µÇ¾ú´Ù.
| <¸®½ºÆ® 2> EJB 3.0À¸·Î ±¸ÇöÇÑ HelloEJB¿Í Ŭ¶óÀÌ¾ðÆ® | | | |
// ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º
@Remote
public interface Hello {
public String sayHello();
}
// Ȩ ÀÎÅÍÆäÀ̽º - ¾øÀ½
// ºó Ŭ·¡½º
@Stateless
public class HelloBean implements Hello {public String sayHello(){
return "Hello EJB!";
}
}
// ejb-jar.xml - ºÒÇÊ¿äÇÔ
// Ŭ¶óÀ̾ðÆ®
public class HelloClient {
@EJB
private static Hello hello;
public static void main(String[] args) {System.out.println(hello.sayHello());}
}
| |
 |
¾ÕÀ¸·Î´Â LottoApp À̶ó°í ÇÏ´Â °£´ÜÇÑ »ùÇà ¾ÖÇø®ÄÉÀ̼ÇÀ» ÅëÇØ EJB 3.0 Äڵ带 »ìÆìº¼ °ÍÀÌ´Ù. LottoApp´Â ·Î¶Ç¸¦ ¹ß±Þ ÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î À¥ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ EJB¸¦ È£ÃâÇÑ´Ù.
À¥À» ÅëÇØ µé¾î¿Â »ç¿ëÀÚ ¿äûÀº ¼ºí¸´(Servlet)ÀÌ ´ÙÀ½ÀÇ EJB µéÀ» »ç¿ëÇÏ¿© ó¸®ÇÏ°Ô µÈ´Ù.
¡Ü LotteryBean - ·Î¶Ç ¹øÈ£¸¦ ¹ß±ÞÇÏ´Â Stateful ¼¼¼Ç ºó¡Ü RandomGeneratorBean - 1¿¡¼ 45»çÀÌÀÇ ·£´ý ¼ýÀÚ¸¦ ¹ß»ý½ÃŰ´Â Stateless ¼¼¼Ç ºó
¡Ü TimestampBean - ÇöÀç ³¯Â¥¸¦ µ¹·ÁÁÖ´Â Stateless ¼¼¼Ç ºó
¸ÕÀú ¼¼¼Ç ºóÀÇ º¯ÈµÈ Ư¡¿¡ ´ëÇØ¼ ¸ÕÀú »ìÆìº¸ÀÚ. »õ·Ó°Ô µµÀÔµÈ ¼¼¼Ç ºóÀÇ ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º(business interface)´Â EJBObject/EJBLocalObject¸¦ extendsÇÑ ÀÎÅÍÆäÀ̽º´ë½Å ÀϹÝÀûÀÎ ÀÚ¹Ù ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÑ´Ù. ´ÜÁö ¿ø°Ý ÀÎÅÍÆäÀ̽ºÀÎÁö
·ÎÄà ÀÎÅÍÆäÀ̽ºÀÎÁö ±¸ºÐÇϱâ À§ÇØ @Remote ¶Ç´Â @Local ¾î³ëÅ×À̼ÇÀ» ¾Æ·¡¿Í °°ÀÌ ´Þ¾ÆÁÖ¸é µÈ´Ù.
@Remote // ¿ø°Ý ºñÁî´Ï½º ÀÎÅÍÆäÀ̽ºpublic interface RandomGenerator {public int getNumber( );
}
@Local // ·ÎÄà ºñÁî´Ï½º ÀÎÅÍÆäÀ̽ºpublic interface Timestamp {
public String today( );
}
À§ÀÇ RandomGenerator ÀÎÅÍÆäÀ̽º¿¡¼ º¸µíÀÌ ¿ø°Ý ÀÎÅÍÆäÀ̽ºÀÇ °æ¿ì¿¡ java.rmi.Remote ÀÎÅÍÆäÀ̽º¸¦ extends ÇÏÁö ¾Ê¾Æµµ µÇ¾î(¼±ÅûçÇ×ÀÓ) ¸ðµç ¸Þ¼Òµå¿¡ RemoteExceptionÀ» ºÙÀÏ Çʿ䰡 ¾ø¾îÁ³´Ù. µû¶ó¼ Ŭ¶óÀÌ¾ðÆ®µµ ÀÌÁ¦ ÀÌ Ã¼Å© ÀͼÁ¼Ç (checked Exception)À» Ç×»ó ó¸®ÇÒ Çʿ䰡 ¾ø´Ù. ³×Æ®¿öÅ©¿Í °°Àº ½Ã½ºÅÛ ¹®Á¦´Â ÀÌÁ¦ RuntimeExceptionÀÎ EJBExceptionÀ¸·Î ¹ß»ýÇϱ⠶§¹®¿¡ ÀͼÁ¼Ç 󸮿¡ Á» ´õ À¯¿¬¼ºÀ» °¡Áö°Ô µÆ´Ù.
¹°·Ð ¿©ÀüÈ÷ EJB¿¡ ´ëÇÑ ¿ø°Ý Á¢±ÙÀº RMI/IIOP¸¦ ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù. ÀÌÁ¦ ºñÁî´Ï½º ¸Þ¼Òµå¸¦ ±¸ÇöÇÏ´Â ºó Ŭ·¡½º¸¦ »ìÆìº¸ÀÚ.
@Stateless
public class RandomGeneratorBean implementsRandomGenerator {
public int getNumber() {
Random random = new Random();
return 1 + random.nextInt(45);}
}
ºó Ŭ·¡½º´Â ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º¸¦ implements ÇÑ POJO °´Ã¼·Î Á¤ÀÇÇÑ´Ù. ¼¼¼Ç ºóÀÓÀ» Ç¥½ÃÇϱâ À§ÇØ @Stateless³ª @Stateful ¾î³ëÅ×À̼Ǹ¸ ´Þ¾ÆÁÖ¸é µÈ´Ù. ¶ÇÇÑ ºó Ŭ·¡½º°¡ SessionBean ÀÎÅÍÆäÀ̽º¸¦ implements ÇÒ Çʿ䰡 ¾ø¾î »ç¿ëÇÏÁö ¾Ê´Â ÄÝ¹é ¸Þ¼Òµå¸¦ ¸ðµÎ ±¸ÇöÇÒ Çʿ䰡 ¾ø¾îÁ³´Ù. ÇÊ¿äÇÑ ÄÝ ¹éÀÇ °æ¿ì ÄÝ¹é ¾î³ëÅ×À̼ÇÀ» ÅëÇØ ÄÝ¹é ¸Þ¼Òµå¸¦ ÁöÁ¤ÇÏ¸é µÈ ´Ù. <¸®½ºÆ® 3>¿¡ ÀÖ´Â Á»´õ º¹ÀâÇÑ LotteryBean Stateful ¼¼¼Ç ºóÀ» »ìÆìº¸ÀÚ.
| <¸®½ºÆ® 3> LotteryBean Stateful ¼¼¼Ç ºó | | | |
// e.g
@Stateful
@Interceptors(ProfilingInterceptor.class) // ÀÎÅͼÁÅÍ ÁöÁ¤public class LotteryBean implements Lottery, Serializable{
@Resource // ÀÎÁ§¼Ç
private SessionContext sc;
@PostConstruct // PostConstruct Äݹé ÁöÁ¤private void postConstruct(){
//...
}
//...
@Remove // Remove ¸Þ¼Òµå ÁöÁ¤
public void remove(){
// bye~
}
}
| |
 |
<¸®½ºÆ® 3>¿¡¼´Â @PostConstruct ¾î³ëÅ×À̼ÇÀ» ÅëÇØ¼ PostConstruct ÄÝ¹é ¸Þ¼Òµå¸¦ ÁöÁ¤Çϰí ÀÖ´Ù. XXX void XXX() ÇüÅÂÀÇ ½Ã±×³Êó¸¦ °¡Áø ¸ðµç ¸Þ¼Òµå´Â ¾î³ëÅ×À̼ÇÀ¸·Î ÄÝ¹é ¸Þ¼Òµå·Î ÁöÁ¤ÇÒ ¼ö Àֱ⠶§¹®¿¡ ÇϳªÀÇ ¸Þ¼Òµå·Î ¿©·¯ ÄݹéÀ» ó ¸® ÇÏ´Â µî »ó´çÇÑ À¯¿¬¼ºÀ» Á¦°øÇÑ´Ù. ´ÙÀ½Àº ÄÝ¹é ¾î³ëÅ×ÀÌ¼Ç ÀÇ Á¾·ùº° ¼³¸íÀÌ´Ù.
¡Ü @PostConstruct - ºó ÀνºÅϽº°¡ »ý¼ºµÈ ÈÄ¿¡ ºÒ¸®¸ç ¿¹Àü ÀÇ ejbCreate( )¿Í µ¿ÀÏ
¡Ü @PreDestroy - ºó ÀνºÅϽº°¡ »èÁ¦µÇ±â Àü¿¡ ºÒ¸®¸ç ¿¹Àü ÀÇ ejbRemove( )¿Í µ¿ÀÏ
¡Ü @PrePassivate - Stateful ¼¼¼Ç ºó ÀνºÅϽº°¡ passivation µÇ±â Àü¿¡ ºÒ¸®¸ç ¿¹ÀüÀÇ ejbPassivate( )¿Í µ¿ÀÏ¡Ü @PostActivate - Stateful ¼¼¼Ç ºó ÀνºÅϽº°¡ activation µÈ ÈÄ¿¡ ºÒ¸®¸ç ¿¹ÀüÀÇ ejbActivate( )¿Í µ¿ÀÏ
LotteryBeanÀÇ °æ¿ì ¶ÇÇÑ SessionContext °´Ã¼¸¦ @Re source ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÏ¿© ÀÎÁ§¼ÇÇØ¼ °¡Á®¿À°í ÀÖ´Ù. ÀÎÁ§¼ÇÀº Á¤È®ÇÑ ¿ë¾î·Î µðÆæ´ø½Ã ÀÎÁ§¼Ç(Dependency Injection) Ȥ Àº ¸®¼Ò½º ÀÎÁ§¼Ç(Resource Injection)À̶ó°í Çϴµ¥ ÇØ´ç ÄÄÆ÷³ÍÆ®°¡ ÀÇÁ¸ÇÏ´Â ¿ÜºÎ ¸®¼Ò½º¸¦ °¡Á®¿À´Â »õ·Î¿î ¹æ¹ýÀÌ´Ù. ±âÁ¸¿¡ °³¹ßÀÚ°¡ Á÷Á¢ JNDI lookupÇÏ´ø °ÍÀ» ÀÌÁ¦ ÄÁÅ×À̳ʰ¡ ¾Ë¾Æ¼ ÇÊµå °ª¿¡ ³Ö¾îÁÖ°Ô µÈ °ÍÀÌ´Ù. ÀÎÁ§¼ÇÀº Çʵ忡 Àû¿ëÇÒ ¼öµµ ÀÖ°í ¾Æ·¡¿Í °°ÀÌ setter ¸Þ¼Òµå¿¡µµ Àû¿ëÇÒ ¼ö ÀÖ´Ù.
@Resource
private void setSessionContext(SessionContext sc){this.sc = sc;
}
¶Ç, ÀÎÁ§¼ÇÀ» ÀÌ¿ëÇÏ¿© DataSource³ª EJB ÂüÁ¶, Connection Factory, Queue, Topic, UserTransaction µîÀÇ ¿ÜºÎ ¸®¼Ò½º¸¦ °¡Á®¿Ã ¼ö ÀÖ´Ù.
LotteryBeanÀº Stateful ¼¼¼Ç ºóÀ̱⠶§¹®¿¡ ºóÀ» Á¦°ÅÇϱâ À§ ÇÑ Remove ¸Þ¼Òµå¸¦ @Remove ¾î³ëÅ×À̼ÇÀ¸·Î ÁöÁ¤ÇÑ´Ù.
Remove ¸Þ¼Òµå´Â ÀÓÀÇÀÇ ºñÁî´Ï½º ¸Þ¼Òµå¿¡ ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç ¸Þ¼ÒµåÀÇ ¼öÇàÀÌ ³¡³ª¸é ÇØ´ç Stateful ¼¼¼Ç ÀνºÅϽº°¡ Á¦°ÅµÈ´Ù.
ÀÎÅͼÁÅÍ (Interceptor)
<¸®½ºÆ® 3> LotteryBeanÀÇ °æ¿ì @Interceptors ¾î³ëÅ×À̼ÇÀ» ÀÌ¿ëÇÏ¿© EJB 3.0¿¡¼ »õ·Î Ãß°¡µÈ ÀÎÅͼÁÅÍ(interceptor)Ŭ·¡½º¸¦ ÁöÁ¤Çϰí ÀÖ´Ù.
ÀÎÅͼÁÅÍ´Â ÇöÀç ¸¹Àº °ü½ÉÀ» ²ø°í ÀÖ´Â AOP(AspectOriented Programming)ÀÇ °³³ä¿¡¼ ÆÄ»ýµÈ °ÍÀ¸·Î ºñÁî´Ï½º¸Þ¼Òµå°¡ ºÒ¸®±â Àü¿¡(ȤÀº ÈÄ¿¡) ÇØ¾ß ÇÏ´Â °øÅëÀûÀÎ ºÎºÐ(cross-cutting concerns)À» º°µµ·Î ±¸ÇöÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÀÎÅͼÁÅÍ´Â ´Ù¾çÇÑ ¸ñÀûÀ¸·Î Ȱ¿ëµÉ ¼ö Àִµ¥, ¿¹¸¦ µé¾î ¸Þ¼ÒµåÀÇ ¼öÇà½Ã°£À» ÃøÁ¤Çϰųª ¿¹¿Üó¸®, ÆÄ¶ó¹ÌÅÍ °Ë»ç, »ç¿ëÀÚ °íÀ¯ÀÇ º¸¾È °Ë»ç µî¿¡ ÀÌ¿ëµÉ ¼ö ÀÖ´Ù. <¸®½ºÆ® 4>´Â ¸Þ¼Òµå ¼öÇà ½Ã°£À» ÃøÁ¤ÇÏ´Â ÀÎÅͼÁÅÍÀÌ´Ù.
| <¸®½ºÆ® 4> ProfilingInterceptor ÀÎÅͼÁÅÍ | | | |
public class ProfilingInterceptor {@AroundInvoke
public Object intercept(InvocationContext invocation)throws Exception {
long start = System.currentTimeMillis();try {
return invocation.proceed(); // ´ÙÀ½ ÀÎÅͼÁÅÍ ¸Þ¼Òµå³ª ½ÇÁ¦ ºó ¸Þ¼Òµå¸¦ ¼öÇà
} finally {
long time = System.currentTimeMillis() - start;Method method = invocation.getMethod();System.out.println("Profiling: " +method.toString() + " took " + time + "(ms)");}
}
//...
}
| |
 |
ÀÎÅͼÁÅÍ Å¬·¡½º¿¡´Â ÇϳªÀÇ ÀÎÅͼÁÆ® ¸Þ¼Òµå°¡ @AroundInvoke¶ó´Â ¾î³ëÅ×À̼ÇÀ» ÅëÇØ ÁöÁ¤µÈ´Ù. ÀÎÅͼÁÆ® ¸Þ¼Òµå´Â ºóŬ·¡½º ³»¿¡¼ ±¸ÇöÇϰųª ProfilingInterceptor¿Í °°ÀÌ º°µµ·Î ÀÎÅͼÁÆ® Ŭ·¡½º·Î ¸¸µé ¼ö ÀÖÀ¸¸ç ÀÎÅͼÁÆ® Ŭ·¡½º´Â ÀçȰ¿ë ÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡µµ ÀÖ´Ù. Áß¿äÇÑ °ÍÀº ÀÎÅͼÁÅÍ´Â ¿©·¯ °³°¡ ÀÖÀ¸¸é üÀÎÀ¸·Î ±¸¼ºµÇ±â ¶§¹®¿¡ Invocation Context.proceed()¸¦ È£ÃâÇØ¾ß ´ÙÀ½ ÀÎÅͼÁÅͳª ½ÇÁ¦ ºó ¸Þ¼Òµå·Î ³Ñ¾î°¡°Ô µÈ´Ù´Â Á¡ÀÌ´Ù.
ÀÎÅͼÁÅÍ´Â ¶ÇÇÑ µðÆúÆ® ·¹º§·Î Á¤ÀÇÇÏ¿© ¸ðµç ºó¿¡°Ô Àû¿ë½Ãų ¼öµµ ÀÖ°í ¸Þ¼Òµåº°·Î Á¤ÀÇÇÒ ¼öµµ ÀÖÀ¸¸ç PostConstruct,PreDestroy¿Í °°Àº Äݹé ÀÎÅͼÁÆ® ¸Þ¼Òµåµµ °¡Áú ¼ö ÀÖ¾î ÄݹéÀ» º°µµÀÇ Çڵ鷯 Ŭ·¡½º·Î ó¸®ÇÒ ¼ö ÀÖ´Ù.
Ŭ¶óÀÌ¾ðÆ® ºä(Client view)
±âÁ¸ÀÇ EJB¸¦ È£ÃâÇϴ Ŭ¶óÀÌ¾ðÆ® ÄÚµå´Â ½ÇÁ¦ ºñÁî´Ï½º ¸Þ¼Òµå¸¦ ¼öÇàÇϱâ Àü¿¡ JNDI lookup ÄÚµå µî º¹ÀâÇÑ °úÁ¤À» ¼öÇàÇØ¾ß Çß´Ù. EJB 3.0¿¡¼´Â ÀÎÁ§¼Ç°ú ´Ü¼øÈµÈ lookupÀ» ÅëÇØ EJB¸¦ ¾ò¾î¿À´Â °úÁ¤ÀÌ ´Ü¼øÇØÁ³´Ù. <¸®½ºÆ® 5> ¼ºí¸´ Ŭ¶óÀÌ¾ðÆ®¸¦ »ìÆìº¸ÀÚ.
| <¸®½ºÆ® 5> ¼ºí¸´ Ŭ¶óÀÌ¾ðÆ® | | | |
@EJB(name="ejb/lottery", beanName="LotteryBean",beanInterface=Lottery.class)
public class PlayLotteryServlet extends HttpServlet {@EJB // ÀÎÁ§¼Ç
private RandomGenerator generator;protected void processRequest(HttpServletRequest request,HttpServletResponse response) throwsServletException, IOException {//...
InitialContext initContext = new InitialContext();Lottery lottery = (Lottery)
initContext.lookup("java:comp/env/ejb/lottery");
| |
 |
Ŭ·¡½º¿¡ ºÙ¾î ÀÖ´Â @EJB(name="ejb/lottery"...) ¾î³ëÅ×À̼ÇÀº ±âÁ¸ÀÇ
¿Í °°ÀÌ ÂüÁ¶µÇ´Â EJB¿¡ ´ëÇØ Á¤ÀǸ¦ ÇÑ °ÍÀ¸·Î EJB¸¦ JNDI lookupÀ¸·Î °¡Á®¿À±â À§ÇØ ÇÊ¿äÇÏ´Ù. ÀÌ·¸°Ô Á¤ÀǸ¦ Çϸé ÇØ´ç EJB ·¹ÆÛ·±½º´Â ENC(EnvironmentNaming Context)¿¡ ÇØ´çÇÏ´Â java:comp/env ³×ÀÓ½ºÆäÀ̽º¿¡ µé¾î°£´Ù. ¸Ç ¾Æ·§ÁÙÀÇ lookup Äڵ尡 ÇØ´ç EJB ·¹ÆÛ·±½º¸¦ ¾ò¾î¿À´Â °ÍÀ» º¸¿©ÁÖ°í Àִµ¥ ÀÌó·³ Ȩ °´Ã¼¸¦ ÅëÇÏÁö ¾Ê°í ¹Ù·Î ºñÁî´Ï½º °´Ã¼¸¦ ¹Þ¾Æ ¿Ã ¼ö ÀÖ´Ù. ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º´Â ÄÁÅ×À̳ʰ¡ lookup ÇÒ ¶§ ±âÁ¸ÀÇ È¨ °´Ã¼ÀÇ create ¸Þ¼Òµå¿Í °°Àº°úÁ¤À» ´ë½ÅÇØ ÁØ´Ù. ÀÌ °æ¿ì¿¡´Â »õ·Î¿î Stateful ¼¼¼Ç ºó ÀνºÅϽº¸¦ »ý¼ºÇϰí ÀÌ¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦ ¾ò¾î¿À°Ô µÈ´Ù.
ÀÎÁ§¼ÇÀ» ÀÌ¿ëÇϸé JNDI lookup º¸´Ù ´õ ½±°Ô EJB ·¹ÆÛ·±½º¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù. Çʵ忡 ºÙ¾îÀÖ´Â @EJB ¾î³ëÅ×À̼ÇÀº Çʵå
ÀÇ Å¸ÀÔÀ» ÂüÁ¶ÇÏ¿© ÇØ´ç EJB ·¹ÆÛ·±½º¸¦ Çʵ忡 ³Ö¾îÁØ´Ù.
À¥¼ºñ½º ¿£µåÆ÷ÀÎÆ®
EJB 3.0¿¡¼´Â ¼¼¼Ç ºóÀ» À¥¼ºñ½º·Î ³ëÃâÇÏ´Â °Íµµ ¸Å¿ì °£´ÜÇØÁ³´Ù. ÀÌ¿¡ ´ëÇÑ °ÍÀº ƯÁý 3ºÎ JAX-WS 2.0À» ÂüÁ¶ÇÏÀÚ.
¸Þ½ÃÁö¸¦ ó¸®Çϱâ À§ÇÑ MDBµµ EJB 3.0¿¡¼ POJO ÇüÅ·δܼøÈ µÇ¾ú´Ù. <¸®½ºÆ® 6>¿¡¼ º¸µíÀÌ MDBµµ ¾î³ëÅ×À̼ÇÀ» ÅëÇØ ÇÊ¿äÇÑ ¼³Á¤À» Çϸç ÀÌÁ¦ MessageListener¸¦ Á÷Á¢ implements ÇÏ°Ô µÈ´Ù.
| |
@MessageDriven( activationConfig = {@ActivationConfigProperty(propertyName="acknowlegeMode",propertyValue="Auto-acknowledge"),@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue")})
public class SimpleMessageBean implements MessageListener{
@Resource
private MessageDrivenContext mdc;public void onMessage(Message inMessage) {//...
}
}
| |
 |
µð½ºÅ©¸³ÅÍ
EJB 3.0¿¡¼´Â ejb-jar.xml Ç¥ÁØ µð½ºÅ©¸³ÅÍÀÇ ´ëºÎºÐÀ» ¾î³ëÅ×À̼ÇÀ¸·Î ¼³Á¤ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¹°·Ð, ¾î³ëÅ×À̼ÇÀÌ ¸ðµç °ÍÀ» Ä¿¹öÇÏÁö ¾Ê±â ¶§¹®¿¡ ¾î¶² °æ¿ì¿¡´Â µð½ºÅ©¸³ÅÍ¿¡ ¼³Á¤ÀÌ ÇÊ¿äÇÒ ¶§°¡ ÀÖ±â´Â ÇÏ´Ù. ¶ÇÇÑ º¸¾È ¼³Á¤(security role)°ú °°ÀÌ ½ÇÁ¦ ·±Å¸ÀÓ È¯°æ¿¡¼ ¹Ù²ð ¼ö ÀÖ´Â ºÎºÐÀº µð½ºÅ©¸³ÅÍ¿¡ ¼³Á¤À» ÇÏ´Â °ÍÀÌ ÁÁ´Ù. EJB 3.0¿¡¼´Â µð½ºÅ©¸³ÅÍ ¿À¹ö¶óÀ̵ùÀ» Áö¿øÇϱ⠶§¹®¿¡ ÇÊ¿äÇÑ Á¤º¸¸¸ µð½ºÅ©¸³ÅÍ¿¡¼ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ¾î³ëÅ×ÀÌ¼Ç ´ë½Å¿¡ ¿¹Àüó·³ µð½ºÅ©¸³ÅÍ¿¡ ¸ðµç Á¤º¸¸¦ ÁÖ°í ½ÍÀ¸¸é ±×·¸°Ô ÇÒ ¼öµµ ÀÖ´Ù.
 | ÀÚ¹Ù ÆÛ½Ã½ºÅϽº(Java Persistence) API |  |
ÀÌÁ¦ºÎÅÍ´Â µ¥ÀÌÅ͸¦ °ü°èÇü µ¥ÀÌÅͺ£À̽º(RDBMS)¿¡ ÀúÀåÇϱâ À§ÇÑ ÆÛ½Ã½ºÅϽº ·¹ÀÌ¾î ±â¼úÀÎ ÀÚ¹Ù ÆÛ½Ã½ºÅϽº¿¡ ´ëÇØ¼ »ìÆìº¸ÀÚ.
¾ÖÇø®ÄÉÀ̼ǿ¡¼ ´Ù·ç´Â °´Ã¼ ¸ðµ¨À» µ¥ÀÌÅͺ£À̽ºÀÇ µ¥ÀÌÅ͸𵨷ΠÀúÀåÇÏ°í ¸ÅÇÎÇϱâ À§ÇØ ´Ù¾çÇÑ ORM(Object-Relational Mapping) ±â¼úµéÀÌ Á¤ÀÇµÇ¾î ¿Ô´Ù. EJB¿¡¼´Â ¿£Æ¼Æ¼ ºóÀÌ ±× ±â¼úÀ» Á¦°øÇؿԴÙ. ¿£Æ¼Æ¼ ºóÀº °³¹ßÇϱⰡ ±î´Ù·Ó°í EJB ÀÚüÀÇ º¹ÀâÇÑ ÇÁ·Î±×·¡¹Ö ¸ðµ¨À» »ç¿ëÇØ¾ß ÇÒ »Ó ¾Æ´Ï¶ó °´Ã¼°£ÀÇ »ó¼Ó(Inheritance) °ü°è¸¦ ¸ÅÇÎÇÏÁö ¸øÇÏ´Â µîÀÇ Á¦¾àÀÌ ÀÖ¾î¼ ½ÇÁ¦·Î ¾²±â¿¡´Â ºÒÆíÇÏ¿´´Ù. µû¶ó¼ ÃÖ±Ù¿¡´Â ÇÏÀ̹ö³×ÀÌÆ®¿Í °°Àº POJO ±â¹ÝÀÇ ´Ù¸¥ ORM ±â¼úµéÀÌ Á¡Á¡ ´õ Àα⸦ ²ø¾î ¿Ô´Ù. °á±¹ EJB 3.0 Ç¥ÁØÈ ±×·ìÀÎ JSR 220¿¡¼ POJO¸¦ Ç¥ÁØÈµÈ ORM ±â¼ú·Î äÅÃÇÏ°Ô µÇ¾ú´Âµ¥ ±×°ÍÀÌ ¹Ù·ÎÀÚ¹Ù ÆÛ½Ã½ºÅϽº API ½ºÆåÀÌ´Ù. ½ÇÁ¦·Î ÀÚ¹Ù ÆÛ½Ã½ºÅϽº ½ºÆå Á¦Á¤¿¡´Â Gavin King(ÇÏÀ̹ö ³×ÀÌÆ® Á¦ÀÛÀÚ)À» Æ÷ÇÔÇÏ¿© ¿©·¯ ORM ±â¼ú °³¹ßÀÚµéÀÌ Âü¿©Ç߱⿡ ¶§¹®¿¡ À¯»çÇÑ Á¡ÀÌ ¸¹´Ù. ¸ÕÀú ÀÚ¹Ù ÆÛ½Ã½ºÅϽº°¡ °¡Áö´Â Ư¡ÀÌ ¾î¶² °ÍÀÌ ÀÖ´ÂÁö »ìÆìº¸ÀÚ.
¡Ü POJO ±â¹ÝÀÇ ´Ü¼øÇÑ ÆÛ½Ã½ºÅϽº ¸ðµ¨
¡Ü Ç¥ÁØÈµÈ O/R ¸ÅÇÎ - ¾î³ëÅ×ÀÌ¼Ç È¤Àº XML »ç¿ë, µðÆúÆ® ±ÔÄ¢ Àû¿ëÀ¸·Î ´ëºÎºÐÀÇ °æ¿ì º°µµÀÇ O/R ¸ÅÇÎÀ» ÁöÁ¤ÇÒ Çʿ䰡 ¾øÀ½
¡Ü °´Ã¼°£ÀÇ »ó¼Ó°ü°è Áö¿ø
¡Ü EJBQL¿¡ ºñÇØ¼ ¹ßÀüµÈ Äõ¸® ¾ð¾î - Update/delete, ¼ºêÄõ¸®, ³×ÀÌÆ¼ºê Äõ¸® Áö¿ø
¡Ü ÀÚ¹ÙEE ȯ°æ»Ó¸¸ ¾Æ´Ï¶ó ÀÚ¹ÙSE ȯ°æ Áö¿ø
¡Ü ÇÁ·Î¹ÙÀÌ´õ(Provider)À» Ç÷¯±×ÀÎ ÇØ¼ »ç¿ë °¡´ÉPOJO ±â¹ÝÀÇ ´Ü¼øÈµÈ ÇÁ·Î±×·¡¹Ö ¸ðµ¨À» Áö¿øÇϱ⠶§¹®¿¡ ¿£Æ¼Æ¼ ºóó·³ º¹ÀâÇÑ EJB °´Ã¼ ¸ðµ¨´ë½Å ÀϹÝÀûÀÎ Àڹ٠Ŭ·¡½º Çϳª·Î ½±°Ô ¿£Æ¼Æ¼¸¦ ¸¸µé ¼ö ÀÖ´Ù. ÇÊ¿äÇÑ O/R ¸ÅÇÎÀº POJO À§¿¡ ¾î³ëÅ×À̼ÇÀ¸·Î Ç¥±âÇϰųª XML·Î Ç¥±âÇÒ ¼ö ÀÖ°í »ó¼Ó °ü°è¸¦ Áö¿øÇϹǷΠ±âÁ¸¿¡ Á¸ÀçÇÏ´ø °´Ã¼ ¸ðµ¨À» ½±°Ô ÀÚ¹Ù ÆÛ½Ã½ºÅϽº ¿£Æ¼Æ¼·Î ÀüÈ¯ÇØ¼ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ¿£Æ¼Æ¼ °´Ã¼´Â POJO À̹ǷΠDTO(Data Transfer Object)·Î ¹Ù·Î »ç¿ëÀÌ °¡´ÉÇÏ´Ù.
¾ÕÀ¸·Î´Â OrderAppÀ̶ó°í ÇÏ´Â °£´ÜÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÅëÇØ ÀÚ¹Ù ÆÛ½Ã½ºÅϽºÀÇ Àü¹ÝÀûÀÎ ³»¿ëÀ» »ìÆìº¼ °ÍÀÌ´Ù. OrderApp´Â EJB·Î ±¸ÇöµÈ ´Ü¼øÇÑ ÁÖ¹®½Ã½ºÅÛÀε¥ EJB¿¡¼ ÀÚ¹Ù ÆÛ½Ã½ºÅϽº API¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ´Ù·ç°Ô µÈ´Ù. ¿©±â¿¡¼ »ç¿ëµÈ µ¥ÀÌÅÍ ¸ðµ¨Àº <±×¸² 1>°ú °°´Ù.
 |
| <±×¸² 1> ¿¹Á¦ µ¥ÀÌÅÍ ¸ðµ¨ |
DBÀÇ µ¥ÀÌÅÍ ¸ðµ¨Àº ÀÚ¹Ù ÆÛ½Ã½ºÅϽº¿¡¼ ¿£Æ¼Æ¼(Entity)·Î Ç¥ÇöµÈ´Ù. ¿£Æ¼Æ¼´Â µ¥ÀÌÅÍ ¸ðµ¨À» °´Ã¼ ¸ðµ¨·Î Ç¥ÇöÇÑ °ÍÀ¸·Î EJB 2.1ÀÇ ¿£Æ¼Æ¼ ºó°ú À¯»çÇÏÁö¸¸ ÀÚ¹Ù ÆÛ½Ã½ºÅϽº¿¡¼´Â º°µµÀÇ ÀÎÅÍÆäÀ̽º ¾øÀÌ POJO Ŭ·¡½º·Î Ç¥ÇöµÈ´Ù. Ŭ·¡½º¿¡´Â ¿£Æ¼Æ¼ÀÓÀ» Ç¥½ÃÇϱâ À§ÇØ @Entity ¾î³ëÅ×À̼ÇÀÌ ´Þ·ÁÀÖ´Ù. ½ÇÁ¦·Î <±×¸² 1>ÀÇ µ¥ÀÌÅÍ ¸ðµ¨¿¡ ´ëÇØ¼ ¿£Æ¼Æ¼°¡ ¾î¶»°Ô ¸¸µé¾î Áö´ÂÁö <¸®½ºÆ® 7>À» º¸µµ·Ï ÇÏÀÚ.
| |
// Customer.java
@Entity
public class Customer implements Serializable {@Id
private String id;
private String name;
private String address;
@OneToMany(mappedBy="customer",cascade={CascadeType.ALL})
private List orders;
//...
}
// Item.java
@Entity
public class Item implements Serializable {//...
@Id @GeneratedValue
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){this.name = name;
}
//...
}
// Orders.java
@Entity
public class Orders implements Serializable {@Id @GeneratedValue
private Long id;
@ManyToOne
private Customer customer;
@ManyToMany
@JoinTable(name="ORDERAPP_ORDERS2ITEMS")private Collection- items;//...
}
| |
 |
¿£Æ¼Æ¼´Â ±âº»ÀûÀ¸·Î ÇϳªÀÇ ¿£Æ¼Æ¼ Ŭ·¡½º¿¡ ´ëÇØ ÇϳªÀÇDB Å×À̺íÀÌ ¸ÅÇεȴÙ(ÀÌ °æ¿ì¿¡´Â M:N(many to many) °ü°è¸¦ À§ÇÑ Å×À̺íÀÌ Çϳª ´õ ¸¸µé¾îÁø´Ù). Çʵ峪 ÀÚ¹ÙºóÁî(JavaBeans) ÇÁ·ÎÆÛƼ °ªÀº DBÀÇ Ä÷³¿¡ ¸ÅÇεȴÙ. ¾î¶² ºÎºÐ¿¡ ¾î³ëÅ×À̼ÇÀÌ ´Þ·ÁÀÖ´ÂÁö¿¡ µû¶ó¼ Çʵå Á¢±Ù ŸÀÔ(Fieldaccess type)°ú ÇÁ·ÎÆÛƼ Á¢±Ù ŸÀÔ(Property access type)ÀÌ °áÁ¤µÈ´Ù. ¿¹Á¦¿¡¼´Â Customer, Orders ¿£Æ¼Æ¼ÀÇ °æ¿ì ÇÊµå µéÀÌ ¸ÅÇεǰí, Item ¿£Æ¼Æ¼ÀÇ °æ¿ì ÇÁ·ÎÆÛƼ µéÀÌ DB Ä÷³¿¡ ¸ÅÇεȴÙ.
DB¿ÍÀÇ ¸ÅÇÎÀº O/R ¸ÅÇÎ ¾î³ëÅ×ÀÌ¼Ç È¤Àº XML(orm.xmlµð½ºÅ©¸³ÅÍ)·Î ÀÌ·ç¾îÁø´Ù. Primary Key¸¦ ³ªÅ¸³»´Â Çʵ峪 °ü°è(Relationship)¸¦ ³ªÅ¸³»´Â Çʵ带 Á¦¿ÜÇϰí´Â ´ëºÎºÐ µðÆúÆ®Á¤Ã¥¿¡ µû¶ó¼ ¸ÅÇεDZ⠶§¹®¿¡ º°µµÀÇ ¾î³ëÅ×À̼ÇÀ» ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ´ÙÀ½Àº À§ÀÇ ¿£Æ¼Æ¼¿¡¼ »ç¿ëµÈ ¾î³ëÅ×À̼ǵ鿡 ´ëÇÑ ¼³¸íÀÌ´Ù. À̿ܿ¡µµ O/R ¸ÅÇο¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸¹Àº Ç¥ÁØ ¾î³ëÅ×À̼ÇÀÌ ÀÖ´Ù.
¡Ü @Id - Primary Key¿¡ ÇØ´çÇÏ´Â ID ÇʵåÀÓÀ» Ç¥½ÃÇÑ´Ù.
¡Ü @GeneratedValue - DB¿¡ ÀÇÇØ¼ °ªÀÌ ÀÚµ¿À¸·Î »ý¼ºµÇ´Â ÇʵåÀÓÀ» Ç¥½ÃÇÑ´Ù.
¡Ü @OneToMany - 1:N °ü°è¸¦ À§ÇÑ Ç¥ÇöÇϱâ À§ÇÑ ÇʵåÀÓÀ» Ç¥½ÃÇÑ´Ù.
¡Ü @ManyToOne - N:1 °ü°è¸¦ À§ÇÑ Ç¥ÇöÇϱâ À§ÇÑ ÇʵåÀÓÀ» Ç¥½ÃÇÑ´Ù.
¡Ü @ManytoMany - M:N °ü°è¸¦ À§ÇÑ Ç¥ÇöÇϱâ À§ÇÑ ÇʵåÀÓÀ» Ç¥½ÃÇÑ´Ù.
¡Ü @JoinTable - °ü°è¸¦ Ç¥ÇöÇÒ ¶§ ¾î¶² Å×À̺íÀ» »ç¿ëÇÒ °ÍÀÎÁö¿¡ ´ëÇØ Ç¥½ÃÇÑ´Ù.
¿£Æ¼Æ¼´Â ÀÏ¹Ý Å¬·¡½º¿Í ºñ½ÁÇÏÁö¸¸ Ç×»ó µðÆúÆ® »ý¼ºÀÚ(Default constructor)¸¦ ¸¸µé¾î ÁÖ¾î¾ß ÇѴٴ Ư¡ÀÌ ÀÖ´Ù. µðÆúÆ® »ý¼ºÀÚ´Â ¿£Æ¼Æ¼ ÀνºÅϽº¸¦ ³»ºÎÀûÀ¸·Îµµ »ý¼ºÇؼ »ç¿ëÇϱ⠶§¹®¿¡ ÇÊ¿äÇÏ´Ù. ¶ÇÇÑ ¿¹Á¦ÀÇ °æ¿ì ¿£Æ¼Æ¼µéÀÌ Serializable °´Ã¼·Î ±¸ÇöµÇ¾ú´Âµ¥ ÀÌ´Â Çʼö»çÇ×Àº ¾Æ´ÏÁö¸¸ ¿£Æ¼Æ¼¸¦ DTO(Data Transfer Object)·Î »ç¿ëÇÏ¿© ¿ø°ÝÀ¸·Î º¸³¾ ¶§ ÇÊ¿äÇÏ´Ù.
DB¿¡¼ ¿£Æ¼Æ¼¸¦ °¡Á®¿À°Å³ª, »ý¼º, »èÁ¦ ÇÏ´Â ÀÏÀº ¸ðµÎ EntityManager API¸¦ ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù. EntityManager´Â ´©°¡ °ü¸®ÇÏ´À³Ä¿¡ µû¶ó Å©°Ô µÎ °¡Áö·Î ±¸ºÐµÈ´Ù.
¡Ü Container-managed EntityManager - ÀÚ¹ÙEE ȯ°æ¿¡¼¸¸ »ç¿ëµÇ¸ç ÄÁÅÍÀ̳ʰ¡ EntityManager ÀνºÅϽºÀÇ LifecycleÀ» °ü¸®ÇÑ´Ù. JTA Æ®·£Àè¼Ç¿¡ ÀÚµ¿À¸·Î ¿¬°áµÇ±â ¶§¹®¿¡ ÀÚ¹ÙEE ȯ°æ¿¡¼ À¯¿ëÇÏ´Ù.
¡Ü Application-managed EntityManager - ÀÚ¹ÙEE, ÀÚ¹ÙSEȯ°æ¿¡¼ ¸ðµÎ »ç¿ëµÇ¸ç °³¹ßÀÚ°¡ EntityManager ÀνºÅϽºÀÇ LifecycleÀ» Á÷Á¢ °ü¸®ÇÏ¸ç Æ®·£Àè¼Çµµ Á÷Á¢ °ü¸®ÇØ¾ß ÇÑ´Ù.
EntityManager °´Ã¼´Â Container-managed EntityManagerÀÇ °æ¿ì ÀÎÁ§¼ÇÀ̳ª lookupÀ» ÅëÇØ¼ ¹Ù·Î ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
// ÀÎÁ§¼Ç ÀÌ¿ë. ÇØ´ç Çʵ峪 ¸Þ¼Òµå¿¡ @PersistenceContext Ç¥±â@PersistenceContext
private EntityManager em;
// lookup ÀÌ¿ë. Ŭ·¡½º¿¡ @PersistenceContext¸¦ Ç¥±âÇØ EntityManager¸¦ ENC ³×ÀÓ½ºÆäÀ̽º¿¡ µî·Ï
@PersistenceContext(name="em", unitName="HR")public class HelloBean implements Hello {//...
InitialContext ic = new InitialContext();EntityManager em = (EntityManager)ic.lookup("java:comp/env/em");
Application-managed EntityManagerÀÇ °æ¿ì EntityManagerFactory API¸¦ ÅëÇØ¼ EntityManager °´Ã¼¸¦ ¾ò°Ô µÈ´Ù. ÀÚ¹ÙEE ȯ°æ¿¡¼´Â ÀÎÁ§¼ÇÀ̳ª lookupÀ» ÅëÇØ EntityManagerFactory¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
@PersistenceUnit
private EntityManagerFactory emf;//...
EntityManager em = emf.createEntityManager();
¿£Æ¼Æ¼ °´Ã¼¸¦ ¸¸µå´Â °ÍÀº ÀÏ¹Ý ÀÚ¹Ù °´Ã¼¸¦ »ý¼ºÇϵíÀÌ new»ý¼ºÀÚ¸¦ »ç¿ëÇÏ¸é µÇ¸ç À̸¦ DB¿¡ ÀúÀåÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌEntityManager.persist() ¸Þ¼Òµå¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.
Customer customer = new Customer(id, name, address);em.persist(customer);
DB¿¡¼ ÇϳªÀÇ ¿£Æ¼Æ¼ °´Ã¼¸¦ °¡Á®¿À·Á¸é EntityManager.find() ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ÀÌ °æ¿ì¿¡´Â Primary key¿¡ ÇØ´çÇÏ´Â °ªÀ» ÅëÇØ¼ ¿£Æ¼Æ¼¸¦ °¡Á®¿Ã ¼ö ÀÖ´Ù.
Customer c = em.find(Customer.class, id);
¶Ç´Â ÀÚ¹Ù ÆÛ½Ã½ºÅϽº Äõ¸® ·©±ÍÁö(Java Persistence QueryLanguage)¸¦ ÀÌ¿ëÇÏ¿© ¸ðµç ¿£Æ¼Æ¼ µéÀ» °¡Á®¿À°Å³ª ƯÁ¤ Çʵ尪À» ºñ±³ÇÏ¿© ¿£Æ¼Æ¼¸¦ °¡Á®¿Ã ¼ö ÀÖ´Ù.
Query query = em.createQuery("select c from Customer c");List list = query.getResultList();
¿£Æ¼Æ¼ÀÇ Çʵ带 ¼öÁ¤ÇÏ·Á¸é ¿£Æ¼Æ¼ °´Ã¼ÀÇ Çʵ带 ¼öÁ¤ÇÏ¸é µÈ´Ù. ÇØ´ç Çʵå´Â EntityManager.flush() ¸¦ È£ÃâÇϰųª Æ®·£Àè¼ÇÀÌ commit µÉ ¶§ DB¿Í µ¿±âÈ µÈ´Ù.
Customer c = em.find(Customer.class, id);
c.setAddress(address);
¿£Æ¼Æ¼¸¦ »èÁ¦ÇÒ ¶§¿¡´Â EntityManager.remove()¸¦ È£ÃâÇÑ´Ù.
em.remove(customer);
¿£Æ¼Æ¼ °£ÀÇ °ü°è(Relationship)´Â ´Ù¸¥ ¿£Æ¼Æ¼¿¡ ´ëÇÑ ·¹ÆÛ·±½º·Î Ç¥ÇöµÇ´Âµ¥ °ü°è¸¦ ¼öÁ¤ÇÏ·Á¸é ·¹ÆÛ·±½º °ªÀ» ¹Ù²Ù¸é µÈ´Ù. ȤÀº ManyToMany, OneToMany¿Í °°ÀÌ ¿©·¯ °³ÀÇ ¿£Æ¼Æ¼¿Í °ü°è¸¦ ¸Î°í ÀÖÀ» ¶§´Â Collection °´Ã¼·Î Ç¥ÇöµÇ¹Ç·Î ÇØ´çmicro software 2006+7 129
Collection ³»¿ëÀ» ¹Ù²Ù¸é µÈ´Ù.
public class Customer //...
@OneToMany(mappedBy="customer", cascade={CascadeType.
PERSIST, CascadeType.REMOVE})
private List orders;
public void addOrder(Orders o){orders.add(o);
}
°ü°èÀÇ °æ¿ì¿¡´Â ÇØ´ç ¿£Æ¼Æ¼¿¡ ´ëÇØ ¿ÀÆÛ·¹À̼Ç(persist,remove µî) ÇÒ ¶§ °ü°èµÈ ¿£Æ¼Æ¼µµ °°ÀÌ persist, remove µÉ °ÍÀÎÁö¸¦ ÁöÁ¤ÇÏ´Â cascade ŸÀÔÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ±âº»ÀûÀ¸·Î´Â cascade °ªÀÌ ÁöÁ¤µÇÁö ¾ÊÁö¸¸ À§¿Í °°ÀÌ ÁöÁ¤Çϸé Customer¿£Æ¼Æ¼°¡ »ý¼º, »èÁ¦µÉ ¶§ °ü°èµÈ Orders ¿£Æ¼Æ¼µµ °°ÀÌ »ý¼º, »èÁ¦µÈ´Ù.
ÀÚ¹Ù ÆÛ½Ã½ºÅϽº¿¡¼´Â ÀÚ¹Ù ÆÛ½Ã½ºÅϽº Äõ¸® ·©±ÍÁö(JavaPersistence Query Language)¶ó°í ÇÏ´Â °´Ã¼ ÁöÇâÀûÀÎ Äõ¸® ¾ð¾î¸¦ Á¦°øÇÑ´Ù. EJBQL¿Í À¯»çÇÏÁö¸¸ ÀÚ¹Ù ÆÛ½Ã½ºÅϽº Äõ¸®´Â Bulk Update, Delete ¹® »Ó¸¸ ¾Æ´Ï¶ó ¼ºêÄõ¸®(Subquery)µµ Áö¿øÇϹǷΠ±× Ȱ¿ë¹üÀ§°¡ ³Ð´Ù. ¶ÇÇÑ DB¿¡ Æ¯ÈµÈ SQL ¹®À» Á÷Á¢ »ç¿ëÇÒ ¼ö ÀÖ´Â ³×ÀÌÆ¼ºê Äõ¸®(Native Query)µµ Áö¿øÇÑ´Ù.
Äõ¸®¸¦ ½ÇÁ¦·Î »ç¿ëÇÒ ¶§´Â µ¿ÀûÀ¸·Î ¹Ù·Î »ý¼ºÇؼ »ç¿ëÇϰųª ³×ÀÓµå Äõ¸®(Named query)¶ó°í ÇÏ´Â Á¤ÀûÀÎ ¹æ½ÄÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.
// µ¿Àû Äõ¸®
Query query = em.createQuery("select c from Customer c wherename=:name");
query.setParameter("name", name);List list = query.getResultList();
// Á¤Àû Äõ¸® - @NamedQuery´Â ¿£Æ¼Æ¼¿¡ ¸í±â@NamedQuery(name="findCustomerByName", query="select cfrom Customer c where c.name=:name")
Query query = em.createNamedQuery("findCustomerByName");query.setParameter("name", name);List list = query.getResultList();
³×ÀÓµå Äõ¸®(Named Query)´Â ¿£Æ¼Æ¼ Ŭ·¡½º¿¡ Á÷Á¢ ¸í±âµÇ¸ç ÀçȰ¿ëµÇ±â ¶§¹®¿¡ ÇØ´ç ¿£Æ¼Æ¼¿¡ ´ëÇØ¼ ÀÚÁÖ È°¿ëµÇ´Â Äõ¸®ÀÇ °æ¿ì ¹Ì¸® Á¤ÀÇÇØ ³õ°í »ç¿ëÇÏ¸é Æí¸®ÇÏ´Ù.
| ¿£Æ¼Æ¼ÀÇ ¶óÀÌÇÁ»çÀÌŬ°ú ÆÛ½Ã½ºÅϽº ÄÁÅØ½ºÆ® |
|
EntityManagerÀÇ µ¿ÀÛÀº ÆÛ½Ã½ºÅϽº ÄÁÅØ½ºÆ®(PersistenceContext)¿Í ÀÌ¿Í °ü·ÃµÈ ¿£Æ¼Æ¼ ÀνºÅϽºÀÇ ¶óÀÌÇÁ»çÀÌŬÀ» ¾Ë¾Æ¾ß ÀÌÇØÇÒ ¼ö ÀÖ´Ù. ÀÌ ºÎºÐÀº ÀÚ¹Ù ÆÛ½Ã½ºÅϽº¿¡¼ Áß¿äÇÏ°íµµ Á¶±Ý º¹ÀâÇÑ ºÎºÐÀÌ´Ù. ÆÛ½Ã½ºÅϽº ÄÁÅØ½ºÆ®(PersistenceContext)´Â ÇöÀç °ü¸®µÇ°í ÀÖ´Â ¿£Æ¼Æ¼ ÀνºÅϽºµéÀÇ ÁýÇÕÀ» ¸»Çϴµ¥ ¿£Æ¼Æ¼ ÀνºÅϽºÀÇ »óÅ´ EntityManager ¿ÀÆÛ·¹À̼ǰú ¹ÐÁ¢ÇÑ °ü·ÃÀÌ ÀÖ´Ù. <±×¸² 2>´Â ¿£Æ¼Æ¼ÀÇ »óŰ¡ ¾î¶»°Ô º¯ÈÇÏ´ÂÁö º¸¿©ÁØ´Ù.
 |
| <±×¸² 2> EntityManager ¿ÀÆÛ·¹À̼ǿ¡ µû¸¥ ¿£Æ¼Æ¼ÀÇ ¶óÀÌÇÁ»çÀÌŬ |
¡Ü New - ¿£Æ¼Æ¼ ÀνºÅϽº°¡ »ý¼ºµÇ¾úÀ» ¶§ÀÇ »óÅ·ΠDB¿Í ¿¬°áµÇ¾î ÀÖÁö ¾Ê´Ù. persist( )¸¦ ÅëÇØ¼ DB¿¡ ÀúÀåµÇ¸çmanaged »óŰ¡ µÈ´Ù.
¡Ü Managed - ¿£Æ¼Æ¼ ÀνºÅϽº°¡ ÆÛ½Ã½ºÅϽº ÄÁÅØ½ºÆ®¿¡ ÀÇÇØ¼ °ü¸®µÇ´Â »óÅ·Π¿£Æ¼Æ¼ ÀνºÅϽº °ªÀÇ º¯È°¡ DB¿¡ ¹Ý¿µµÈ´Ù. Container-managed EntityManagerÀÇ °æ¿ì Æ®·£Àè¼ÇÀÌ Á¾·áµÇ¸é ¸ðµç ¿£Æ¼Æ¼´Â detached »óŰ¡ µÈ´Ù.
¡Ü Detached - ¿£Æ¼Æ¼ ÀνºÅϽº°¡ ÆÛ½Ã½ºÅϽº ÄÁÅØ½ºÆ®¿¡ ÀÇÇØ¼ ´õ ÀÌ»ó °ü¸®µÇÁö ¾Ê´Â »óÅ·ΠDB¿Í ¿¬°áµÇÁö ¾Ê´Â´Ù.
EntityManager.merge( )¸¦ ÅëÇØ¼ ´Ù½Ã managed »óÅ·Π¸¸µé ¼ö ÀÖ´Ù.
¡Ü Removed - DB¿¡¼ ÇØ´ç ¿£Æ¼Æ¼°¡ »èÁ¦µÉ »óÅÂÀÌ´Ù.
ÀÌÁ¦ ¿£Æ¼Æ¼ Ŭ·¡½ºµéÀ» ½ÇÁ¦·Î ¾ÖÇø®ÄÉÀ̼ǿ¡ ÆÐŰ¡ ½ÃŰ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ¿£Æ¼Æ¼ Ŭ·¡½º¸¦ ÆÐŰ¡ ÇÒ ¶§´ÂMETA-INF/persistence.xml µð½ºÅ©¸³ÅͰ¡ ²À ÇÊ¿äÇÏ´Ù.
persistence.xmlÀº °ü·ÃµÈ ¿£Æ¼Æ¼ Ŭ·¡½ºµé°ú ÀÌ¿¡ ´ëÇÑ DB
DataSource ¼³Á¤ µî°ú °°ÀÌ ÆÛ½Ã½ºÅϽº À¯´Ö(PersistenceUnit_¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Ù. ÆÛ½Ã½ºÅϽº À¯´ÖÀº ¿£Æ¼Æ¼¸¦ ¹´Â ´ÜÀ§À̸ç À̰ÍÀº ÇϳªÀÇ DB¿¡¸¸ ¸ÅÇεȴÙ. ÆÛ½Ã½ºÅϽº À¯´ÖÀº À¯´Ö À̸§(Unit Name) ½Äº°ÀÚ¸¦ °¡Áö´Âµ¥ ÀÌ ½Äº°ÀÚ´Â EntityManager³ª EntityManagerFactory¸¦ ¾òÀ» ¶§ »ç¿ëµÈ´Ù.
// persistence.xml
<persistence version="1.0"xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="orderunit"transaction-type="JTA"><jta-data-source>jdbc/sample</jta-data-source><properties> <!-- ÇÁ·Î¹ÙÀÌ´õ º° ¼³Á¤ --><property name="toplink.ddl-generation"value="createtables"/></properties>
</persistence-unit>
</persistence>
ÆÐŰ¡Àº ´ÙÀ½°ú °°ÀÌ JAR ÆÄÀÏÀ̳ª µð·ºÅ丮¿¡ ÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ ´ÜÀ§¸¦ ÆÛ½Ã½ºÅϽº À¯´Ö ·çÆ®(Persistence Unit Root)¶ó°í ÇÑ´Ù.
¡Ü EAR library µð·ºÅ͸®ÀÇ JAR ÆÄÀÏ(e.g. orderapp.ear!/lib/entities.jar)¡Ü EAR ·çÆ® µð·ºÅ͸®ÀÇ JAR ÆÄÀÏ(e.g. orderapp.ear!/entities.jar)¡Ü EJB JAR ÆÄÀÏ (e.g. orderapp.ear!/orderapp-ejb.jar)¡Ü WAR ÆÄÀÏÀÇ WEB-INF/classes
(e.g. orderapp-web.war!/WEB-INF/classes)¡Ü WAR ÆÄÀÏÀÇ WEB-INF/lib¿¡ JAR ÆÄÀÏ(e.g. orderapp-web.war!/WEB-INF/lib/entities.jar)¡Ü application clientÀÇ JAR ÆÄÀÏ(e.g. orderapp.ear!/orderapp-client.jar)
ÀÚ¹ÙSE ȯ°æ¿¡¼ »ç¿ëÇÒ ¶§´Â Application-managedEntityManager¸¸ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç JDBC µå¶óÀ̹ö¿¡ ±¹ÇÑµÈ ·ÎÄÃ(resource-local) Æ®·£Àè¼Ç¸¸ ¾µ ¼ö ÀÖ´Ù.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("orderunit");
EntityManager em = emf.createEntityManager();//...
EntityTransaction tx = em.getTransaction();tx.begin();
em.persist(customer);
tx.commit();
//...
em.close();
emf.close();
ÀÚ¹ÙSE¿¡¼´Â javax.persistence.spi.Persistence ºÎÆ®½ºÆ®·¦API¸¦ »ç¿ëÇØ¼ EntityManagerFactory¸¦ ¾ò´Â´Ù´Â °Í°ú EntityTransaction API¸¦ ÀÌ¿ëÇÏ¿© Á÷Á¢ Æ®·£Àè¼Ç ÄÁÆ®·ÑÀ» ÇØÁÖ¾î¾ß ÇÑ´Ù´Â Â÷À̰¡ ÀÖ´Ù. ¶ÇÇÑ persistence.xml ÆÄÀÏÀÇ À§Ä¡´Â Ŭ·¡½ºÆÐ½º »ó¿¡¼ META-INF/persistence.xml¿¡ ÀÖ¾î¾ß Çϸç, ÀÚ¹ÙEE ȯ°æ°ú ´Þ¸® ´ÙÀ½°ú °°ÀÌ ¸ðµç ¿£Æ¼Æ¼ Ŭ·¡½º¸¦ ¸í½ÃÀûÀ¸·Î ³ª¿ÇØ ÁÖ¾î¾ß ÇÑ´Ù.
<persistence-unit name="orderunit">
<class>orderapp.entities.Customer</class>
<class>orderapp.entities.Item</class>
<class>orderapp.entities.Orders</class>
Áö±Ý±îÁö EJB 3.0°ú ÀÚ¹Ù ÆÛ½Ã½ºÅϽº API 1.0 ³»¿ë°ú ¿¹Á¦Äڵ带 »ìÆìº¸¾Ò´Ù. ¸¹Àº ³»¿ëÀ» ±íÀÌ ÀÖ°Ô ´Ù·çÁö´Â ¸øÇÏ¿´Áö¸¸ Àü¹ÝÀûÀΠƯ¡À» »ìÆìº¸´Âµ¥ µµ¿òÀÌ µÇ¾úÀ¸¸®¶ó ¹Ï´Â´Ù.
2006³â ÀÚ¹Ù¿ø(JavaOne)¿¡¼µµ EJB 3.0°ú ÀÚ¹Ù ÆÛ½Ã½ºÅϽº¿¡ °ü·ÃµÈ ¼¼¼ÇÀÌ ¸¹¾Ò´Ù. ÇÊÀÚÀÇ ºí·Î±×¿¡ °¡¸é ¼¼¼Ç¿¡ ´ëÇÑ ¼Ò°³¿Í ÇÁ¸®Á¨Å×ÀÌ¼Ç PDF¸¦ ¹ÞÀ» ¼ö ÀÖ´Ù(http://weblogs.java.net/blog/guruwons/archive/2006/06/ejb_30_sessions.html). @
| Âü°í ÀÚ·á:1. Java EE 5 Tutorial - http://java.sun.com/javaee/5/docs/tutorial/doc/2. SDN Article: The Java Persistence API - A Simpler Programming Model forEntity Persistence - http://java.sun.com/developer/technicalArticles/J2EE/jpa/3. JSR 220 - http://jcp.org/en/jsr/detail?id=220ÀÌ´ÞÀÇ µð½ºÄÏ : EJB30samp.zip |
|
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.