인프런 커뮤니티 질문&답변

김현식님의 프로필 이미지
김현식

작성한 질문수

스프링 핵심 원리 - 기본편

주문과 할인 도메인 실행과 테스트

interface와 구현체에서 메서드도 같아야하나요?

작성

·

154

0


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
interface를 생성해야하는 이유는 이해가 됐는데 interface에서 작성한 메서드들을 구현체에서 오버라이딩하는데 이떄 오버라이딩하는 코드 말고 추가적으로 코드를 작성하는게 바람직한가요?

예를들어 repository인터페이스를 구성할 때 Mysql을 이용하기 위한 레포지토리와 Memoryrepository를 따로 구현할 때 아무래도 DB에 저장하는 특성상 메서드들의 차이가 있지않을까하는데 이때 각 구현체에서 추가로 메서드를 작성하는게 옳은 방향인건지 잘 모르겠어요

답변 1

0

안녕하세요. 김현식님, 공식 서포터즈 OMG입니다.

인터페이스로 공통 기능을 추상화할 때는 해당 인터페이스를 구현하여 사용할 클래스들의 공통기능을 큰 틀에서만 잡아놓으면 됩니다. 그리고 디테일한 부분은 추상화한 구현체에서 별도의 메서드들을 작성하면 됩니다.

가령

MemberRepository인터페이스에는

interface MemberRepository {
  save();
  insert();
  select();
}

 

class MySQLMemberRepository {
  save() { 
    // MySQL save 구현
  }
  insert() { .. }
  select() { .. } 
  MySQL에서만 지원하는 기능() { .. }
}

 

class MemoryMemberRepository {
  save() { 
    // MemoryMemberRepositry save 구현
  }
  insert(){ .. }
  select(){ .. }
  MemoryMemberRepository에서만 지원하는 기능() { .. }
}

 

다음과 같이 큰 틀의 기능을 정의해놓고 디테일한 구현과 별도의 구현하는 별도의 클래스에서만 사용하는 클래스들은 해당 클래스에만 구현하여 사용하면 됩니다.

감사합니다.

김현식님의 프로필 이미지
김현식
질문자

여기까지는 이해했는데 지금 DIP와 OCP가 위반되는 사례를 보고있어서 저렇게 코드를 짰을 때 MemberRepository를 불러오는 곳의 코드를 변경해야될 상황이 오지않을까해서 질문드렸습니다.

되는지도 중요하지만 그게 올바른 설계방향인지도 알고싶습니다.

MemberRepository를 불러오는 곳의 코드를 변경해야될 상황이 오지않까해서 질문

이 질문에서 우려하는 상황에 대해 구체적으로 생각하는 바를 설명해주시겠어요? 코드 예시가 있으면 더욱 좋습니다.

불러오는 곳의 코드라고하면 memberRepository를 호출하는 코드 영역 (ex 서비스 로직) 이 될 것 같은데 어떠한 변경을 얘기하시는걸까요?
다음 링크의 영한님의 OCP관련 답변을 참고하여 댓글을 남겨주시면 좋을 것 같습니다.

https://www.inflearn.com/questions/874323/ocp%EC%9D%98-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%A7%88%EB%AC%B8%EC%9D%B4-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4

김현식님의 프로필 이미지
김현식

작성한 질문수

질문하기