반응형

java mail API를 이용하여 메일 발송하는 자료를 모으고자 한다.

내용은 추가적으로 계속 업데이트 할 예정임 .. !!!!



Spring 3 환경에서 메일을 발송하는 방법을 조사해봤다. 간단하게 Oracle에서 제공하는JavaMail API를 사용하면 된다. 현재 최신 버전은 1.4.7이며 maven javamail로 구글링하면 mail-1.4.7.jar 파일을 다운로드받을 수 있다.


* 다운로드받은 mail-1.4.7.jar 파일을 프로젝트의 CLASSPATH에 추가한다. 웹 애플리케이션의 경우 /WebContent/WEB-INF/lib 디렉토리에 복사하면 간단하게 끝난다.


* 메일 발송 정보를 저장할 mail.xml 파일을 작성한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bean="http://www.springframework.org/schema/bean"

xsi:schemaLocation="

        http://www.springframework.org/schema/beans 

        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

<bean id="mailSender"

class="org.springframework.mail.javamail.JavaMailSenderImpl">

<property name="host" value="smtp.somemailhost.com" />

<property name="port" value="25" />

<property name="username" value="someuser" />

<property name="password" value="somepassword" />

<prop key="mail.transport.protocol">smtp</prop>

<prop key="mail.smtp.auth">true</prop>

<prop key="mail.smtp.starttls.enable">true</prop>

<prop key="mail.debug">true</prop>

</property>

</bean>

</beans>


* DispatcherServlet 역할을 하는 XML 파일에 아래 내용을 추가한다.

<import resource="mail.xml" />


* 애플리케이션의 @Service 오브젝트에서 사용될 MailService 클래스를 작성한다. 아래는 간단한 예로 첨부 파일 발송, HTML 템플릿 등을 적용하려면 살을 더 붙여야 한다.

@Service("mailService")

public class MailService {

  @Autowired

  private MailSender mailSender;

  

  public void sendMail(String from, String to, String subject, String text) {

    SimpleMailMessage message = new SimpleMailMessage();

    message.setFrom(from);

    message.setTo(to);

    messate.setSubject(subject);

    message.setText(text);

    mailSender.send(message);

  }  

}


* 메일 발송 비즈니스 로직을 수행할 @Service 클래스에서는 아래와 같이 작성한다.

@Service("someService")

public class someService {

  @Autowired

  private MailService mailService;

  

  public void sendMail() {

    mailService.sendMail("from@MailAddress.com", "to@MailAddress.com", "someSubject", "someText");

  }

}


<참고자료>

Send Mail with Spring : JavaMailSenderImpl Example (by Lokesh Gupta)

http://howtodoinjava.com/2013/05/27/send-email-with-spring-javamailsenderimpl-example/


Spring Framework 3.2 Reference Documentation: 26. Email

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mail.html


반응형

'Spring' 카테고리의 다른 글

Spring Transaction #2  (0) 2014.10.01
Spring Transaction #1  (0) 2014.10.01
VO, DTO, DAO  (0) 2013.07.08
domain object에 대한...  (0) 2013.07.08
Spring MultipartResolver  (0) 2013.07.02
반응형
자바 1.2 버전부터 제공되고 있지만 아직 다수의 개발자들이 잘 몰라서 활용을 잘 못하는 기능이 하나 있는데, 그 기능이 바로 쓰레드 단위로 로컬 변수를 할당하는 기능이다. 이 기능은 ThreadLocal 클래스를 통해서 제공되는데, 본 글에서는 ThreadLocal 클래스의 기본적인 사용방법과 활용 방법을 살펴보도록 하겠다.

ThreadLocal이란?

일반 변수의 수명은 특정 코드 블록(예, 메서드 범위, for 블록 범위 등) 범위 내에서만 유효하다.

{
    int a = 10;
    ...
   // 블록 내에서 a 변수 사용 가능
}
// 변수 a는 위 코드 블록이 끝나면 더 이상 유효하지 않다. (즉, 수명을 다한다.)

반면에 ThreadLocal을 이용하면 쓰레드 영역에 변수를 설정할 수 있기 때문에, 특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수 값을 사용할 수 있게 된다. 아래 그림은 쓰레드 로컬 변수가 어떻게 동작하는 지를 간단하게 보여주고 있다.


위 그림에서 주목할 점은 동일한 코드를 실행하는 데, 쓰레드1에서 실행할 경우 관련 값이 쓰레드1에 저장되고 쓰레드2에서 실행할 경우 쓰레드2에 저장된다는 점이다.


ThreadLocal의 기본 사용법

ThreadLocal의 사용방법은 너무 쉽다. 단지 다음의 네 가지만 해 주면 된다.
  1. ThreadLocal 객체를 생성한다.
  2. ThreadLocal.set() 메서드를 이용해서 현재 쓰레드의 로컬 변수에 값을 저장한다.
  3. ThreadLocal.get() 메서드를 이용해서 현재 쓰레드의 로컬 변수 값을 읽어온다.
  4. ThreadLocal.remove() 메서드를 이용해서 현재 쓰레드의 로컬 변수 값을 삭제한다.
  5. 아래 코드는 ThreadLocal의 기본적인 사용방법을 보여주고 있다.

// 현재 쓰레드와 관련된 로컬 변수를 하나 생성한다.
ThreadLocal<UserInfo> local = new ThreadLocal<UserInfo>();

// 로컬 변수에 값 할당
local.set(currentUser);

// 이후 실행되는 코드는 쓰레드 로컬 변수 값을 사용
UserInfo userInfo = local.get();

위 코드만으로는 ThreadLocal이 어떻게 동작하는 지 잘 이해가 되지 않을테니, 구체적인 예제를 이용해서 ThreadLocal의 동작 방식을 살펴보도록 하겠다. 먼저 ThreadLocal 타입의 static 필드를 갖는 클래스를 하나 작성해보자.

public class Context {
    public static ThreadLocal<Date> local = new ThreadLocal<Date>();
}

이제 Context 클래스를 사용해서 쓰레드 로컬 변수를 설정하고 사용하는 코드를 작성할 차례이다. 아래는 코드의 예이다.

class A {
    public void a() {
        Context.local.set(new Date());
       
        B b = new B();
        b.b();

        Context.local.remove();
    }
}

class B {
    public void b() {
        Date date = Context.local.get();

        C c = new C();
        c.c();
    }
}

class C {
    public void c() {
        Date date = Context.local.get();
    }
}

위 코드를 보면 A, B, C 세 개의 클래스가 존재하는데, A.a() 메서드를 호출하면 다음 그림과 같은 순서로 메서드가 실행된다.


위 그림에서 1~10은 모두 하나의 쓰레드에서 실행된다. ThreadLocal과 관련된 부분을 정리하면 다음과 같다.
  • 2 - A.a() 메서드에서 현재 쓰레드의 로컬 변수에 Date 객체를 저장한다.
  • 4 - B.b() 메서드에서 현재 쓰레드의 로컬 변수에 저장된 Date 객체를 읽어와 사용한다.
  • 6 - C.c() 메서드에서 현재 쓰레드의 로컬 변수에 저장된 Date 객체를 읽어와 사용한다.
  • 9 - A.a() 메서드에서 현재 쓰레드의 로컬 변수를 삭제한다.
위 코드에서 중요한 건 A.a()에서 생성한 Date 객체를 B.b() 메서드나 C.c() 메서드에 파라미터로 전달하지 않는다는 것이다. 즉, 파라미터로 객체를 전달하지 않아도 한 쓰레드로 실행되는 코드가 동일한 객체를 참조할 수 있게 된다.

ThreadLocal의 활용

ThreadLocal은 한 쓰레드에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해 주기 때문에 쓰레드와 관련된 코드에서 파라미터를 사용하지 않고 객체를 전파하기 위한 용도로 주로 사용되며, 주요 용도는 다음과 같다.

  • 사용자 인증정보 전파 - Spring Security에서는 ThreadLocal을 이용해서 사용자 인증 정보를 전파한다.
  • 트랜잭션 컨텍스트 전파 - 트랜잭션 매니저는 트랜잭션 컨텍스트를 전파하는 데 ThreadLocal을 사용한다.
  • 쓰레드에 안전해야 하는 데이터 보관

이 외에도 쓰레드 기준으로 동작해야 하는 기능을 구현할 때 ThreadLocal을 유용하게 사용할 수 있다.

ThreadLocal 사용시 주의 사항

쓰레드 풀 환경에서 ThreadLocal을 사용하는 경우 ThreadLocal 변수에 보관된 데이터의 사용이 끝나면 반드시 해당 데이터를 삭제해 주어야 한다. 그렇지 않을 경우 재사용되는 쓰레드가 올바르지 않은 데이터를 참조할 수 있다.

 

반응형
반응형

J2EE(Java 2 Platform, Enterprise Edition) 스펙

이 주제에서는 WebSphere® Application Server에 대한 응용프로그램 프로그래밍 모델의 기초가 되는 J2EE(Java™ 2 Platform, Enterprise Edition) 스펙에 대해 설명합니다. WebSphere 프로그래밍 모델 확장은 J2EE 프로그래밍 모델을 확장함으로써 값을 추가합니다. 이 주제에서 J2EE 런타임 환경과 J2EE 응용프로그램 패키징 및 전개 부분을 비롯한 핵심적인 J2EE 개념에 대한 간략한 개요를 읽어 보십시오.

J2EE(Java 2 platform, Enterprise Edition) 스펙은 엔터프라이즈 응용프로그램 개발, 전개 및 실행을 위한 표준입니다. 궁극적인 정보 소스는 Sun Microsystems, Inc.의 웹 사이트 http://java.sun.com에서 사용 가능한 스펙입니다. WebSphere Application Server 문서는 편의상 링크와 J2EE 설명을 제공합니다.
빠른 참조: 1차 J2EE 1.4 스펙
  • Java Servlet 스펙 2.4
  • JavaServer Pages 스펙 2.0
  • Enterprise JavaBeans™ 스펙 2.1
  • Enterprise JavaBean - CORBA 맵핑 1.1
  • RMI/IIOP
  • Java IDL API
  • J2EE용 웹 서비스 버전 1.1
  • SAAJ(SOAP with Attachments API for Java) 스펙 1.2
  • JAX(Java API for XML) 처리 스펙 1.2
  • JAX(Java API for XML) 레지스트리 스펙 1.0
  • JAX(Java API for XML) 기반 RPC 스펙 1.1
  • JDBC 스펙, 3.0, 2.1 및 선택적 패키지 API(2.0)
  • Java 커넥터 아키텍처(JCA) 1.5
  • Java Message Service 스펙 1.1
  • JavaMail API 스펙 1.3
  • Java Authorization Contract for Containers 1.0
  • JNDI(Java Naming and Directory Interface) 스펙 1.2.1
  • JTA(Java Transaction API) 스펙 1.0.1B
  • Java 트랜잭션 서비스 스펙 1.0
  • JAF(JavaBean Activation Framework) 스펙 1.0.2

호환 가능한 Java IBM® WebSphere Application Server, 버전 6.1은 완전한 J2EE 인증 테스트 수행을 완료했습니다. 이 제품은 모든 J2EE 1.4 API를 지원합니다. http://java.sun.com/j2ee/compatibility.html에서 Sun Microsystems가 제공하는 J2EE 호환 가능 제품의 목록을 확인할 수 있습니다.

Java 2 Platform, Enterprise Edition은 복수 층의 서버 기반 응용프로그램을 설계, 개발 및 전개하는 모든 부분에 적용되는 표준을 정의합니다. J2EE 스펙이 정의하는 표준 아키텍처는 다음 요소로 구성됩니다.
  • 복수 층의 응용프로그램 개발용 표준 응용프로그램 모델
  • 응용프로그램 호스팅용 표준 플랫폼
  • J2EE 플랫폼 제품이 J2EE 플랫폼 표준을 준수하는지 여부를 확인하는 데 필요한 호환성 테스트 수행
  • J2EE 플랫폼의 운영적인 정의를 내리는 참조사항 구현

J2EE 플랫폼 스펙에서는 J2EE 응용프로그램의 런타임 환경을 설명합니다. 이 환경에는 응용프로그램 컴포넌트, 컨테이너 및 자원 관리자 드라이버가 포함되어 있습니다. 이 환경 요소는 지정된 표준 서비스 세트와 통신합니다. 자세한 정보는 쓰리 티어 아키텍처의 내용을 참조하십시오.

J2EE 플랫폼 역할

J2EE 플랫폼은 또한 응용프로그램 개발 및 전개 라이프 사이클 동안 수행되는 많은 고유 역할을 정의합니다.
  • 제품 프로바이더는 J2EE 플랫폼, API 및 기타 J2EE 스펙에 정의된 기능을 설계하고 제공합니다.
  • 도구 프로바이더는 응용프로그램 컴포넌트를 J2EE 스펙의 일부로서 개발 및 패키징하는 데 사용하는 도구를 제공합니다.
  • 응용프로그램 컴포넌트 프로바이더는 웹 컴포넌트, 엔터프라이즈 Bean, 애플릿 또는 응용프로그램 클라이언트를 작성하여 J2EE 응용프로그램에서 사용합니다.
  • 응용프로그램 어셈블러는 컴포넌트 프로바이더가 개발한 컴포넌트 세트를 받아 EAR(Enterprise Archive) 파일 형식으로 어셈블합니다.
  • 전개자는 엔터프라이즈 응용프로그램을 J2EE 플랫폼 제품에 일치하는 특정 운영 환경으로 전개를 담당합니다.
  • 시스템 관리자는 응용프로그램이 실행되는 운영 환경을 담당합니다.

제품 프로바이더와 도구 프로바이더는 제품의 핵심입니다. 응용프로그램 컴포넌트 프로바이더 및 응용프로그램 어셈블러는 응용프로그램에서 핵심입니다. 전개자 및 시스템 관리자는 플랫폼 특정 아티팩트가 있는 J2EE 응용프로그램의 제공 및 플랫폼 런타임에 초점을 둡니다.

이 역할은 관련된 타스크 및 사람을 식별하도록 돕습니다. J2EE 응용프로그램을 개발하고 전개할 때 선택할 접근 방법을 결정하도록 도울 수 있기 때문에 이러한 역할 분리를 이해하는 것이 중요합니다.

이 제품 문서에서 사용되는 역할에 대한 정보는 WebSphere Application Server에 대한 빠른 경로 부분을 참조하십시오.

J2EE 장점

J2EE 스펙은 고객에게 응용프로그램을 구매하거나 개발할 때 투자 보호를 보장하기 위해 사용할 수 있는 표준을 제공합니다. 알기 쉬운 독립적인 호환성 테스트를 통해 벤더가 J2EE 표준을 준수하고 있음이 확인됩니다.

J2EE 준수 아키텍처 전개의 일부 장점은 다음을 포함합니다.
  • 표준 컴포넌트, 서비스 및 클라이언트에 기초하는 단순화된 아키텍처. 아키텍처는 한 번 쓰기(write-once), 어느 위치에서나 실행(run-anywhere) Java 기술을 최대화합니다.
  • 믿을 만한 비즈니스 트랜잭션을 위한 JDBC(Java DataBase Connectivity), JMS(Java Message Service), JCA(Java Connector Architecture), Java IDL(Java Interface Definition Language), JavaMail API 및 Java Transaction API(JTA 및 JTS).
  • 예를 들어 다중 시스템에 컨테이너를 분배하고 데이터베이스 연결 풀링을 사용하는 요구를 충족하는 확장성
  • 응용프로그램 개발 도구와 표준 솔루션을 제공하는 벤더 컴포넌트 최상의 선택
  • 단일 사인온(SSO) 지원을 제공하는 융통성 있는 보안 모델, 레거시 보안 설계와 통합 및 응용프로그램 컴포넌트 보안에 대한 일관된 접근 방법

J2EE 스펙은 많은 공헌자가 있는 산업 전반에 걸친 노력의 결과입니다. IBM은 80 퍼센트가 넘게 J2EE API를 정의했습니다.

제품의 프로그래밍 모델에 대한 설명은 WebSphere 응용프로그램에 대해 학습: 개요 및 새로운 기능의 내용을 참조하십시오.

응용프로그램 컴포넌트 및 컨테이너

J2EE 프로그래밍 모델에는 Application Server에 있는 이런 유형의 컨테이너에 상주하는 응용프로그램 컴포넌트 유형이 네 가지 있습니다.
  • 엔터프라이즈 Bean - EJB(Enterprise JavaBeans) 컨테이너를 사용하여 실행
  • Servlets 및 JavaServer Pages 파일 - 웹 컨테이너가 실행
  • 응용프로그램 클라이언트 - 응용프로그램 클라이언트 컨테이너가 실행

제품 아키텍처의 설명에 대해서는 제품 아키텍처의 내용을 참조하십시오.

J2EE 컨테이너는 응용프로그램 컴포넌트의 런타임 지원을 제공합니다. J2EE 응용프로그램에는 각 응용프로그램 컴포넌트 유형에 대해 하나의 컨테이너가 있어야 합니다. 응용프로그램 컴포넌트와 서비스 세트 사이에 컨테이너가 존재함으로써 J2EE 스펙은 응용프로그램 컴포넌트용 API의 연합된 보기를 제공할 수 있습니다.

컨테이너는 서비스에 액세스하기 위해 사용되는 응용프로그램 컴포넌트에 API를 제공합니다. 또한 컨테이너는 보안, 자원 풀링, 상태 관리, 이름 및 트랜잭션 문제를 다룰 수 있습니다.

표준 서비스

J2EE 플랫폼은 컴포넌트에 서로 상호작용할 수 있도록 사용할 수 있는 표준 서비스 세트를 제공합니다. 각 표준 서비스에 대한 설명은Sun 제품 웹 페이지의 내용을 참조하십시오.

J2EE 패키징

assembly 프로세스 중, J2EE컴포넌트는 모듈로 패키지화되었습니다. 모듈은 응용프로그램으로 패키지화되었습니다. Application Server에 응용프로그램을 전개할 수 있습니다. 각 모듈과 응용프로그램에는 J2EE 전개 설명자가 포함되어 있습니다. 전개 설명자는 응용프로그램을 전개하기 위한 명령어를 제공하는 XML 파일입니다.특정 제품의 자세한 정보는 어셈블링 응용프로그램을 참조하십시오.


출처



반응형

+ Recent posts