본문 바로가기
  • Let's study
BackEnd/Java

[Java] 명언 게시판 - FileRepository 적용 / db 분리

by 코딩고수이고파 2026. 7. 28.

인터페이스 도입으로 저장소 교체가 가능하도록 리팩토링

기존에는 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 모드를 사용한다.

댓글