인터페이스 도입으로 저장소 교체가 가능하도록 리팩토링
기존에는 Service가 WiseSayingRepository를 사용하고 있었다.
Service 코드의 수정 없이 WiseSayingFileRepository로 변경하려면 두 Repository의 함수 명과, 파리미터가 같아야 한다.
이를 해결하기 위해 Repository 인터페이스를 도입하였다.
Repository 인터페이스 작성
저장소에서 반드시 제공해야 하는 기능만 인터페이스에 정의하였다.
public interface WiseSayingRepository {
boolean delete(int id);
Optional<WiseSaying> findById(int id);
WiseSaying save(WiseSaying wiseSaying);
List<WiseSaying> findListDesc();
PageDto findByContentContainingIdDesc(String keyword, int pageSize, int page);
PageDto findByAuthorContainingIdDesc(String keyword, int pageSize, int page);
}
FileRepository가 인터페이스 구현
기존의 WiseSayingFileRepository가 인터페이스를 구현하도록 수정하였다.
public class WiseSayingFileRepository implements WiseSayingRepository {
...
}
이제 WiseSayingFileRepository는 인터페이스에 선언된 모든 메서드를 반드시 구현해야 한다.
Service는 인터페이스를 의존하도록 변경
Service는 더 이상 WiseSayingFileRepository를 직접 사용하지 않는다.
WiseSayingRepository wiseSayingRepository = AppContext.wiseSayingRepository;
구현체가 아닌 인터페이스를 참조하기 때문에 어떤 저장소를 사용할지는 AppContext에서 결정한다.
인터페이스를 사용하는 이유
인터페이스를 사용하면 객체를 쉽게 교체할 수 있다.
예를 들어 현재는 파일에 저장하는 WiseSayingFileRepository를 사용하지만
- 메모리에 저장하는 WiseSayingMemoryRepository
- 데이터베이스를 사용하는 WiseSayingDbRepository
를 만들어도 Service 코드는 수정하지 않아도 된다.
즉, Service는 "어떻게 저장하는지"는 몰라도 되고, "저장할 수 있다"는 기능만 알고 사용하면 된다.
이처럼 구현체가 아닌 인터페이스에 의존하도록 만드는 것을 통해 객체 간의 결합도를 낮추고 유지보수성을 높일 수 있다.
🔗 관련 커밋
개발 환경(dev)과 테스트 환경(test) 분리
기존에는 개발 환경과 테스트 환경이 동일한 DB를 사용했다.
이 경우 테스트를 실행하면 실제 개발 데이터가 변경되거나 삭제될 수 있기 때문에, 개발용 DB와 테스트용 DB를 분리하도록 수정했다.
AppConfig 클래스 추가
현재 실행 환경을 관리하는 AppConfig 클래스를 생성하였다.
public class AppConfig {
public static String mode = "dev";
public static void setTestMode() {
mode = "test";
}
public static void setDevMode() {
mode = "dev";
}
public static String getMode() {
return mode;
}
}
mode 값을 통해 현재 실행 중인 환경이 개발(dev)인지 테스트(test)인지 구분할 수 있다.
테스트에서는 test 모드 사용
테스트를 실행하기 전에
AppConfig.setTestMode();
를 호출하면 테스트용 DB를 사용하게 된다.
반대로 일반 프로그램을 실행할 때는
AppConfig.setDevMode();
기본값인 dev 모드를 사용한다.
'BackEnd > Java' 카테고리의 다른 글
| [Java] 명언 게시판 - 파일 기반 Repository 리팩토링 (0) | 2026.07.27 |
|---|---|
| [Java] 명언 게시판 - 파일 저장 및 JSON 직렬화 구현 (0) | 2026.07.26 |
| [Java] 명언 게시판 - 검색 및 페이징 구현 (0) | 2026.07.26 |
| [Java] 명언 게시판 - TDD 적용하기 (0) | 2026.07.23 |
| [Java] 명언 게시판 만들기 - 레이어드 아키텍처 & 리팩토링 (0) | 2026.07.22 |
댓글