๐ณ ํ์ Service ๊ฐ๋ฐ
ํ์๊ฐ์ ์์ ์
@Service
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
// ํ์๊ฐ์
public Long join(Member member){
Optional<Member> result = memberRepository.findByName(member.getName())
result.ifPresent(m -> {
throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
});
return member.getId();
}
โช @Service ์ด๋ ธํ ์ด์ ์ ํตํด ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋๋ค
โช ifPresent()~ ๋ก์ง์ด ๊ณ์ ๋์ค๋ ๊ฒฝ์ฐ์๋ ๋ฉ์๋๋ก ๋ฝ์์ฃผ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค!
โช ํ์ ์๋น์ค์์ ์ง์ MemoryMemberRepository๋ฅผ ์์ฑํ๋ ์ํฉ
โช Optional <member>.ifPresent๋ก ๊น๋ํ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ (ifPresent ↔ null์ด ์๋ ๊ฐ์ด ์๋ค๋ฉด)
ํ์๊ฐ์ ์์ ํ
@Service
public class MemberService {
// -> MemberService, MemberServiceTest๊ฐ ๊ฐ์ Repo๋ฅผ ์ฐ๊ฒ ํ๊ธฐ์ํ ์์
// 1. new ์ญ์
private final MemberRepository memberRepository;
// 2. MemberRepository๋ฅผ ์ง์ ์์ฑํ๋๊ฒ์ด ์๋, ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์์
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// ํ์๊ฐ์
public Long join(Member member){
// ๊ฐ์์ด๋ฆ ์ค๋ณตํ์์ ์๋จ
validateDuplicateMember(member); // ์ค๋ณต ํ์ ๊ฒ์ฆ
memberRepository.save(member);
return member.getId();
}
// extracted method
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
});
}
โช .ifPresent() ๋ก์ง์ด ๋ค์ด๊ฐ ๋ถ๋ถ์ validateDuplicateMember ๋ฉ์๋๋ก ์ถ์ถ
โช MemberRepository ํ์ ์๋น์ค์์ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋, ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์์
์ด๊ฑด MemberService์์ ์์ฑํ ๋ ํฌ์งํ ๋ฆฌ์ MemberServiceTest์์ ์์ฑํ ๋ ํฌ์งํ ๋ฆฌ๊ฐ ๋ค๋ฅธ ์ธ์คํด์ค๊ฐ ๋๋ ๋ฌธ์ ๋ฐ์์ ๋ง๊ธฐ ์ํจ์ด๋ค.
→ ์ง๊ธ์ ๊ฐ์ฒด๊ฐ static์ผ๋ก ์ ์ธ๋์ด์๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ new๋ฅผ ํตํด ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํด๋ ๊ด์ฐฎ์ง๋ง, static ์ ์ธ์ด ์๋๋ผ๋ฉด ๋ค๋ฅธ DB๊ฐ ๋๋ ์ํฉ์ด๋ผ ๋ฌธ์ ๋ฐ์!
→ MemberServiceTest Class์์ @BeforeEach๋ฅผ ํตํด memberRepository๋ฅผ ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ, ์ด๊ฒ์ DI(Dependency Injection) ๋ผ๊ณ ํ๋ค.
์ ์ฒด ํ์, ํน์ ํ์ ์กฐํ
// ์ ์ฒดํ์ ์กฐํ
public List<Member> findMembers(){
return memberRepository.findAll();
}
// id๋ก ํน์ ํ์ ์กฐํ
public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId);
}
โช Service๋ join, findMembers์ ๊ฐ์ด ๋น์ฆ๋์ค์ ๊ฐ๊น๊ฒ ๋ค์ด๋ฐ ํด์ฃผ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
repository ↔ ๋จ์ํ ๊ธฐ๊ณ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์๋ค ๋นผ๋ ์ญํ
service ↔ ๋น์ฆ๋์ค๋ฅผ ์ฒ๋ฆฌํ๋ ์ญํ
๊ฐ์์ ์ญํ ์ ๋ง๊ฒ ๋ค์ด๋ฐ์ ํด์ฃผ์!
๐ณ ํ์ Service ํ ์คํธ
@BeforeEach
public void beforeEach(){
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach(){
memberRepository.clearStore();
}
โช @BeforeEach : ๊ฐ ํ ์คํธ ์คํ ์ ์ ํธ์ถ
→ ํ ์คํธ๊ฐ ์๋ก ์ํฅ์ด ์๋๋ก ํญ์ ์๋ก์ด ๊ฐ์ฒด ์์ฑ
→ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ฃผ์ ์์ผ์ ์์กด๊ด๊ณ๋ ์์ฑ ↔ ์๊น ๋งํ๋ DI
โช @AfterEach : ๊ฐ ํ ์คํธ ์คํ ํ์ ํธ์ถ
→ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ์คํธ๊ฐ ๊ฒน์น์ง ์๋๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ ๋น์์ฃผ๊ธฐ
ํ์๊ฐ์ ํ ์คํธ
@Test
void ํ์๊ฐ์
() {
// ์ค๋ณต๊ฒ์ฌ๋ฅผ ํด์ ์์ธ๊ฐ ํฐ์ง๋์ง๋ ์ ํ์ธํด์ผํจ -> ์ค๋ณต๊ฒ์ฌ ๋ฉ์๋๋ ์์ฑ
// given
Member member = new Member();
member.setName("hello");
// when
Long saveId = memberService.join(member);
// ์ฐ๋ฆฌ๊ฐ ์ ์ฅํ๊ฒ repository์ ์๋ ๋ด์ฉ์ธ์ง ํ์ธํ๊ณ ์ถ์ ๊ฒฝ์ฐ
// -> ๋ ํฌ๋ฅผ ๊บผ๋ด์ผํจ
// then
Member findMember = memberService.findOne(saveId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}
์ค๋ณต๊ฒ์ฌ ํ ์คํธ
@Test
public void ์ค๋ณต_ํ์_์์ธ(){
// given
Member member1 = new Member();
member1.setName("springg");
Member member2 = new Member();
member2.setName("springg");
// when
memberService.join(member1);
// then
// 2. ์ ๊ณตํ๋ ๊ธฐ๋ฅ <-> lambda ํจ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
IllegalStateException e = assertThrows(IllegalStateException.class,
() -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
// 1. try-catch๊ตฌ๋ฌธ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
// try{
// memberService.join(member2);
// fail();
// } catch(IllegalStateException e){
// assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
// }
}
์์ธ ํ ์คํธ์ด๋ฏ๋ก, try-catch ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง
๋๋คํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ ์ ํธํ์ ๋ค๊ณ ํ๋ค.
์๋ฃ ์ถ์ฒ
์ธํ๋ฐ - ์คํ๋ง ์ ๋ฌธ ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์ (๊น์ํ)