주요글: 도커 시작하기
반응형
깔끔한 JSP 코드를 유지하면서 메일을 발송하게 해주는 커스텀 태그를 설계한다.

메일 발송 커스텀 태그의 설계 과정

요즘 대부분의 웹 사이트는 가입된 사실을 알리거나 자사의 정보를 회원에게 알리기 위한 방법으로 메일을 사용하고 있다. 이것은 웹 어플리케이션에 알맞은 메일 발송 모듈을 개발할 필요성을 느끼게 하는 부분이기도 하다. 서블릿이나 JSP와 같이 자바 기반의 웹 어플리케이션의 경우는 Java Mail API를 사용하여 손쉽게 메일을 발송할 수 있다. (요즘 술치되는 대부분의 JSP/서블릿 책은 Java Mail API를 사용하여 메일을 전송하는 것에 대해서 나왔을 것이다.)

웹 어플리케이션에서 메일을 전송할 때는 다음과 같은 세 가지 방법 중에 한가지 방법을 사용하는 것이 일반적이다.

  • JSP에서 스크립트릿을 사용하여 메일을 전송한다.
  • 서블릿에서 메일 전송 후 결과를 보여준다. 모델 2 구조를 사용하여 표현부를 보여줄 수도 있다.
  • 메일 전송 관련 모듈을 개발하여 JSP와 서블릿에서 그 모듈을 사용하여 메일을 전송한다.
하지만, 서블릿에서 메일을 발송하거나 별도의 모듈을 사용하지 않고 JSP 페이지에서 바로 메일을 전송하는 방법의 경우는 스크립트릿이 JSP 페이지에 포함되기 때문에 표현부와 구현부의 분리가 되지 않는다. 반드시 표현부와 구현부를 분리해야 하는 것은 아니지만 JSP를 개발한 목적중의 하나가 표현부와 구현부를 분리하기 위한 것이라는 점을 생각해볼 때 JSP 페이지에서 스크립트릿을 사용하여 메일을 전송하는 것이 그리 올바른 방법은 아닐 것이다.

JSP 1.1 규약은 스크립트릿을 대체할 수 있는 방법으로서 커스텀 태그(Custom tag)를 제시하고 있다. 커스텀 태그는 이름에서 알 수 있듯이 JSP 페이지에서 사용되는 태그이다. 개발자들이 직접 커스텀 태그를 제작하기 때문에, 커스텀 태그는 개발자들이 원하는 어떤 기능도 제공할 수 있으며, JSP 페이지는 추상화된 커스텀 태그를 통해서 구현부를 분리해낼 수 있게 된다.

이 글에서는 JSP 페이지에서 메일을 전송할 때 사용할 수 있는 커스텀 태그를 설계해 볼 것이다. 커스텀 태그가 무엇이며 어떤 인터페이스를 제공하고 있는 지에 대한 내용은 이 글에서 설명하지 않을 것이므로, 그에 대한 내용은 JSP 관련 서적을 참고하기 바란다.

메일 전송 커스텀 태그를 설계하기 이전에 우리는 먼저 메일을 전송할 때 어떤 요소가 필요한지에 대해서 생각해보아야 한다. 이러한 요소에는 받는 사람, 보내는 사람, 메일의 주제, 내용 등이 있으며 이를 바탕으로 가장 간단한 형태의 메일 전송 커스텀 태그를 개발한다면 다음과 같은 형태를 띄게 될 것이다.

  <%
   fromEmail = request.getParameter("from");
   toEmail = request.getParameter("to");
   subject = request.getParameter("subject");
   body = "가입해주셔서 감사합니다.";
  %>
  <javacan:sendMail from="<%= fromEmail %>"
                       to="<%= toEmail %>"
                       subject="<%= subject %>"
                       body="<%= body %>"  />

sendMail 커스텀 태그는 보는 바와 같이 네 개의 속성 from, to, subject, body를 사용하여 메일 발송에 필요한 정보를 취합하고 있다. 위와 같이 sendMaile 커스텀 태그를 설계할 경우의 문제점은 메일의 내용을 변경하기 위해서는 스크립트릿을 사용해야 한다는 점이다. 예를 들면 다음과 같다.

  <%
    body = "먼저 저희 OOO.com에 가입해주셔서 감사드립니다.\n\n"+
           "저희는 "+member.getName()+" 회원님께서 편안하고 안전한 쇼핑을\n"+
           "하실 수 있도록 최선을 다하겠습니다.\n\n"+
           ...
           "..";
  %>

  <javacan:sendMail ... body="<%= body %>"  />
  

위와 같이 스크립트릿을 통해서 메일의 내용을 변경해야 할 경우 단순히 메일의 내용을 변경해야 하는 경우 개발자는 메일의 내용을 변경할 사람에게 스크립트릿이 무엇이며 어떤 부분을 건드려서는 안 된다라는 내용을 알려주어야 한다. 또한, HTML 형태의 메일을 전송해야 하는 경우에는 디자이너와 개발자가 반드시 함께 작업을 해야만 한다. 물론, 자바 스크립트를 익힌 디자이너들도 있지만 그렇다 하더라도 조금이라도 복잡한 부분이 스크립트릿에 나온다면 디자이너들은 수정 작업을 꺼려할 것이다.

그렇다면 메일의 내용을 좀더 간단하게 처리하기 위한 방법은 무엇일까? 정답은 sendMail 커스텀 태그의 몸체를 메일의 내용으로 하는 것이다. 즉, 다음과 같이 말이다.

  <javacan:sendMail from="<%= fromEmail %>"
                       to="<%= toEmail %>"
                       subject="<%= subject %>" >

  먼저 저희 OOO.com에 가입해주셔서 감사드립니다.
  
  저희는 <%= member.getName() %> 회원님께서 편안하고 안전한 쇼핑을
  하실 수 있도록 최선을 다하겠습니다.
  
  ...
  ..
  </javacan:sendMail>
  

위와 같이 변경함으로써 이제 디자이너들은 개발자의 도움없이도 메일 내용을 변경할 수 있을 것이다. 하지만, 표현식이 있는 것은 HTML 태그에만 익숙한 디자이너들에게는 여전히 불만족스러울 것이다. 하지만, 여기서 사용된 표현식은 다음과 같이 자바빈 액션 태그를 사용하면 매우 간단하게 태그형태로 변경할 수 있다.

  <javacan:sendMail from="<%= fromEmail %>"
                       to="<%= toEmail %>"
                       subject="<%= subject %>" >

  먼저 저희 OOO.com에 가입해주셔서 감사드립니다.
  
  저희는 <jsp:getProperty name="member" property="name" /> 회원님께서 편안하고 안전한 쇼핑을
  하실 수 있도록 최선을 다하겠습니다.
  
  ...
  ..
  </javacan:sendMail>
  

이 정도면 됐겠지라고 생각하는 사람들도 있을 것이다. 하지만, 위 코드는 여전히 문제점을 안고 있다. 바로 보내는 사람과 받는 사람 그리고 메일의 주제를 동적으로 정하려면 반드시 표현식을 써야한다는 점이다. 예를 들어, 위 코드는 실제로 다음과 같이 앞 부분에 스크립트릿 코드가 존재한다.

  <%   fromEmail = request.getParameter("from");
   toEmail = request.getParameter("to");
   subject = request.getParameter("subject");
  %>  <javacan:sendMail from="<%= fromEmail %>"
                       to="<%= toEmail %>"
                       subject="<%= subject %>" >

  먼저 저희 OOO.com에 가입해주셔서 감사드립니다.
  
  저희는 <jsp:getProperty name="member" property="name" /> 회원님께서 편안하고 안전한 쇼핑을
  하실 수 있도록 최선을 다하겠습니다.
  
  ...
  ..
  </javacan:sendMail>

여전히 스크립트릿 코드가 존재하는 것을 알 수 있다. 또한, sendMail 태그의 속성인 from, to, subject 의 값 역시 표현식이다. 이러한 스크립트 요소를 가급적 덜 사용하기 위해서는 from, to와 같은 속성값을 sendMail 커스텀 태그에 중첩되는 또 다른 커스텀 태그로 변환하는 것이 좋다. 다음은 그 예이다.

  <javacan:sendMail>
    <javacan:from>madvirus@tpage.com</javacan:from>
    <javacan:to><%= request.getParameter("toEmail") %></javacan:to>
    <javacan:subject>가입을 축하드립니다.</javacan:subject>
    <javacan:body>    먼저 저희 OOO.com에 가입해주셔서 감사드립니다.
    
    저희는 <jsp:getProperty name="member" property="name" /> 회원님께서 편안하고 안전한 쇼핑을
    하실 수 있도록 최선을 다하겠습니다.
    ...
    </javacan:body>
  </javacan:sendMail>

sendMail 태그의 from, to, subject 속성값을 사용할 때 보다는 복잡하지만 이제 보내는 사람을 지정하거나 주제를 지정할 때 표현식이나 일반 텍스트 뿐만 아니라 액션 태그도 사용할 수 있게 되었다. 예를 들어, 받는 사람의 이메일 주소를 다음과 같이 액션 태그를 사용하여 지정할 수도 있을 것이다.

  <javacan:to><jsp:getProperty name="member" property="email" /></javacan:to>

이렇게 속성 대신에 커스텀 태그를 사용함으로써 값을 지정할 때 표현식 대신 HTML 태그와 같은 액션 태그나 커스텀 태그를 사용할 수 있게 된다. 따라서 JSP 페이지에서 스크립트 요소를 좀더 줄일 수 있게 된다.

sendMail 커스텀 태그

지금까지 살펴본 내용을 바탕으로 sendMail 커스텀 태그의 기본 사양을 정의해보자. sendMail 태그의 전체 구성은 다음과 같다.

  <javacan:sendMail smtpServer="localhost" charset="euc-kr" >
     <javacan:from>fromEmail</javacan:from>
     <javacan:to>email1 ; email2 ; email3</javacan:to>
     <javacan:cc>email1 ; email2 ; email3</javacan:cc>
     <javacan:subject>주제</javacan:subject>
     <javacan:body html="true">
     내용
     </javacan:body>
  </javacan:sendMail>

위 태그의 구성만으로도 어느 정도 알 수 있겠지만 각 태그의 의미와 각 태그에서 사용되는 속성에 대해서 하나 하나 살펴보도록 하자.

  • sendMail : 이 태그는 메일 관련 커스텀 태그 중 가장 바깥에 위치하는 태그로서 smtpServer 속성과 charset 속성을 갖고 있다. smtpServer 속성은 메일 전송을 위해 연결할 SMTP 서버의 주소값을 가지며, charset은 메일을 구성하고 있는 텍스트의 캐릭터셋을 나타낸다.

  • from : 보내는 사람의 이메일 주소를 나타낸다. 보내는 사람의 이메일 주소의 형식은 다음과 같이 둘 중 하나를 사용할 수 있다.

    • abc@de.com(name)
    • abc@de.com

  • to : 받는 사람의 이메일 주소를 나타낸다. 여러 개의 이메일 주소를 입력할 수 있으며 각 이메일은 ; 기호를 사용하여 구분한다. 각각의 이메일 주소의 형식은 from 태그와 같다.

  • cc : 참조인의 이메일 주소를 나타낸다. to 태그와 마찬가지로 여러 개의 이메일 주소를 입력할 수 있으며, 이메일 형식 또한 from 태그와 같다.

  • subject : 주제를 입력받는다.

  • body : 본문 내용을 입력받는다. body 태그는 html 속성을 갖고 있는데 html 속성은 본문이 HTML 문서인지 단순 텍스트 인지를 나타낸다. html 속성의 값이 true일 경우 본문의 MIME 타입을 text/html 로 지정하고 false일 경우 text/plain 으로 지정한다.
결론

이번 1부에서는 메일 발송 커스텀 태그인 sendMail 태그를 설계하는 과정을 살펴보았다. 구체적인 구현에 대해서는 살펴보지 않았지만 sendMail 커스텀 태그를 사용함으로써 JSP 페이지에서 메일을 전송하기 위해 사용해야 했던 스크립트 코드가 상당량 줄어들게 되는 것을 알 수 있다. 또한, 커스텀 태그는 스크립트 코드에 비해 구분하기도 쉬우며 배우기도 쉽기 때문에 디자이너들이 어렵지 않게 몸체의 내용을 수정할 수 있게 된다.

다음 2부에서는 sendMail 커스텀 태그를 실제로 어떻게 구현하는 지 자세하게 살펴볼 것이다. 그 전까지 Java Mail API를 이용하여 메일을 전송하는 것에 대한 글을 읽어두면 좀더 쉽게 2부 글을 읽을 수 있을 것이다.

관련링크:

+ Recent posts