public class Model {
private LocalDateTime createdAt;
private LocalDateTime modifiedAt;
public Model() {
this.createdAt = new LocalDateTime();
this.modifiedAt = new LocalDateTime();
}
public boolean isModified() {
return this.createdAt.isBefore(this.modifiedAt);
}
}
createdAt
과 modifiedAt
이 같은 값을 가질까?
그건 아무도 모른다. 소스상으로 한 줄의 차이가 있지만 실제로는 그 사이에 많은 명령어가 수행된다. 이는 값의 차이를 일으킬 수 있다.
new Model().isModified();
false
를 반환하길 원하지만 true
를 반환할 수도 있다. 항상 true
를 반환하는 게 아니라 그럴 수도 있고 아닐 수도 있다는 것이다. 사람을 미치게 하는 부분이다.
이 글을 적는 이유는 회사에서 똑같은 일을 겪었기 때문이 아니다. 다시 말한다, 호텔 뷔페에서 즐겁게 회식하고 있었는데 장애 이슈를 전달받아 급히 사무실로 복귀하게 되어 적는 게 아니다. 로컬 테스트와 CI를 교묘하게 통과하고 QC에 의해 발견된 버그를 여러분에게 알리고자 적는 것이다. 그것도 배포된 지 3일 뒤에야 발견되었다. 잠복기 바이러스 같이 무서운 코드다.
나중에 똑같은 일로 야근하지 않아야 할 내 자신과 여러분에게 도움이 되길 바라며 글을 마친다.