J2EE, EJB, Struts notes

J2EE, ƯÈ÷ EJB¿Í Struts ÇÁ·¹ÀÓ¿÷, º¸¾È, À¥·ÎÁ÷ ¼­¹ö¿¡ °ü·ÃµÈ ÆÁµéÀ» Á¤¸®ÇÏ°í ÀÖ½À´Ï´Ù.
J2EE 1.4¿Í Sun Java System AS¿¡ °ü·ÃµÈ ³»¿ëÀº º°µµÀÇ ÆäÀÌÁö¿¡¼­ ´Ù·ê ¿¹Á¤ÀÔ´Ï´Ù.
1. EJB reference problems
EJB°¡ ´Ù¸¥ EJB¸¦ ÂüÁ¶ÇÒ ¶§, ȤÀº ´Ù¸¥ Ŭ·¡½ºµéÀ» ÂüÁ¶ÇÒ ¶§ »óÈ£ ÂüÁ¶ ¹®Á¦³ª Ŭ·¡½º °æ·Î ÂüÁ¶ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.
ÀϹÝÀûÀÎ J2EE ÇÁ·ÎÁ§Æ®´Â ¿©·¯ Ƽ¾î·Î ±¸¼ºµÇ±â ¶§¹®¿¡ À¥ Ƽ¾î¿Í EJB Ƽ¾î, ±×¸®°í Áß°£ Ƽ¾î¸¦ ±¸¼ºÇÏ´Â Àڹ٠Ŭ·¡½ºµé °£ÀÇ ÂüÁ¶ °ü°è(ÀÇÁ¸ ±¸Á¶)¸¦ ¸íÈ®ÇÏ°Ô ÇØ¾ß ÇÑ´Ù.
À¥·ÎÁ÷ ¼­¹öÀÇ °æ¿ì, EJB jar ÆÄÀÏ¿¡¼­ ManifestÀÇ Class-Path Ç׸ñÀ» »ç¿ëÇÏ¿© EJB°¡ ÂüÁ¶Çϴ Ŭ·¡½ºµéÀÌ Æ÷ÇÔµÈ jar ÆÄÀÏ ¸ñ·ÏÀ» ÁöÁ¤ÇÒ ¼ö Àִµ¥ ear ÆÄÀÏ·Î deployµÇ´Â °æ¿ì¿¡¸¸ µ¿ÀÛÇÑ´Ù.

2. Emacs JDE¸¦ »ç¿ëÇÑ EJB Áö¿ø
À̸ƽº¸¦ »ç¿ëÇÏ¿© ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â »ç¶÷À̶ó¸é ´ëºÎºÐ JDE for Emacs¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù.
ÇöÀçÀÇ JDE ¹öÀüÀº EJB¸¦ Áö¿øÇÑ ¸¹Àº ±â´ÉÀÌ Æ÷ÇԵǾî ÀÖÁö¸¸, EJB 2.x ½ºÆå¿¡ ¸Â´Â EJB ½ºÄÌ·¹Æ° ¹öÆÛ¸¦ »ý¼ºÇÏÁö ¾Ê°í EJB 1.1 ½ºÆå¿¡ µû¸¥ ¹öÆÛµéÀ» »ý¼ºÇØÁØ´Ù. (M-x jde-ejb-session-bean-buffer ȤÀº M-x jde-ejb-entity-bean-buffer ¸í·É ÂüÁ¶)
Àӽ÷ΠÀÌ ±â´ÉµéÀ» EJB 2.x ½ºÆå¿¡ ¸Â´Â ¹öÆÛ¸¦ ¸¸µéµµ·Ï JDE 2.3.2 ¹öÀüÀÇ jde-ejb.elÀ» º¯°æÇÏ¿© º¸¾Ò´Ù.
¼öÁ¤ÇÑ jde-ejb.el

3. Ant build.xml - ¸ÖƼ Ƽ¾î J2EE ÇÁ·ÎÁ§Æ®
À¥ Ƽ¾î, ¿©·¯ °³ÀÇ EJB, Data Transfer Object°¡ Æ÷ÇÔµÈ Áß°£ Ƽ¾î µî ¿©·¯ Ƽ¾î·Î ±¸¼ºµÇ´Â J2EE ÇÁ·ÎÁ§Æ®¸¦ ºôµåÇÏ´Â AntÀÇ ºôµå ÆÄÀÏÀ» ÀÛ¼ºÇÒ ¶§¿¡´Â °¢ Ƽ¾î¿¡ ´ëÇÑ ÀÇÁ¸À» °í·ÁÇØ¾ß ÇÑ´Ù.
°¢ Ƽ¾îÀÇ ¿ä¼Ò°¡ ½ÇÇà ½Ã¿¡ »óÈ£ Ŭ·¡½º ÂüÁ¶¿¡ ´ëÇÑ ÀÇÁ¸À» deploy ½Ã¿¡ °í·ÁÇÏ¿© jar, war, ear ÆÄÀÏÀ» ±¸¼ºÇØ¾ß ÇÏ´Â °Íó·³, Ant·Î ºôµåÇÒ ¶§¿¡µµ °¢ Ÿ°Ùº°·Î ÀÌ¿Í À¯»çÇÑ °í·Á¸¦ ÇØ¾ß ÇÑ´Ù.
´ÙÀ½Àº À¥ applicationÀ» Æ÷ÇÔÇÑ ´ÙÁß Æ¼¾î ±¸Á¶¸¦ À§ÇÑ AntÀÇ build.xml ÆÄÀÏ ¿¹Á¦ÀÌ´Ù.
¿¹Á¦ ÆÄÀÏ¿¡¼­´Â web hot deploy ¸ðµå¸¦ Áö¿øÇϱâ À§ÇØ EJB¸¦ »ç¿ëÇÏÁö ¾Ê´Â º°µµÀÇ Å×½ºÆ®¿ë ºñÁî´Ï½º Ƽ¾î¸¦ »ç¿ëÇÏ°í ÀÖ´Ù.
¶Ç´Ù¸¥ ¹æ¹ýÀ¸·Î´Â warÀÇ ³»¿ëÀº µð·ºÅ丮¿¡ Ç®¾î¼­ ¹èÆ÷ÇÏ°í warÀÇ ³»¿ëÀ» »«, Áï EJB¿Í ¶óÀ̺귯¸®¸¸À¸·Î ±¸¼ºµÈ ear ÆÄÀÏÀ» ¹èÆ÷ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ¸é º°µµÀÇ ºñÁî´Ï½º Ƽ¾î ¾øÀÌ web hot deploy ¸ðµå¸¦ °³¹ß ¶§ »ç¿ë °¡´ÉÇÏ´Ù.
´ÙÁß Æ¼¾î J2EE ÇÁ·ÎÁ§Æ®¸¦ À§ÇÑ Ant ºôµå ÆÄÀÏ ¿¹

4. Jakarta Struts framework Àû¿ë ÆÁ
Struts 1.1 °¡À̵å(PDF ¹®¼­)
MVC À¥ ¾ÆÅ°ÅØóÀÎ ½ºÆ®·µ ÇÁ·¹ÀÓ¿÷À» Àû¿ëÇÒ ¶§ ÀÚÁÖ ¸¸³ª°Ô µÇ´Â ¸î °¡Áö ¹®Á¦µé¿¡ ´ëÇÑ ÇØ°áÃ¥.
[¿©±â¿¡ bean:define¸¦ »ç¿ëÇÏ¿© Á¤ÀÇÇÑ °ªÀ» logic:iterate µîÀÇ Å±׿¡¼­ ÂüÁ¶ÇÏ´Â ¿¹Á¦°¡ µé¾î¿Í¾ß ÇÔ]
[¿©±â¿¡ ¸ðµ¨(ActionForms)/ºä(jsp and tags)/ÄÁÆ®·Ñ·¯(Actions)¸¦ »ç¿ëÇÏ´Â ±âº» È帧°ú ÀüÇüÀûÀÎ °ü°èµé¿¡ ´ëÇÑ ¼³¸íÀÌ Ãß°¡µÉ °ÍÀÓ]

5. Weblogic Security SPI ±¸Çö ÆÁ
JAAS ±â¹Ý À§¿¡¼­ J2EE Security¸¦ ±¸ÇöÇϱâ À§ÇÑ À¥·ÎÁ÷ ¼­¹öÀÇ º¸¾È SPI ±¸Çö¿¡¼­ÀÇ ¹®Á¦Á¡°ú ÇØ°áÃ¥
¹®Á¦Á¡ÇØ°áÃ¥
JAAS LoginContext¸¦ »ç¿ëÇÒ °æ¿ì, ÀÎÁõµÈ Subject°¡ À¥·ÎÁ÷ ¼­¹öÀÇ ÄÁÅ×À̳ʷΠÀüÆĵÇÁö ¾Ê´Â´Ù. weblogic.security.services.Authentication.login(CallbackHandler) ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© ¾òÀº Subject¿¡ ÀÎÁõµÈ Principalµé°ú CredentialµéÀ» ÀúÀåÇÑ´Ù.
À¥·ÎÁ÷ÀÇ AuthenticationProvider¸¦ »ç¿ëÇÒ °æ¿ì(authentication provider³ª identity asserter ¸ðµÎ ÇØ´ç) Ä¿½ºÅÒ CallbackHandler¸¦ LoginModule¿¡ ³Ñ°ÜÁÙ ¼ö ¾ø´Ù. À¥·ÎÁ÷ ¼­¹öÀÇ ÄÁÅ×À̳ʰ¡ ·Î±×ÀÎ ¸ðµâÀ» È£ÃâÇϱ⠶§¹®ÀÌ´Ù. weblogic.security.services.Authentication.login(CallbackHandler) ¸Þ¼Òµå¸¦ Á÷Á¢ È£ÃâÇÑ´Ù. JAAS¿¡¼­ LoginContext¸¦ »ý¼ºÇÏ¿© login() ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â °Í°ú À¯»çÇϸç, À¥·ÎÁ÷¿¡ µî·ÏµÈ authentication providersµéÀÇ LoginModuleµéÀÌ È£ÃâµÇ¾î, Authentication.login() ¸Þ¼Òµå¿¡ ÀÎÀÚ·Î ÁöÁ¤ÇÑ Ä¿½ºÅÒ Äݹé Çڵ鷯°¡ ·Î±×ÀÎ ¸ðµâ¿¡ ³Ñ°ÜÁø´Ù.
À¥·ÎÁ÷ ¼­¹ö ÄÁÅ×À̳ʰ¡ user¿Í groupÀ¸·Î °¢°¢ ÀνÄÇÏ´Â PrincipalÀ» ¸¸µé ÇÊ¿ä°¡ ÀÖ´Ù. weblogic.security.spi.WLSUser¿Í weblogic.security.spi.WLSGroup ÀÎÅÍÆäÀ̽º¸¦ °¢°¢ »ó¼ÓÇÏ´Â PrincipalÀ» Á¤ÀÇÇÏ¸é µÈ´Ù. weblogic.security.SubjectUtils Ŭ·¡½º´Â Subject·ÎºÎÅÍ »ç¿ëÀÚ Á¤º¸³ª ±×·ì Á¤º¸¸¦ °¡Á®¿À´Â À¯Æ¿¸®Æ¼ ¸Þ¼ÒµåµéÀ» Á¦°øÇÑ´Ù.


[¿©±â¿¡ À¥·ÎÁ÷ security SPI °ü·Ã]

6. HTML input form charset tip

7. À¯´ÏÄÚµå·Î µÈ ÆÄÀÏ À̸§À» ÀÎÅÍ³Ý ÀͽºÇ÷η¯¿¡¼­ ÀúÀåÇÏ´Â ¹æ¹ý
ÀÌ°ÍÀº ÀÚ¹Ù ÆÁÀ̶ó±âº¸´Ù´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® »çÀÇ ÀÎÅÍ³Ý ÀͽºÇ÷η¯ »ç¿ë ÆÁÀ̶ó°í ºÁ¾ß°Ú³×¿ä.
ÆÄÀÏ ´Ù¿î·ÎµåÇÒ ¶§ ÀÎÅÍ³Ý ÀͽºÇ÷η¯°¡ ÀÚµ¿À¸·Î ´Ù¿î·Îµå ´ëÈ­»óÀÚ¸¦ ¶ç¿ìµµ·Ï ÇÏ·Á¸é Content-Disposition HTTP Çì´õ¸¦ »ç¿ëÇÏ¸é µÈ´Ù´Â °ÍÀÌ ¸¹ÀÌ ¾Ë·ÁÁ® ÀÖ´Â °Í °°½À´Ï´Ù.
ÀÌ °æ¿ì
 Content-Disposition: attachment; filename=myfile.txt;
¹¹ ÀÌ·± ½ÄÀ¸·Î ó¸®ÇÏ¸é µÇ´Âµ¥ ¹®Á¦´Â ÆÄÀÏ À̸§ÀÌ myfile.txt°¡ ¾Æ´Ï¶ó ÇöÀçÀÇ ÀÎÄÚµù(ÇÑ±Û À©µµ¿ì¶ó¸é ÀÚ¹ÙÀÇ MS949)¿¡¼­ Ç¥ÇöÇÒ ¼ö ¾ø´Â ±ÛÀÚÀÏ °æ¿ìÀÔ´Ï´Ù.
´ÙÀ½ URL¿¡¼­ ½Ç¿ëÀûÀÎ ÇعýÀ» Á¦½ÃÇÏ°í ÀÖ½À´Ï´Ù. ½ÇÁ¦ Ç¥ÁØÀ̶ó°í º¸±â¿¡´Â ¾ÆÁ÷ ¹«¸®°¡ ÀÖ½À´Ï´Ù. ¾ÆÁ÷ unicode ÆÄÀÏ À̸§À» ÀÌ Çì´õ¿¡¼­ ó¸®Çϴ ǥÁØÀº ¸íÈ®ÇÏÁö ¾ÊÀº °Í °°½À´Ï´Ù.

ÀÌ ³»¿ë°ú °ü·ÃµÈ RFC´Â ÀÔ´Ï´Ù.
±×·±µ¥ ÀÌ·¸°Ô ó¸®Çϸé UTF8·Î escapeµÇ¸é¼­ ³Ê¹« ±æ¾îÁö°Ô µÇ´Âµ¥ IE°¡ Çì´õ ±æÀÌ¿¡ ÇѰ踦 µÎ°í À־ ±ä ÆÄÀÏ À̸§Àº À߸ø º¸¿©ÁÙ ¼ö ÀÖ´ä´Ï´Ù.
±×·¡¼­ Ç×»ó ÀÌ ¹æ¹ýÀ» »ç¿ëÇϱ⺸´Ù´Â ÇöÀç ÀÎÄÚµùÀ¸·Î ¸ø º¸¿©ÁÖ´Â À¯´ÏÄÚµå ±ÛÀÚ°¡ ÀÖ´ÂÁö °Ë»ç¸¦ Çؼ­ ±× °æ¿ì¿¡¸¸ ÀÌ ¹æ¹ýÀ» ¾²´Â °Ô ÁÁ°Ú½À´Ï´Ù.
´ÙÀ½Àº Å×½ºÆ®¸¦ À§ÇÑ ¼­ºí¸´ ºÎºÐ ÄÚµå·Î, tomcat 5.0¿¡ input/output ÀÎÄÚµù ¸ðµÎ¸¦ ISO-8859-1·Î °¡Á¤ÇÏ°í ÀÖ½À´Ï´Ù.
input/output ÀÎÄÚµùÀÌ MS949³ª EUC-KRÀÎ °æ¿ì¿¡´Â ¾à°£ ¼öÁ¤ÀÌ ÇÊ¿äÇÒ °ÍÀÔ´Ï´Ù.
ÀÌ ¹æ½ÄÀ» »ç¿ëÇϸé ÇÑ±Û À©µµ¿ì¿¡¼­ MS949 ¹ÛÀÇ ÀϺ»¾î³ª Áß±¹¾î ±ÛÀÚ¸¦ °¡Áø ÆÄÀÏ À̸§µµ ÀÎÅÍ³Ý ÀͽºÇ÷η¯ ´Ù¿î·Îµå ´ëÈ­»óÀÚ¿¡¼­ Ç¥ÇöÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.
    // »ç¿ë ÀÎÄÚµùÀ» MS949·Î »ý°¢ÇÏ°í »ó¼ö ¼±¾ðÇÕ´Ï´Ù.
    private static final String MY_ENCODING = "MS949";

... (»ý·«)
{
... (»ý·«)

    String fileName = request.getParameter("fileName");

    // 1¹ÙÀÌƮ¥¸®¶ó°í »ý°¢ÇÏ°í ÅèĹÀÌ ÀоîµéÀÎ °ÍÀ» UTF8·Î ¹Ù·Î Àâ½À´Ï´Ù.
    // ½ÇÁ¦ IE°¡ UTF8·Î postÇØ¾ß ÇÏ°ÚÁö¿ä.
    fileName = new String(fileName.getBytes("8859_1"), "UTF8");
    String agentType = request.getHeader("User-Agent");

    response.setContentType("application/octet-stream;");

    // ÅèĹÀÌ ÀÌÇØÇÒ ¼ö ÀÖ´Â RESPONSE HEADER·Î ¹Ù²ãÁÖ±â À§ÇØ MS949¿¡ µû¸¥ ¹ÙÀÌÆ®
    // ¹è¿­·Î ¹Ù²Ù°í ÀÌ°ÍÀ» ´Ù½Ã 1¹ÙÀÌƮ¥¸® StringÀÎ ISO-8859-1 ÀÎÄÚµùÀ¸·Î
    // Çؼ­ String °´Ã¼¸¦ ´Ù½Ã ¸¸µì´Ï´Ù. ¸¸¾à MS949¸¦ ±âº» ÀÎÄÚµùÀ¸·Î ÀνÄÇÏ´Â
    // ȯ°æÀ̶ó¸é ±×³É ¹®ÀÚ¿­À» »ç¿ëÇÏ¸é µÇ°ÚÁö¿ä.
    // String header = "attachment; filename=" + fileName + ";";
    String header = "attachment; filename=" + new
	String(fileName.getBytes(MY_ENCODING), "8859_1") + ";";

    // ÇöÀç ÀÎÄÚµùÀ¸·Î ´Ù Ç¥ÇöÇÒ ¼ö ÀÖ´ÂÁö ¿©ºÎ¸¦ °Ë»çÇؼ­, ´Ù Ç¥ÇöÇÒ ¼ö ¾øÀ»
    // °æ¿ì¿¡¸¸ RFC 2047¿¡¼­ Á¤ÀÇÇÑ °Í°ú À¯»çÇÑ ¹æ½ÄÀ¸·Î escapeÀ» ÇÕ´Ï´Ù.
    if (!fileName.equals(new String(fileName.getBytes(MY_ENCODING),
				    MY_ENCODING))) {
	header = "=?UTF-8?Q?attachment; filename="
	    + java.net.URLEncoder.encode(fileName, "UTF-8") + ";?=";
    }
    response.setHeader("Content-Disposition", header);
}

8. J2EE 1.4
See Notes on J2EE 1.4 AS Developer Release and Features.
[Class Loader, Dynamic Proxy, XML, JDBC, JNDI, LDAP, Transaction, Security, Cryptography, SSL, Authentication, Login, Authorization, CORBA, RMI, RMI-IIOP, ... º»°ÝÀûÀÎ ÀÚ¹Ù °³¹ßÀÚ·Î °¡±â À§ÇÑ (Ã¥) ÀÚ¹Ù 2 SDK 1.4 ½ÃÀÛ ±×¸®°í ¿Ï¼º]

Yoon Kyung Koo <yoonforh at yahoo dot com>
ÀÌ ÆäÀÌÁö´Â 2003³â 1¿ù 18ÀÏ¿¡ óÀ½ ¸¸µé¾îÁ³½À´Ï´Ù.
Last modified: Sat Dec 20 12:00:25 KST 2003