inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

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

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

219

김현식

작성한 질문수 4

0


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

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

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

spring 객체지향

답변 1

0

OMG

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

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

가령

MemberRepository인터페이스에는

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

 

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

 

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

 

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

감사합니다.

0

김현식

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

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

1

OMG

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

코드 자료

0

45

2

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

55

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

76

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

91

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

81

1

테스트 속도가 나중에 영향이 있을까요?

0

77

1

gradle 설정 안떠서 질문 남깁니다!

0

121

2

build.gradle로 프로젝트를 여는 이유

0

86

1

provider 사용하는 이유

0

89

1

다음 강의 뭘 들어야 할까요

0

126

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

66

1

beanB

0

82

2

퀴즈다시풀기

0

68

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

92

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

67

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

106

2

도메인의 정의?

0

59

1

ApplicationContext 질문입니다.

0

63

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

89

2

ai api 선정하기 관련 질문

0

118

2

생성자 자동주입 관련해서

0

65

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

97

2

Spring에서 SessionScope와 RequestScope는 함께 사용되나요?

1

65

1

12:25

0

79

2