오류 발생 가능한 코드
- 코드만 보면 오류가 없어보이는 코드입니다.
DateTime birthday = new DateTime(2016,1,1);
if(birthday == DateTime.Today)
{
var client = new WebClient();
var message = client.DownloadString("http://...");
Console.WriteLine(message);
Console.WriteLine("{0:yyyy/MM/dd}, 생일 축하.", DateTime.Today);
}
- 아래 상황에서 날짜 확인 시점과 출력할 때 시점이 달라서 오류가 발생할 수 있습니다.
- 다른 서버에 접속하는 경우 서버가 느리면 시차가 발생하여 시간 차이가 수십 초가 발생하여 오류 발생할 수 있습니다.
```
- 다른 서버에 접속하는 경우 서버가 느리면 시차가 발생하여 시간 차이가 수십 초가 발생하여 오류 발생할 수 있습니다.
- 현재 날짜가 생일인지 확인한다.(생일 당일 오후 11시 59분 55초)
- 생일이라면 다음 처리를 실행한다. (생일 당일 오후 11시 59분 55초)
- 메시지를 다운로드한다.(생일 당일 오후 11시 59분 55초)
- 10초 기다린다.
- 메시지를 출력한다. (생일 다음날 0시 0분 5초)
- 날짜와 함께 '생일 축하.'메시지가 출력된다. (생일 다음날 0시 0분 5초)
개선 코드1
- DateTime.Today를 변수에 초기화하면, 날짜 확인 시점과 출력할 때 시점이 동일해집니다.
- 완벽한 코드는 없다는 말이 있듯이, 아래 코드에는 이슈가 될 수 있는 부분이 존재합니다.
- 생일이 지난 후에 생일 축하 메시지가 출력될 수 있습니다.
DateTime birthday = new DateTime(2016,1,1);
DateTime today = DateTime.Today;
if(birthday == today)
{
var client = new WebClient();
var message = client.DownloadString("http://...");
Console.WriteLine(message);
Console.WriteLine("{0:yyyy/MM/dd}, 생일 축하.", today);
}
개선 코드2
- 날짜가 다음 날로 바뀌기 10분 전부터 생일일 가능성이 있다고 예측해서 그 날 자정에 메시지를 출력하도록 수정합니다.
DateTime birthday = new DateTime(2016,1,1);
DateTime today1 = DateTime.Today;
if(today1 > birthday.AddMinutes(-10) && today1 < birthday.AddDays(1))
{
var client = new WebClient();
var message = client.DownloadString("http://...");
DateTime today2 = DateTime.Today;
if (birthday == today2)
{
Console.WriteLine(message);
Console.WriteLine("{0:yyyy/MM/dd}, 생일 축하.", today2);
}
}
정리
- 네트워크 통신에서 지연은 당연히 발생합니다.
- 초 단위로 정확한 날짜를 측정하는 것은 의미가 없습니다.
개선코드1
의 방법이 간단하면서도 문제가 발생할 가능성이 낮습니다.- 하지만 상황에 따라 정확한 날짜를 측정을 위해서라면
개선코드2
의 방법을 사용하는게 좋습니다.
'프로그래밍 > (도서)C#코딩의기술-실전' 카테고리의 다른 글
[C#] 코딩의기술(실전편) - 2.5 Checked 키워드 (0) | 2022.03.31 |
---|---|
[C#] 코딩의기술(실전편) - 2.3 Format 메서드 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.7 예외처리 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.6 강제 종료 처리 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.5 비동기 처리 (0) | 2022.03.31 |