최근 프로젝트에서 날짜와 시간 데이터를 처리하는 데 있어 특정 라이브러리에 강하게 의존하는 것이 아닌, 유연하고 확장 가능한 방식을 찾아보았습니다. 이를 위해 인터페이스와 클래스를 활용하여 날짜 포맷팅 시스템을 설계하였습니다. 이 글에서는 DateProvider 인터페이스와 이를 구현한 DayjsDateProvider 클래스를 통해 어떻게 날짜 포맷팅 로직을 추상화하고 유연성을 높일 수 있는지 설명하겠습니다.
- DateProvider: 날짜 데이터를 문자열로 변환하는 책임을 정의하는 인터페이스입니다.
- DayjsDateProvider: DateProvider를 구현하여 Dayjs 라이브러리를 사용하는 구체적인 클래스를 나타냅니다.
- DateTimeUtil: DateProvider를 사용하여 날짜 포맷팅을 수행하는 클래스입니다.
이 다이어그램은 시스템의 구조를 이해하는 데 도움이 되며, 각 클래스에 대한 자세한 설명을 제공하겠습니다.
DateTimeUtil 클래스 (기존 코드)
먼저, 원래의 DateTimeUtil 클래스는 다음과 같이 작성되었습니다.
import dayjs, { Dayjs } from 'dayjs';
export class DateTimeUtil {
static toString(localDateTime: Dayjs): string {
return localDateTime.format();
}
}
이 코드에서는 dayjs라는 특정 라이브러리에 강하게 의존하게 되어 유연성이 떨어지는 문제가 발생했습니다. 날짜 포맷팅을 dayjs에 의존하지 않도록 변경할 필요성을 느꼈습니다.
DateProvider 인터페이스
DateProvider는 날짜 및 시간 데이터를 문자열로 변환하는 책임을 가지는 인터페이스입니다. toString 메서드는 localDateTime을 받아 이를 문자열로 변환하는 역할을 합니다.
// DateProvider 인터페이스 정의
export interface DateProvider {
toString(localDateTime: Date): string; // Date 객체를 받아 문자열로 변환
}
- 타입: localDateTime 타입을 any로 설정하여, 이 인터페이스를 확장하는 클래스마다 구체적인 타입이 달라질 수 있도록 하였습니다. 이는 다양한 날짜 라이브러리를 사용하더라도 통합된 인터페이스를 통해 작업할 수 있게 설계된 것입니다.
- 역할: 날짜 변환 로직을 추상화하여 특정 라이브러리와의 의존성을 줄이는 역할을 합니다.
DayjsDateProvider 클래스
DayjsDateProvider 클래스는 DateProvider 인터페이스를 구현한 클래스입니다. 이 클래스는 Dayjs 라이브러리의 Dayjs 타입을 받아 이를 format() 메서드를 사용해 문자열로 변환합니다.
// DayjsDateProvider 클래스
import dayjs from 'dayjs';
export class DayjsDateProvider implements DateProvider {
toString(localDateTime: Date): string {
return dayjs(localDateTime).format(); // Date 객체를 Dayjs로 변환 후 포맷
}
}
- 역할: Dayjs 라이브러리의 Dayjs 객체를 처리하는 역할을 하며, 날짜 변환 방식이 Dayjs에 맞춰져 있습니다.
DateTimeUtil 클래스
설명:
DateTimeUtil 클래스는 DateProvider 인터페이스를 주입받아 날짜 데이터를 포맷하는 역할을 합니다. dateProvider는 외부에서 주입받기 때문에, 이 클래스는 특정 날짜 라이브러리에 의존하지 않고 다양한 날짜 포맷팅 방법을 사용할 수 있습니다.
// DateTimeUtil 클래스
export class DateTimeUtil {
private readonly dateProvider: DateProvider;
constructor(dateProvider: DateProvider) {
this.dateProvider = dateProvider; // 주입된 DateProvider 인스턴스 저장
}
// Date 객체를 받아 포맷팅하여 문자열로 변환
formatDate(localDateTime: Date): string {
return this.dateProvider.toString(localDateTime);
}
// 현재 날짜와 시간을 Date 객체로 반환하는 메서드
getCurrentDateTime(): Date {
return new Date(); // 현재 날짜와 시간을 Date 객체로 반환
}
}
- 역할: 날짜 변환의 구체적인 구현(포맷팅 방식)은 DateProvider에 위임하고, DateTimeUtil 클래스는 그 추상화된 변환 로직을 사용하는 역할을 수행합니다.
전체 코드
아래는 위에서 설명한 모든 클래스를 포함한 전체 코드입니다!
// DateProvider 인터페이스 정의
export interface DateProvider {
toString(localDateTime: Date): string; // Date 객체를 받아 문자열로 변환
}
// DayjsDateProvider 클래스
import dayjs from 'dayjs';
export class DayjsDateProvider implements DateProvider {
toString(localDateTime: Date): string {
return dayjs(localDateTime).format(); // Date 객체를 Dayjs로 변환 후 포맷
}
}
// DateTimeUtil 클래스
export class DateTimeUtil {
private readonly dateProvider: DateProvider;
constructor(dateProvider: DateProvider) {
this.dateProvider = dateProvider; // 주입된 DateProvider 인스턴스 저장
}
// Date 객체를 받아 포맷팅하여 문자열로 변환
formatDate(localDateTime: Date): string {
return this.dateProvider.toString(localDateTime);
}
// 현재 날짜와 시간을 Date 객체로 반환하는 메서드
getCurrentDateTime(): Date {
return new Date(); // 현재 날짜와 시간을 Date 객체로 반환
}
}
전체 흐름 요약
- DateProvider: 날짜 데이터를 문자열로 변환하는 책임을 정의하는 인터페이스입니다.
- DayjsDateProvider: DateProvider를 구현한 클래스이며, Dayjs 라이브러리의 날짜 객체를 문자열로 변환하는 구체적인 로직을 담고 있습니다.
- DateTimeUtil: DateProvider를 주입받아 포맷팅을 수행하는 클래스입니다. DateTimeUtil은 날짜 포맷팅 방식에 대해 알 필요가 없으며, DateProvider를 통해 유연하게 다양한 방식의 날짜 변환을 수행할 수 있습니다.
이러한 구조를 통해 날짜 포맷팅 로직을 유연하게 변경할 수 있도록 설계할 수 있었습니다. 이는 특정 라이브러리에 강하게 의존하지 않으면서도, 필요에 따라 다른 라이브러리로 쉽게 변경할 수 있는 장점을 제공합니다.
'Framework > Nest.js' 카테고리의 다른 글
[NestJS] OAuth2.0 소셜 로그인 (Kakao, Google) 세션 관리 구현 (1) | 2024.12.23 |
---|---|
Nestjs 프로젝트에서 Swagger 사용하기 (0) | 2024.08.30 |