들어가기 전에
이번 프로젝트에서 Feed 기능을 구현하기로 했다.
아래와 같은 템플릿을 만들어놓고 일정 신청이 완료되면 해당 정보로 문자열을 치환해서 데이터를 가공해야 했다.
[일정 신청]
OOO님이 2023년 O월 OO일 O요일 20:00로 코칭 일정을 신청했습니다.
참고로 발신인 정보는 닉네임 변경과 같은 사유로 업데이트될 수 있어서 조회할 때 치환해서 보여주기로 하고 날짜 정보에 대한 치환만 했으면 됐는데 어떤 걸 사용하면 좋을까 찾다가 MessageFormat을 사용하기로 했다.
MessageFormat
MessageFormat은 원하는 위치에 지정한 문자열을 삽입할 수 있어서 위의 경우처럼 지정된 Template이 있고 값들만 변경해서 완성된 메시지를 얻고 싶을 때 사용하기에 알맞다.
사용할 때는 아래와 같은 형식으로 패턴을 만들면 된다. date나 time 같은 경우 별도로 패턴화하지 않고 short나 long과 같은 스타일을 활용하면 편하게 원하는 형식으로 변환할 수 있어서 좋을 것 같다.
예제 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 |