[Spring Boot] 스프링부트 (IntelliJ)/Spring boot
[Spring Boot] DI (의존성 주입, Dependency Injection)
류도토리
2024. 2. 27. 16:04
DI는 코드 간의 의존 관계를 관리하기 위한 디자인 패턴이다.
회원관리를 예를 들어 설명을 하자면,
MemoryMemberRepository에는 기본적인 기능 (가입, 전체조회, ID로 검색, Name으로 검색 등등)
MemberService에는 그 외에 비즈니스적인 기능(부가적인 기능)을 작성한다고 한다.
부가적인 기능을 이용할 때는 기본적인 기능을 이용할 때가 많다.
예를 들면 기본적인 기능에는 회원 정보가 저장되는 기능이 있다면
부가적인 기능에는 사용자가 입력한 내용이 중복확인이나 조건을 거쳐 모든 조건에 충족이 된다면
회원정보가 저장되는 기능이 작동하는 것이다.
회원 정보가 저장되는 기본적인 기능
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
전체적인 회원가입 기능
public Long join(Member member) {
// 같은 이름이 있는 중복 회원X
validateDuplicateMember(member); // 중복 회원 검증
memberRepository.save(member); // 중복회원이 아니면 저장됨
return member.getId();
}
회원가입 기능을 보면 기본적인 기능인 save가 쓰이는 것을 알 수 있다.
이런 것과 비슷한 느낌으로 Test시에도 사용되는 것을 볼 수 있다.
MemoryMemberRepository를 사용 할 때 테스트와 서비스에서 둘 다 만들어 사용하게되면 서로 다른 데이터를 다룰 가능성도 있기 때문에 아래 처럼 생성하여 주입하여 사용하는 것이 좋다.
아래는 Test파일에서 생성하여 MemberService에 주입하여 주는 것을 볼 수 있다.
memberServiceTest
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach(){
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
memberService
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
이렇게 memberRepository가 만들어진다면
1. 재사용성이 좋다.
2. 코드의 유연성이 향상된다.
3. 낮아진 결합도로 테스트 용이성이 좋아진다.
4. 코드의 가독성이 향상된다.