티스토리 뷰

반응형

Spring에서 제공되는 Email 발송을 위한 Class 사용 시 xxx.xml 경로 지정 방법


보통 개발 할때 applicationContext-velocityengine-mail.xml 내용을 아래와 같이 사용하게 됩니다.

 
 




          
          
          
                      
                            
                  true            
                   
              
          
      


      
      
   
   
   
      
         
            resource.loader=class
            class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
         
      
   



이러한 방법은 WAS에서 Spring으로 개발된 WAR파일 을 Loading할때는 문제가 없습니다.


문제는 WAR로 Packaging 되었을때와 그렇지 않을때 applicationContext-velocityengine-mail.xml 파일을 수동으로 

찾고자 할때 발생하게 됩니다.


보통 아래 예제처럼 사용 하는것 같습니다. 해외 Site에서도 이와 관련된 질문들이 많더군요.

  ApplicationContext  ctx = 
     new ClassPathXmlApplicationContext(new String[] {"classpath:applicationContext-velocityengine-mail.xml"});
       	    	        	
  setMailSender( (JavaMailSender)ctx.getBean("mailSender") );
  setVelocityEngine((VelocityEngine)ctx.getBean("velocityEngine") );

위 방법으로 사용하게 됩니다. WAS에 Deploy 할때 WAR파일이 풀려 있는 상태에서만 사용가능 합니다.

즉 xxx.war로 된 압축파일로 사용 할때는 Email 발송 시 Exception이 발생 하게 됩니다. 

주원인은 ClassPathXmlApplicationContext(new String[] {"classpath:applicationContext-velocityengine-mail.xml"});

문장에서 발생 하며, applicationContext-velocityengine-mail.xml 파일을 찾지 못하기 때문입니다.


이는 WAR 파일로 압축되었을때 와 WAR파일을 압축을 풀어서 Deploy할때 WAS에서 해당 Context의 시작점을 다르게 보기 때문입니다.



WAR로 압축된 상태에서 Deploy할때는 아래와 같이 사용 합니다.

  ApplicationContext  ctx = 
     new ClassPathXmlApplicationContext(new String[] {"classpath:../applicationContext-velocityengine-mail.xml"});
       	    	        	
  setMailSender( (JavaMailSender)ctx.getBean("mailSender") );
  setVelocityEngine((VelocityEngine)ctx.getBean("velocityEngine") );

그러나 이러한 방법은 사실 좋은 방법이라고 볼수가 없습니다. 두가지 방법을 공통화 해서 사용해야 하나,

2가지 형태로 관리해야 한다는 것이 좀 모순 이지요.


설명드린 방법은 통상적인 방법이면서 이미 WAS에 의해 Deploy 되었을때 Loading되는 XML 을 또다시 별도로 불러들이는 

방식으로 이러한 방법을 사용하지 말고 좀더 효율적인 방법이 있습니다.


즉 이미 Loading되어 있는 XML정보를 사용하는 방법 입니다. 즉 Context를 통해 이미 loading된 정보를 사용하는 방법으로

Spring의 구조 상 DWR로 동작하는 Class에서와 Controller Class에서 사용 할때 조금 다르게 사용해야 합니다.


DWR에서의 사용 예

   
   WebContext wctx = WebContextFactory.get();
	
   JavaMailSender mailSender = (JavaMailSender)wctx.getContainer().getBean("mailSender");
   VelocityEngine velocityEngine = (VelocityEngine)wctx.getContainer().getBean("velocityEngine");

Controller에서의 사용 할때는 이미 Spring에 의해 전달받아 사용되기 때문에 

MultiActionController Class를 상속받은 Controller에서만 사용 가능 하다.

   	
   JavaMailSender mailSender = (JavaMailSender)this.getApplicationContext().getBean("mailSender");
   VelocityEngine velocityEngine = (VelocityEngine)this.getApplicationContext().getBean("velocityEngine");

반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함