본문 바로가기
Java

[Java] MessageFormat

by soro.k 2023. 5. 27.

들어가기 전에

이번 프로젝트에서 Feed 기능을 구현하기로 했다.

Prototype UI

 

아래와 같은 템플릿을 만들어놓고 일정 신청이 완료되면 해당 정보로 문자열을 치환해서 데이터를 가공해야 했다.

[일정 신청]
OOO님이 2023년 O월 OO일 O요일 20:00로 코칭 일정을 신청했습니다.

 

참고로 발신인 정보는 닉네임 변경과 같은 사유로 업데이트될 수 있어서 조회할 때 치환해서 보여주기로 하고 날짜 정보에 대한 치환만 했으면 됐는데 어떤 걸 사용하면 좋을까 찾다가 MessageFormat을 사용하기로 했다.

 

 

MessageFormat

MessageFormat은 원하는 위치에 지정한 문자열을 삽입할 수 있어서 위의 경우처럼 지정된 Template이 있고 값들만 변경해서 완성된 메시지를 얻고 싶을 때 사용하기에 알맞다.

 

사용할 때는 아래와 같은 형식으로 패턴을 만들면 된다. date나 time 같은 경우 별도로 패턴화하지 않고 short나 long과 같은 스타일을 활용하면 편하게 원하는 형식으로 변환할 수 있어서 좋을 것 같다.

출처 : https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/text/MessageFormat.html

 

예제 1. 여러 FormatType 적용

/* 출처
 : https://docs.oracle.com/en/java/javase/17/docs/api/java.base/
 java/text/MessageFormat.html
*/

public static void main(String[] args) {
    int planet = 7;
    String event = "a disturbance in the Force";
    String template = 
        "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.";

    System.out.println(MessageFormat.format(template, planet, new Date(), event));
}

출력 결과

At 오후 4:09:44 on 2023. 5. 27., there was a disturbance in the Force on planet 7.
  • template 내에 0, 1, 2로 순서를 지정하고 순서에 맞게 파라미터를 지정한다.
  • new Date() 하나로 시간과 날짜 정보를 활용했다.

 

 

예제 2. FormatStyle 적용

public static void main(String[] args) {
    String templateWithShort = "오늘은 {0, date, short}입니다.";
    String templateWithLong = "오늘은 {0, date, long}입니다.";

    System.out.println(MessageFormat.format(templateWithShort, new Date()));
    System.out.println(MessageFormat.format(templateWithLong, new Date()));
}

출력 결과

오늘은 23. 5. 27.입니다.
오늘은 2023년 5월 27일입니다.

 

 

프로젝트 적용

나는 템플릿에 원하는 정보를 삽입했어야 했는데 아래와 같이 Enum 클래스와 Manager 클래스를 생성해서 원하는 결과를 만들 수 있었다.

 

 

1. Enum 클래스 생성

필요한 메시지 템플릿을 만든다.

public enum MessageTemplate {

    CREATE_SCHEDULE("%s님이 {0}로 코칭 일정을 신청했습니다."),
    REQUEST_CANCEL_SCHEDULE("%s님이 {0} 코칭 일정 취소 요청을 보냈습니다."),
    CONFIRM_CANCEL_SCHEDULE("%s님이 {0} 코칭 일정 취소 요청을 확인했습니다."),
    UPDATE_SCHEDULE("%s님이 {0}에서 {1}로 코칭 일정을 변경했습니다.")
    ;

    private String template;

    MessageTemplate(String template) {
        this.template = template;
    }

    public String getTemplate() {
        return template;
    }
}

 

2. ScheduleEventManager 생성

원하는 위치에 문자열을 삽입하고 가공한 데이터로 원하는 DTO 객체를 생성했다.

@Component
public class ScheduleEventManager {

    private final MessageUtil messageUtil;

    public ScheduleEventManager(MessageUtil messageUtil) {
        this.messageUtil = messageUtil;
    }

    public ScheduleEventDto createByScheduleDetails(ScheduleEventDetails schedule, String template) {
        String convertedDateTime = messageUtil.convertToString(schedule.getScheduleDateTime());

        String message = MessageFormat.format(template, convertedDateTime);

        return new ScheduleEventDto(
            schedule.getSenderId(),
            schedule.getReceiverId(),
            message
        );
    }
    
    ...
}

 

'Java' 카테고리의 다른 글

[Java] Enum이 철벽치는 방법  (0) 2024.11.15
[Java] Object.clone()  (0) 2023.03.04
[Java] Object.hashCode()와 Hashing, 그리고 Hash Collision  (3) 2023.02.20
[Java] Object.equals()  (0) 2023.02.14
[Java] Socket에 관하여  (0) 2023.02.08