부모 클래스에 알고리즘의 골격인 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에서 정의하는 것이다. 이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있다. 상속과 오버 라이딩을 통한 다형성으로 문제를 해결하는 것 Spring Batch의 AbstractJob 추상 클래스 Spring Batch에 Job 인터페이스를 구현한 AbstractJob 추상 클래스와 그 하위 구현체들은 템플릿 메서드 패턴을 기반으로 구현되어 있다. 위의 구조를 설명하자면, AbstractJob 추상 클래스에는 doExecute() 추상 메서드가 있고, execute() 메서드에서 doExecute() 메서드를 실행한다. 그리고 doExecute() 추상 메서드는 하위 구현체인 Si..
지난 몇 개월 동안 인스타그램 API를 활용해서 사내의 콘텐츠 서비스와 연동하는 작업을 진행했었고, 약 한 달간의 QA를 끝으로 실제 서비스에 배포하게 되었다. 워낙 큰 작업을 진행했었기 때문에 대규모 단위의 배포를 진행했었다. 사전에 꼼꼼하게 점검하고, 놓친 부분이 없는지 다시 점검한 후에 실 서비스에 배포했지만, 불과 2시간 만에 ConnectionAcquireTimeoutError가 발생했다. 문제 배포를 하고 나서 직접 기능들을 사용해 봤을 때는 문제가 없었다. 하지만 2시간 후에 원인을 알 수 없는 에러로 인해 전체 서비스에 장애가 발생하게 되었다. 우선 Error로그를 파악해봤는데, 특정 시점부터 아래와 같은 Error 로그가 지속적으로 발생하게 되었다. 굉장히 당황스러웠고, 뭐부터 해야 할지..
사내 프로젝트를 진행하다가 테스트 코드를 작성하던 도중 두 객체의 값은 같았는데, 다르다는 에러가 계속해서 발생하게 되었다. 그래서 equals()를 재정의 하지 않아서 발생했던 문제라고 인식하게 되었고, equals()와 hashcode()를 재정의해서 문제를 해결했다. 여기서 끝이 아니라 equals()와 hashcode()를 왜 같이 재정의해야 하는지 간단히 정리하려고 한다. equals()는 언제 정의해야 할까?객체를 기준으로 예를 들자면, equals()는 두 개의 객체가 있고, 두 객체의 값의 동등성을 비교할 때 사용한다. hashcode()는 언제 정의해야 할까?equals()만 재정의 한다고 해서 객체의 값이 동등하다고 할 수는 없다. 객체의 값이 동등하다고 하더라도 해시 값은 다를 수 있..