¿©·¯ºÐµé ³¯¾¾°¡ ¸¹ÀÌ Ãß¿öÁ³ÁÒ? ³¯¾¾°¡ Ãß¿ö¼ÀÎÁö °è¼Ó ÀḸ¿À°í..¾Æ¹«·¡µµ Á¦°¡ °Ü¿ïÀáÀ» ÁغñÇÏ´Â
°Í °°½À´Ï´Ù. ½ºÅ°Àåµµ Á» ´Ù´Ï°í ÇØ¾ß Çϴµ¥ ÁÖ¸»¿¡ ¿ø ½Ã°£ÀÌ ÀÖ¾î¾ß µ¹¾Æ´Ù´ÏµçÁö ÇÏÁÒ.. ^^
¾ÖÀÎÀÌ ¾ø¾î¼ ±×·±Áö ¿·±¸¸®µµ ÇãÀüÇÏ°í ±×·¸´Ù°í ½Ã°£ÀÌ ³ª´Â°Íµµ ¾Æ´Ï°í ¸»ÀÌÁÒ..
À̹ø ¾ÆƼŬ¼Ò½º´Â ÂË´ÔÀÌ ÀÛ¼ºÀ» ÇÏ¼Ì°í ±ÛÀº Á¦°¡ ¾²°í ÀÖ½À´Ï´Ù.. ¿äÁò ¸¹ÀÌ ÇÒÀÏÀÌ ¾øÀ¸½Å°¡ º¾´Ï´Ù.
´Ù½Ã ¾öû³ °øºÎ·Î ³»°øÀ» Å°¿ì½Ã´Â°É º¸¸é ¸»ÀÌÁÒ.^^
µý¼Ò¸®Áö¸¸ ¾Æ·¡ÂÊ¿¡ ÀÖ´Â jNetServer¸¦ ¼Ò½º¿ÀÇ½à ºÐ¼®ÇÏ¿© ÀÀ¿ëÇÏ°Ô µÇ¸é ¿©·¯ºÐµéµµ ¾ÆÁÖ °£´ÜÇÑ
EJB ContainerÁ¤µµ´Â ¶Òµü ¸¸µå½ÃÁö ¾ÊÀ»±î »ý°¢ÇÕ´Ï´Ù. ¾Æ´Ñ°¡¿ä? ¤¾¤¾
ÀÚ. ¾ÆƼŬ µé¾î°©´Ï´Ù.
¢º ÀÛ¼ºµ¿±â
¾î´À³¯ ÂËÀÌ ¿½ÉÈ÷ ÇÁ·ÎÁ§Æ®¸¦ ÇÏ¿© ¿ÀÇ 2´ÞÀü¿¡ ÀÌ¹Ì ¸ðµç ¿ä±¸»çÇ×À» ±¸ÇöÇÑ ÈÄ Å×½ºÆ®ÁßÀ̾ú½À´Ï´Ù.
±×·±µ¥ ÇÏ·ç´Â °è¼Ó ejb°¡ ÀÛµ¿¿¡·¯¸¦ ¹ß»ýÀ» ½ÃÅ°´õ¶ó ÀÌ°Ì´Ï´Ù.
EAIÇÁ·ÎÁ§Æ®¿¡¼ BEA WLI¸¦ ÀÌ¿ëÇÏ¿© work flow¸¦ ÀÛ¼ºÇÏ°í ÇØ´ç ¾÷¹«¸¦ ÀÚµ¿À¸·Î EJB·Î ¹Ù²ãÁִµ¥
¹®Á¦´Â WLI¿¡¼ EJB¿¡ ´ëÇÑ pooling size°¡ ¾ÆÁÖ ÀûÀº ¼ö·Î ¼³Á¤ÀÌ µÇ¾îÁö´õ¶õ °ÍÀε¥ ¸¸¾à¿¡
ÇØ´ç ¾ÖÇø®ÄÉÀ̼ÇÀ» ¹Ù²Ù·Á¸é ear or jar¾ÐÃàÀ» ǬÈÄ METAÁ¤º¸¸¦ ¼öÁ¤À» ÇÏ°í ´Ù½Ã ¾ÐÃàÇÑ ÈÄ
deploy¸¦ ÇØ¾ß ÇÑ´Ù´Â °ÍÀ̾ú´Âµ¥ EJB°¡ ¸¹¾ÆÁö¸é ¸¹ÀÌÁú¼ö·Ï ÇÏ°Ô µÇ´Â ³ë°¡´Ù´Â ÀÌ·ç ¸»ÇÒ¼ö
¾ø°ÚÁö¿ä.
¢º »ý°¢²¨¸®
ÀÚ~ ½ÇÁ¦ ÇØ°á¹æ¹ýÀ» º¸¿©ÁÖ±â Àü¿¡ Á¦°¡ Ç×»ó ¿©·¯ºÐµé¿¡°Ô Áú¹®À» ÇÏÁÒ? ¾î¶»°Ô Çϸé À§ÀÇ ¹®Á¦Á¡À»
ó¸®ÇÒ ¼ö ÀÖÀ» °ÍÀÎÁö ¸»ÀÌÁÒ..
³²ÀÇ °ÍÀ» ´þ¼®´þ¼® ¹Þ¾Æ¸ÔÀ» ¶§´Â ÀÌ¹Ì Áö³ª¾ß ÇÏÁö ¾Ê³ª¿ä? ¿©±âÀÇ ¾ÆƼŬµéÀ» º¸½Ã°í ÇÑ´Ù¸é
ÃÖ¼ÒÇÑ ±×Á¤µµÀÇ ¿¹ÀÇ(?)´Â °®Ãß¼Å¾ß ÇÏÁö ¾ÊÀ»±î¿ä?
½º½º·Î ¹®Á¦¸¦ ã¾Æ ÇØ°áÇÏ·Á´Â ³ë·Â~ copy-paste¿¡ ÀÇÁ¸ÇÏÁö ¾Ê´Â ¹æ¹ýÀ» Å͵æÇؾßÁÒ. ¹ßÀüÇؾßÇϴϱî¿ä.
»ý°¢Çϼ̳ª¿ä? Èì~ À̸¦ ¾î¶»°Ô ÇÑ´Ù? jarÆÄÀÏÀÇ ³»¿ëÀ» ó¸®ÇØ¾ß Çϴµ¥.. ±×¸®°í xmlÀ» ó¸®ÇØ¾ß Çϰڴµ¥?
¹®Á¦´Â ejb-jar, weblogic-ejb-jar.xmlÀÇ ±¸¹®Á¶Â÷µµ ¸ð¸¥´Ù¸é ÀÌ ±ÛÀ» Àд °ÍÀ» Æ÷±âÇØ¾ß ÇÒÁöµµ ¸ô¶ó¿ä.¤Ñ.¤Ñ
ÀÚ¹ÙÀÇ ¸ÀÀÌ ÇÁ·Î±×·¥À» VisualÇÑ MS°è¿ÀÇ ÅøÀÌ ¾Æ´Ñ text·Î ¸¸µé¾î³Â´Ù´Â°ÍÀ̾ú´Âµ¥ ¿äÁò °¢Á¾ IDEµéÀÌ
±×·¯ÇÑ °Í(¾ÖÇø®ÄÉÀÌ¼Ç ÄÚµù)µéÀ» Ŭ¸¯Å¬¸¯À¸·Î ÇØÁÖ´Ï ÀÌÁ¦ ¹¹ ºñ½ÁÇÏ°Ô µÇ±ä Çß½À´Ï´Ù.
Áö±Ý ÇÃÁ§À» ÇÏ°í Àִµ¥ ÇÑ °³¹ßÀÚ°¡ ±âÁ¸¿¡ Çß´ø ÇÁ·ÎÁ§Æ®ÀÇ ÄÚµùÆÐÅÏÀ» Á¦°¡ º¸±âÀ§Çؼ EJBÄڵ带
¿¾î Çϳª¸¸ ½ÇÇàÇغ¸¶ó°í Çߴµ¥ WSAD¸¦ ½ÇÇà½ÃÅ°´õ¶õ ¸»ÀÌÁÒ..
ÀÌ°Å ¿ø~ ÂÁ... ^^ Åøµµ ÁÁÁö¸¸ ±âº»ÀûÀÎ °ÍµéÀ» ¸ÕÀú º»ÈÄ¿¡ ÇÏ¸é ´õ ÁÁ°ÚÁÒ?
¢º ±¸Çö¹æ¹ý
ÀÌÁ¦ ±¸Çö¿¡ µé¾î°©´Ï´Ù.
¿ì¼± ¿ì¸®°¡ deploy¸¦ ½ÃÄ×´ø ÆÄÀÏÀº jar³ª earÀÇ ÇüŸ¦ ÃëÇÏ°Ô µÉ°ÍÀ̱¸¿ä.
1. ¿ì¼± ÇØ´ç ¾ÐÃàÆÄÀÏÀ» ã´Â´Ù
2. ¾ÐÃàµÈ ÆÄÀÏÁß ejb¿¡ °ü·ÃµÈ META-INFÀÇ Á¤º¸¸¦ ã¾Æ ÇØ´ç xmlÆÄÀÏÀ» ÆĽÌÇϵµ·Ï ÇÑ´Ù.
3. ÆÄ½ÌµÈ ¹®¼ÀÇ pool size¸¦ ÀԷ¹ÞÀº ³»¿ëÀ¸·Î ġȯÇÑ ÈÄ ´Ù½Ã ÀúÀåÇÑ´Ù.
4. ´Ù½Ã ÇØ´ç ÆÄÀÏÀ» ¾ÐÃàÇÑ´Ù.
À§ÀÇ Á¤µµ·Î ±¸ÇöÀ» ÇÏ¸é µÇ°Ú³×¿ä.
±âº»ÀûÀÎ standard APIÀÇ »ç¿ëÀº ÇʼöÀÌ°Ú±¸¿ä.
JDK1.3 ÀÌÇÏÀÇ ¹öÁ¯À» ¾²½Ã´Â ºÐµéÀº XMLÆĽ̿¡ °ü·ÃµÈ Ŭ·¡½º¸¦ ´Ù¿î¹Þ¾Æ Ŭ·¡½º Æнº¿¡ Ãß°¡ÇϽŠÈÄ
ÄÄÆÄÀÏ ¹× ½ÇÇàÇÏ¼Å¾ß ÇÕ´Ï´Ù.
¢º ±¸Çöü
package jlook.weblogic.util;
import java.io.*;
import java.util.*;
import java.util.jar.*;
import java.util.zip.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.xml.sax.helpers.*;
/**
* ƯÁ¤ µð·ºÅ丮 ¹ØÀÇ ¸ðµç EJB jar ÆÄÀÏÀ» °Ë»öÇÏ¿© jar ÆÄÀÏ ³»
* WebLogic Deployment Descriptor[weblogic-ejb-jar.xml] ÆÄÀÏÀ» DOMÀ¸·Î ·ÎµùÇÏ¿©
* initial-beans-in-free-pool, max-beans-in-free-poolÀÇ size¸¦ command lineÀ¸·Î
* ÀÔ·ÂÇÑ °ªÀ¸·Î º¯°æÀúÀåÇÏ´Â ApplicationÀÌ´Ù.
* usage : java WLSPoolModifier <target-directory> <min-size> <max-size>
*
* @since 1.0
* @author Jeon HongSeong(hsjeon70@dreamwiz.com)
*/
public class WLSPoolModifier implements Runnable {
/** Target Directory */
private static String PATH;
/** inital size */
private static int minSize;
/** maximum size */
private static int maxSize;
/** WebLogic Deployment Descriptor file °æ·Î */
private static final String DD_ENTRY = "META-INF/weblogic-ejb-jar.xml";
/** root tag name */
private static final String WEBLOGIC_ENTERPRISE_BEAN = "weblogic-enterprise-bean";
/** stateless session descriptor tag name */
private static final String STATELESS_SESSION_DESCRIPTOR = "stateless-session-descriptor";
/** pool tag name */
private static final String POOL = "pool";
/** maximum size tag name */
private static final String MAX_BEANS_IN_FREE_POOL = "max-beans-in-free-pool";
/** initial size tag name */
private static final String INITIAL_BEANS_IN_FREE_POOL = "initial-beans-in-free-pool";
/** current time mill */
private static long systime = System.currentTimeMillis();
/** DOCTYPEÀÇ SYSTEM ID */
private static String SYSTEM_ID;
/** DOCTYPEÀÇ PUBLIC ID */
private static String PUBLIC_ID;
/** weblogic.doctype file loading ¿©ºÎ */
private static boolean load = false;
/**
* static initializer
* weblogic.doctype fileÀ» classpath¿¡¼ ã¾Æ ·ÎµùÇÑ´Ù.
*/
static {
try {
ClassLoader loader = WLSPoolModifier.class.getClassLoader();
InputStream in = loader.getResourceAsStream("weblogic.doctype");
if(in!=null) {
Properties p = new Properties();
p.load(in);
p.list(System.out);
SYSTEM_ID=p.getProperty("systemId");
PUBLIC_ID=p.getProperty("publicId");
load = true;
}
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* application main method
* command line Àμö¸¦ validateÇÏ°í, thread¸¦ startÇÑ´Ù.
*
* @param args path, min-size, max-size
*/
public static void main(String args[]) throws Exception {
if(args.length!=3) {
System.out.println("java WLSPoolModifier <path> <min-size> <max-size>");
return;
}
PATH = args[0];
try {
minSize = Integer.parseInt(args[1]);
} catch(Exception e) {
minSize = 20;
}
try {
maxSize = Integer.parseInt(args[2]);
} catch(Exception e) {
maxSize = 20;
}
System.out.println("@ target directory>> "+PATH);
System.out.println("@ new minimum size>> "+minSize);
System.out.println("@ new maximum size>> "+maxSize);
Thread t = new Thread(new WLSPoolModifier());
t.start();
}
/**
* Target directory³» jarÆÄÀÏÀ» °Ë»öÇϱâ À§ÇØ searchJarFile() methodÀ» È£ÃâÇÑ´Ù.
*
*/
public void run() {
File dir = new File(PATH);
if(!dir.exists()) {
System.out.println("The path does not exists. - "+PATH);
return;
}
try {
searchJarFile(dir);
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* dir ³» ¸ðµç jar ÆÄÀÏÀ» ã¾Æ jar ÆÄÀÏ¿¡ ´ëÇØ findEntry() ¸Þ¼µå¸¦ ½ÇÇàÇÏ°í,
* weblogic-jar-ejb.xml ÆÄÀÏÀÌ Á¸ÀçÇÒ °æ¿ì convert(), makeJar() ¸Þ¼µå¸¦ ½ÇÇàÇÑ´Ù.
*
*/
private void searchJarFile(File dir) throws Exception {
File[] lists = dir.listFiles();
for(int i=0;i> "+lists[i]);
Document root = findEntry(lists[i]);
if(root!=null) {
byte[] dd = convert(root);
makeJar(lists[i], dd);
}
}
}
}
}
/**
* ÆĶó¹ÌÅÍÀÇ Document object¸¦ XSLT¸¦ ÀÌ¿ëÇØ byte[] ·Î convertÇÑ´Ù.
*
* @param root weblogic-jar-ejb.xml¿¡ ´ëÇÑ Document object
* @return Document¿¡ ´ëÇÑ byte[]
*/
private byte[] convert(Document root) {
try {
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf = factory.newTransformer();
DocumentType doctype = root.getDoctype();
String publicId=null;
String systemId=null;
if(doctype != null) {
publicId = doctype.getPublicId();
systemId = doctype.getSystemId();
} else {
if(load) {
systemId = SYSTEM_ID;
publicId = PUBLIC_ID;
} else {
systemId = "http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd";
publicId = "-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN";
}
}
System.out.println("\t- publicId>> "+publicId);
System.out.println("\t- systemId>> "+systemId);
tf.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, systemId);
tf.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, publicId);
DOMSource source = new DOMSource(root);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
StreamResult result = new StreamResult(bos);
tf.transform(source,result);
return bos.toByteArray();
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
/**
* ÇØ´ç jar ÆÄÀÏ¿¡ weblogic deployment descriptor¸¦ ġȯÇÏ´Â ¸Þ¼µå
* orginal jar ÆÄÀÏÀº backupÀ» ³²±ä´Ù.[~.jar.org]
*
* @param oldJar ejb jar file
* @param dd weblogic-ejb-jar.xml¿¡ ´ëÇÑ byte array
*/
private void makeJar(File oldJar, byte[] dd) throws Exception {
JarFile jarFile = null;
File newJar = new File(oldJar.getParentFile(), "_"+oldJar.getName());
FileOutputStream fo = null;
JarOutputStream jos = null;
System.out.println("\t- make the "+newJar);
try {
jarFile = new JarFile(oldJar);
fo = new FileOutputStream(newJar);
jos = new JarOutputStream(fo);
Enumeration en = jarFile.entries();
while(en.hasMoreElements()) {
JarEntry entry = (JarEntry)en.nextElement();
InputStream in = jarFile.getInputStream(entry);
byte[] buff = readData((int)entry.getSize(), in);
in.close();
JarEntry newEntry = new JarEntry(entry.getName());
entry.setMethod(entry.DEFLATED);
entry.setSize(buff.length);
entry.setTime(systime);
CRC32 crc322 = new CRC32();
if(entry.getName().equals(DD_ENTRY)) {
crc322.update(dd);
} else {
crc322.update(buff);
}
entry.setCrc(crc322.getValue());
jos.putNextEntry(newEntry);
if(entry.getName().equals(DD_ENTRY)) {
jos.write(dd,0,dd.length);
} else {
jos.write(buff,0,buff.length);
}
jos.flush();
jos.closeEntry();
}
} catch(Exception e) {
e.printStackTrace();
throw e;
} finally {
try { if(jos!=null) jos.finish(); } catch(Exception e) {}
try { if(jos!=null) jos.close(); } catch(Exception e) {}
try { if(fo!=null) fo.close(); } catch(Exception e) {}
try { if(jarFile!=null) jarFile.close(); } catch(Exception e) {}
}
if(jos!=null) {
System.out.println("\t- rename the "+newJar+" to "+oldJar);
File backup = new File(oldJar.getParentFile(), oldJar.getName()+".org");
if(!backup.exists()) {
boolean result = oldJar.renameTo(backup);
if(!result) {
System.out.println("cannot rename to "+backup);
}
} else {
if(!oldJar.delete()) System.out.println("cannot delete "+oldJar);
}
if(!newJar.renameTo(oldJar)) System.out.println("cannot rename to "+oldJar);
}
}
/**
* ejb jar ÆÄÀÏ¿¡¼ weblogic deployment descriptor¸¦ ã¾Æ DOM Document object·Î
* ¹ÝȯÇÏ´Â ¸Þ¼µå
*
* @param file ejb jar file
* @return weblogic-ejb-jar.xml¿¡ ´ëÇÑ Document object
*/
private Document findEntry(File file) {
JarFile jarFile = null;
try {
jarFile = new JarFile(file);
Enumeration en = jarFile.entries();
while(en.hasMoreElements()) {
JarEntry entry = (JarEntry)en.nextElement();
if(entry.getName().equals(DD_ENTRY)) {
System.out.println("\t- find the entry - "+entry.getName());
InputStream in = jarFile.getInputStream(entry);
Document root = loadDocument(in);
in.close();
return root;
}
}
} catch(Exception e) {
System.out.println(">> "+e.toString());
e.printStackTrace();
} finally {
try { if(jarFile!=null) jarFile.close(); } catch(Exception e) {}
}
return null;
}
/**
* parameterÀÇ InputStreamÀ¸·Î ºÎÅÍ µé¾î¿À´Â xml data¸¦ DOM Document object¸¦ »ý¼ºÇÑ´Ù.
*
* @param in weblogic-ejb-jar.xml¿¡ ÇØ´çÇÏ´Â stream
* @return weblogic-ejb-jar.xml¿¡ ´ëÇÑ DOM Document object
*/
private Document loadDocument(InputStream in) throws Exception {
System.out.println("\t- load the Document ");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setErrorHandler(new DefaultHandler());
Document doc = builder.parse(in);
doc.normalize();
Element root = doc.getDocumentElement();
Node node1 = findNode(root, WEBLOGIC_ENTERPRISE_BEAN);
if(node1 == null) {
System.out.println("cannot find the node. - "+WEBLOGIC_ENTERPRISE_BEAN);
node1 = doc.createElement(WEBLOGIC_ENTERPRISE_BEAN);
root.appendChild(node1);
}
Node node2 = findNode(node1, STATELESS_SESSION_DESCRIPTOR);
if(node2 == null) {
System.out.println("cannot find the node. - "+STATELESS_SESSION_DESCRIPTOR);
node2 = doc.createElement(STATELESS_SESSION_DESCRIPTOR);
node1.appendChild(node2);
}
Node node3 = findNode(node2, POOL);
if(node3 == null) {
System.out.println("cannot find the node. - "+POOL);
node3 = doc.createElement(POOL);
node2.appendChild(node3);
}
Node node4 = findNode(node3, MAX_BEANS_IN_FREE_POOL);
if(node4 == null) {
System.out.println("cannot find the node. - "+MAX_BEANS_IN_FREE_POOL);
node4 = doc.createElement(MAX_BEANS_IN_FREE_POOL);
Text txt = doc.createTextNode("");
node4.appendChild(txt);
node3.appendChild(node4);
}
Node node5 = findNode(node3, INITIAL_BEANS_IN_FREE_POOL);
if(node5 == null) {
System.out.println("cannot find the node. - "+INITIAL_BEANS_IN_FREE_POOL);
node5 = doc.createElement(INITIAL_BEANS_IN_FREE_POOL);
Text txt = doc.createTextNode("");
node5.appendChild(txt);
node3.appendChild(node5);
}
setNodeValue(node5, minSize);
setNodeValue(node4, maxSize);
System.out.println("\t- change min and max size ["+minSize+", "+maxSize+"]");
return doc;
}
/**
* node¿¡ ´ëÇÑ child tag¸¦ ã¾Æ ¹ÝȯÇÏ´Â ¸Þ¼µå
*
* @param node °Ë»ö ±âÁØ node
* @param childNodeName °Ë»öÇÒ child node name
* @return child node
*/
private Node findNode(Node node, String childNodeName) {
NodeList lst = node.getChildNodes();
for(int i=0;i
*
* @param node Node
* @param value º¯È¯ÇÒ °ª
*/
private void setNodeValue(Node node, int value) {
NodeList lst = node.getChildNodes();
Node tmp=null;
for(int i=0;i> "+tmp.getNodeValue());
tmp.setNodeValue(value+"");
}
}
/**
* InputStreamÀ¸·Î ºÎÅÍ ÇØ´ç size ¸¸ÅÀÇ byte¸¦ ÀÐ¾î ¹ÝȯÇÏ´Â ¸Þ¼µå
*
* @param size ÀÐÀ» µ¥ÀÌÅÍ size
* @param in InputStream
* @return ÀÐÀº °á°ú byte array data
*/
private byte[] readData(int size, InputStream in) {
byte[] buff = new byte[size];
try {
int totalSize=0;
do {
int len = in.read(buff,totalSize,size-totalSize);
if(len==-1) {
break;
}
totalSize+=len;
} while(totalSize<size);
return buff;
} catch(Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
}
|
À§ÀÇ ÆÄÀϳ»¿ë¿¡ ´ëÇÑ Á¦¾à»çÇ×À» ¾Ë·Áµå¸³´Ï´Ù.
OS : Platform independent
App Server : WebLogic 6.1 or later
JDK : Sun JDK1.4 or Other
°£´ÜÇÏ°Ô ¾ÆƼŬÀ» ÀÛ¼ºÇß½À´Ï´Ù. XML¿¡ °ü·ÃÇؼ³ª ¾ÐÃ࿣Ʈ¸®¿¡ °ü·ÃÇؼ »ç¿ëµÈ Äڵ嵵
À¯½ÉÈ÷ »ìÆ캸½Ã´Â °ÍÀÌ ÁÁÀ» °Í °°½À´Ï´Ù.
|