Home
>
Spring
>
๐[Spring] ์์กด์ฑ ์ฃผ์
(Dependency Injection)์ ํตํ ๋์จํ ๊ฒฐํฉ(Loose Coupling) ์ ์ง.
Spring
Framework
๐[Spring] ์์กด์ฑ ์ฃผ์
(Dependency Injection)์ ํตํ ๋์จํ ๊ฒฐํฉ(Loose Coupling) ์ ์ง.
- ์๋์ ์ฝ๋์์
@Autowired
๋ก MemberService
ํด๋์ค์ ์์ฑ์์ MemberRepository
์ธํฐํ์ด์ค๋ฅผ ์ฃผ์
๋ฐ๋ ์ด์ ๋ ์์กด์ฑ ์ฃผ์
(Dependency Injection) ์ ํตํด ๋์จํ ๊ฒฐํฉ(Loose Coupling) ์ ์ ์งํ๊ธฐ ์ํฉ์
๋๋ค.
- ์ด๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ์์ ๋งค์ฐ ์ค์ํ ์์น ์ค ํ๋๋ก, ํด๋์ค ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ด๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค.
1๏ธโฃ ์ ์ฒด ์ฝ๋.
// MemberRepository
import com.devkobe.hello_spring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
// MemoryMemberRepository
import com.devkobe.hello_spring.domain.Member;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.springframework.stereotype.Repository;
@Repository
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore() {
store.clear();
}
}
// MemberService
import com.devkobe.hello_spring.domain.Member;
import com.devkobe.hello_spring.repository.MemberRepository;
import com.devkobe.hello_spring.repository.MemoryMemberRepository;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
/*
* ํ์ ๊ฐ์
*/
public Long join(Member member) {
validateDuplicateMember(member); // ์ค๋ณต ํ์ ๊ฒ์ฆ
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
});
}
/*
* ์ ์ฒด ํ์ ์กฐํ
*/
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
2๏ธโฃ ๊ตฌ์ฒด์ ์ธ ์ด์ .
-
1. ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ ์ฐ์ฑ ํ๋ณด.
-
MemberRepository
๋ ์ธํฐํ์ด์ค๋ก, MemoryMemberRepository
์ ๊ฐ์ ๊ตฌํ์ฒด๋ค์ด ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ํตํด
MemberService
๋ ํน์ ๊ตฌํ์ฒด์ ์์กดํ์ง ์์ผ๋ฉฐ, MemberRepository
์ธํฐํ์ด์ค์ ์์กดํ๊ฒ ๋ฉ๋๋ค.
- ์ด๋
MemberService
๊ฐ MemoryMemberRepository
๋ ๋ค๋ฅธ MemberRepository
๊ตฌํ์ฒด(JdbcMemberRepository
, JpaMemberRepository
๋ฑ)์ ์ฝ๊ฒ ๊ต์ฒด๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ์ ํํ๊ณ ์ถ๋ค๋ฉด,
MemoryMemberRepository
๋์ ์๋ก์ด ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
ํ๋ฉด ๋ฉ๋๋ค.
-
2. ๋์จํ ๊ฒฐํฉ.
-
MemberService
๋ MemberRepository
์ธํฐํ์ด์ค์๋ง ์์กดํ๊ธฐ ๋๋ฌธ์, ์ด๋ค ๊ตฌํ์ฒด๊ฐ ์ค์ ๋ก ์ฌ์ฉ๋ ์ง๋ ์คํ๋ง ์ปจํ
์ด๋๊ฐ ๊ฒฐ์ ํฉ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด
MemberService
๋ ๊ตฌํ์ฒด๊ฐ ๋ฌด์์ธ์ง ์ ํ์๊ฐ ์์ผ๋ฏ๋ก, ๊ตฌํ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ MemberService
๋ฅผ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
- ์ด ๋ฐฉ์์ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
- ์๋ก์ด ์ ์ฅ์ ๋ฐฉ์์ด ๋์
๋๋๋ผ๋, ๊ธฐ์กด ๋น์ฆ๋์ค ๋ก์ง์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
-
3. ์คํ๋ง์ ์์กด์ฑ ์ฃผ์
๋ฉ์ปค๋์ฆ ํ์ฉ.
- ์คํ๋ง์ ์๋์ผ๋ก
@Autowired
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ MemberRepository
๊ตฌํ์ฒด๋ฅผ ์ฐพ์ ์ฃผ์
ํฉ๋๋ค.
-
MemoryMemberRepository
ํด๋์ค์ @Repository
์ ๋
ธํ
์ด์
์ด ๋ถ์ด ์๊ธฐ ๋๋ฌธ์, ์คํ๋ง ์ปจํ
์ด๋๋ ์ด ํด๋์ค๋ฅผ MemberRepository
ํ์
์ ๋น์ผ๋ก ์ธ์ํ๊ณ ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
- ์คํ๋ง์
MemberRepository
์ธํฐํ์ด์ค ํ์
์ ๋น์ ์ฃผ์
ํด์ผ ํ๋ ๊ฒฝ์ฐ, ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค ์ค ํ๋๋ฅผ ์ ํํด ์ฃผ์
ํฉ๋๋ค.
- ์ด ์์ ์์๋
MemoryMemberRepository
๊ฐ ์ฃผ์
๋ฉ๋๋ค.
3๏ธโฃ ๊ฒฐ๋ก .
- ์ด๋ฌํ ์ค๊ณ๋ ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ํ
์คํธ ์ฉ์ด์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ,
MemberService
๋ ํน์ ๊ตฌํ์ฒด์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ๋ค์ํ ํ๊ฒฝ์์ ์ฌ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๋ํ, ์ด๋ ์คํ๋ง์ DI ์์น์ ๋ฐ๋ผ, ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ณํ์ ์ ๋์ํ ์ ์๋๋ก ์ค๊ณํ๋ ๋ฐฉ๋ฒ์
๋๋ค.