저는 원래 파이썬 개발자였답니다.

나는 처음에 파이썬 개발에 많은 관심을 가지고 있었다. 그러다보니 물흐르듯이 작성할 수 있는 파이썬 문법을 많은 부분 좋아하게 되었는데 대표적인 부분이 String 포매팅이었다. 자바에서는 파이썬만큼 읽기도 쉽고, 유지보수도 쉬운 방법을 찾을 수가 없었다.

가령 다음과 같이 메일 텍스트 포매팅을 지정한다고 해보자.

안녕하세요. 이정한 님!

주문하신 물품이 판매자의 재고부족으로 인해서 주문 취소 처리 되었습니다.
불편을 드려 죄송합니다.

위와 같은 템플릿으로 10명의 구매자에게 메일을 보내기 위해 각각 테스트를 포매팅한다고 하면,파이썬으로는 아래와 같이 할 수 있을 것이다.

buyerList = [ '이정한', ....]
mailTextTemplate= '''
안녕하세요. {buyer} 님!

주문하신 물품이 판매자의 재고부족으로 인해서 주문 취소 처리 되었습니다.
불편을 드려 죄송합니다.
'''
for buyer in buyerList:
  mailText = mailTextTemplate.format(buyer=buyer)
  mailClient.send(mailText)

메일 텍스트를 분리 할 수 있기 때문에 로직을 보면 무슨 일을 하는지 깔끔하게 알 수 있고, 메일 텍스트 템플릿만 봐도 수정하기가 어렵지 않다. 파라메터가 어디에 들어갈지, 무엇이 들어가는지 눈에 딱 보인다. 그리고 내가 자바에서 진행했던 방법은 아래와 같다. 2가지가 존재한다.

String.foramt을 이용한 방법
public class MailService {

    private MailClient mailClient;

    public MailService(MailClient mailClient) {
        this.mailClient = mailClient;
    }

    private static String mailTextTemplate =
        "안녕하세요. %s 님!\n\n" +
        "주문하신 물품이 판매자의 재고부족으로 인해서 주문 취소 처리 되었습니다.\n\n" +
        "불편을 드려 죄송합니다.";

    public static void sendMail(List<String> buyerList) {
        List<String> buyerList = ImmutaibleList.of("이정한", ...);
        for(String buyer : buyerList) {
            String mailText = String.format(mailTextTemplate, buyer);
            mailClient.sendMail(mailText);
        }
    }
}

일단 여기서 가장 마음에 안든건 mailTextTemplate에서 String concat을 하고 있다는 것. 자바가 여러줄 문자열을 지원하지 않는 것이 가장 큰 한계이지만, 이것 때문에 텍스트 파일로 뺼 수도 없고.. 그리고 파이썬 코드와는 비교도 안되게 코드가 길어졌다. 물론 mailClient 의존성이 파이썬에서 표현이 안된 부분은 있지만, 이 부분은 자바가 파이썬 보단 로우레벨에 가까우니 넘어가자. 그렇다 치고 %s보단 {}가 사용하기가 좋아서 이 리터럴을 사용하는 방법도 있는지 찾아봤다.

private static String mailTextTemplate =
        "안녕하세요. {0} 님!\n\n" +
        "주문하신 물품이 판매자의 재고부족으로 인해서 주문 취소 처리 되었습니다.\n\n" +
        "불편을 드려 죄송합니다.";
...
String mailText = MessageFormat.format(mailTextTemplate, buyer);

일단 좋긴 한데 파라메터가 추가/삭제 되면 나중에 순서 맞추는 게 헷갈릴 것 같다. key, value쌍으로 넣어줄 순 없을까? MessageFormat의 javadoc에서는 살펴보니 무조건 인덱스 int값으로만 세팅이 가능할 것 같다. 하지만 이렇게 하면 중간에 데이터를 끼워 넣을 때도 뒤 순서는 다 맞춰서 다시 만들어야 한다. 수정이 다소 귀찮아진다. 무엇보다 이쪽 클래스가 점점 커질 때 템플릿과 메소드를 왔다 갔다 하면서 맞추는 것도 쉽지 않다. 가장 좋은 것은 파이썬과 같은 방법으로 파라메터를 이름으로 셋팅 할 수 있는 방법이 가장 좋을 것 같은데, 자바에서 가장 적당한 방법은 아직 찾지 못했다.

Tags:

Categories:

Updated: