inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

비즈니스 요구사항 정리

인터페이스 사용 이유

1165

loopy

작성한 질문수 2

0

[질문 내용]
여기에 질문 내용을 남겨주세요.

"아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계"한다고 설명해주셨는데,

save
findById
findByName
findAll

이 메서드들에 대한 실제 구현 코드를 DB가 변경되면 새로 작성하면서 service단에서는 수정할 필요 없도록 인터페이스를 사용해야한다는 뜻인가요?

인터페이스 없이 아래처럼 MemoryMemberRepository2를 새로 작성하고,

public class MemoryMemberRepository {
  save( ... ){ ... }
  findById( ... ){ ... }
  findByName( ... ){ ... }
  findAll( ... ){ ... }
}

// DB가 변경되어 새로 작성한 클래스
public class MemoryMemberRepository2 {
  save( ... ){ ... }
  findById( ... ){ ... }
  findByName( ... ){ ... }
  findAll( ... ){ ... }
}

타입만 MemoryMemberRepository2로 바꿔주면

똑같이 service단에서 별도의 수정 없이 처리할 수 있지 않나요?

public class MemberService {
    private final MemoryMemberRepository2 memberRepository = new MemoryMemberRepository2();

    memberRepository.save(...);
    memberRepository.findById(...);
    ...
}

 

다른 질문에 답변으로 써주신 내용(느슨한 결합 등) 읽어보긴 했는데, 인터페이스의 필요성을 완전히 이해하지 못해서 질문 남깁니다!

java spring mvc interface

답변 1

0

나무늘보

안녕하세요, loopy 님! 공식 서포터즈 codesweaver 입니다.

구현체를 이용할 경우 처음엔 new MemoryMemberRepository(); 와 같이 코드를 사용해야 하고,

구현체가 바뀌면 new MemoryMemberRepository2(); 처럼 코드를 바꿔야 합니다. 변경은 리포지토리에서 발생했으나 이를 사용하는 서비스 단 코드도 변경해야 하는 문제가 있습니다.

이런 문제는 규모가 작은 프로젝트에선 사실 큰 문제가 되지 않습니다. (인텔리제이로 일괄 수정해버리면 사실 3초면 뚝딱!)

 

인터페이스로 의존한 경우 new MemberRepository(); 이와 같은 코드를 사용하게 되는데요, 구현체가 MemoryMemberRepository1 이든 2이든 이를 사용하는 쪽에선 코드를 바꿀 필요가 없습니다. 이런 부분에서 변경에 유연해진다고 할 수 있습니다.

감사합니다.

1

1201ljhun

안녕하세요. 이 글쓴이가 아닌 다른 사람인데, 인터페이스로 의존한 경우에도 결국 서비스단에서 MemberRepository member = new MemoryMemberRepository(); 이런 식으로 사용하게 될 텐데, MemberRepository 인터페이스를 사용하여도 사용하는 DB를 바꾸기 위해서는 결국에는 new... 부분을 바꾸어야 하지 않나요? new MemoryMemberRepository()를 new MemoryMemberRepository1() 으로 바꾼다던가 하는 등의 말이죠...

0

나무늘보

안녕하세요 1201jhun님!

지금 단계에서는 말씀하신 내용이 맞습니다. 추후에 구현객체(지금의 경우 MemoryMemberRepository)를 외부에서 주입하는 방법을 사용하면 비로소 인터페이스를 이용하는 장점이 드러납니다 :)

..

0

87

2

Unused property.....

0

105

2

project JDK is misconfigured

0

142

2

외부 API의 ID 타입(String/UUID)과 내부 도메인의 ID 타입(Long)이 불일치할 때의 설계 정석

0

86

2

단위/통합 테스트 버전충돌 문제

0

92

2

❗️springboot 4.0.2 버전 aspectj dependency 설정❗️

0

238

1

왜 컨트롤러는 변한게 없는데 새로 만든 html 파일이 뜨나요?

0

106

2

윈도우 build test오류 질문

1

105

2

테스트 관련 공부에 대한 조언을 얻고 싶습니다

0

103

2

테스트 실행 시 에러 질문

0

301

1

name을 통한 비교와 객체를 통한 비교

0

77

1

빌드 후 libs 없음

1

134

1

윈도우 gradlew.bat 에러

0

171

1

@PostMapping("/members/new")가 동작하지 않습니다

0

91

1

java static class와 kotlin class

0

83

1

스프링 DB연결

0

129

1

소요 시간

0

89

2

ddl.sql에 빨간 밑줄

1

102

2

welcome page 에러

0

187

3

잘 모르겠습니다.

0

166

2

fail을 똑같이 쳤는데 오류가 발생해요

0

161

2

index.html Welcome page

0

128

1

프로젝트 gradle-groovy ?

0

385

1

테스트코드 메서드명 한글

0

207

2