Clean Code that Works.

작년에는 스프링을 알고 썼다면, 올해는 이해하고 쓸 수 있도록 하자!!
화이팅!!

봄싹에서 메일 보내는 서비스 클래스 코드를 보면
new 해서 메일을 보내는 것을 확인할 수 있다.

이번에 메일 템플릿을 사용해서 메일을 보낼려고 하는데
이렇게 사용하면, 빈들을 DI 받아서 쓸 수가 없기 때문에 이 클래스를 프로토타입 빈 으로 만들어서 쓰기로 결정.

이 프로토타입 빈을 사용하는 서비스 빈에서는 DI 받아서 사용하지 말고(DI는 빈이 처음 생성될 때 한번만 진행되기 때문에,
프로토타입빈을 매번 똑같은것을 사용하게 됨) DL 받아서 사용하는 방식으로 하자.

기존의 코드(모임에 의견이 달리면 메일을 보내게 되어 있다.)
public void notifyCommentAdded(Meeting meeting, Comment comment) {
        Iterator<Attendance> Iter = meeting.getAttendances().iterator();
        Collection<Member> members = new ArrayList<Member>();
        while (Iter.hasNext()) members.add(((Attendance) Iter.next()).getMember());
        commentNotiService.sendMessage( new CommentMailMessage( comment, meeting, null, members));
    }

여기서 저기 new 하는 부분이 메일 템플릿을 생성하는 것이고, 실제 메일을 보내는것은 commentNotiService가 하게 된다.
여기서 문제점은 CommentMailMessage가 bean이 아니기 때문에,
CommentMailMessage에서 사용할 velocityEngine(벨로시티로 메일보낼때 사용) bean을 주입 받을 수 없다.
뭐 생성자에 추가해서 넘겨주면 되긴 하지만, 사실 저렇게 쓰는거 보다야 Prototype Bean을 만들어서 쓰는것이 좀 더 스프링 답다고 할까?

이 Prototype Bean과 이것을 사용하는 방법은 토비의 스프링3에 보면 잘 나와있다.
여기서는 책에 설명되어 있는것 중에서 Provider<T>를 사용하는 방법으로 bean을 생성해서 사용해 보도록 하자.

결론을 보자면..아래와 같이 되겠다.
@Inject Provider<CommentMailMessage> commentMail;

public void notifyCommentAdded(Meeting meeting, Comment comment) {
  Iterator<Attendance> Iter = meeting.getAttendances().iterator();
        Collection<Member> members = new ArrayList<Member>();
  while (Iter.hasNext()) members.add(((Attendance) Iter.next()).getMember());
  CommentMailMessage mail = commentMail.get();
  mail.setDatas(comment, meeting, null, members);
  commentNotiService.sendMessage( mail);
 }

CommentMailMessage를 빈으로 등록 해주는 것을 잊지 말고, get()해서 사용!!