λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🌿 Spring

[μž…λ¬Έ] νšŒμ› 관리 예제(2) - service

by nitronium102 2021. 8. 15.

<λͺ©μ°¨>

01. λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­ 정리

02. νšŒμ› 도메인과 λ ˆν¬μ§€ν† λ¦¬ λ§Œλ“€κΈ°

03. νšŒμ› λ ˆν¬μ§€ν† λ¦¬ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±

04. νšŒμ› μ„œλΉ„μŠ€ 개발

05. νšŒμ› μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈ

 

이전 ν¬μŠ€νŒ…μ—μ„œ λ ˆν¬μ§€ν† λ¦¬ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±κΉŒμ§€ μ§„ν–‰ν–ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” 4, 5λ²ˆμ„ μ•Œμ•„λ³΄λ„λ‘ ν•œλ‹€.

 

νšŒμ› 관리 예제(1) - domain, repository, test case

<λͺ©μ°¨> 01. λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­ 정리 02. νšŒμ› 도메인과 λ ˆν¬μ§€ν† λ¦¬ λ§Œλ“€κΈ° 03. νšŒμ› λ ˆν¬μ§€ν† λ¦¬ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„± 04. νšŒμ› μ„œλΉ„μŠ€ 개발 05. νšŒμ› μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈ 01. λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­ 정리 데이터:

dev-minji.tistory.com

 

04. νšŒμ› μ„œλΉ„μŠ€ 개발

μ„œλΉ„μŠ€λŠ” 도메인과 λ ˆν¬μ§€ν† λ¦¬λ₯Ό ν™œμš©ν•΄μ„œ μ‹€μ œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μž‘μ„±ν•˜λŠ” 뢀뢄이닀. λ•Œλ¬Έμ— λ ˆν¬μ§€ν† λ¦¬λ³΄λ‹€ λ”μš± λΉ„μ¦ˆλ‹ˆμŠ€ 의쑴적으둜 섀계해야 ν•œλ‹€.

더보기
더보기
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import java.util.List;
import java.util.Optional;

public class MemberService {
   private final MemberRepository memberRepository = new MemoryMemberRepository();
   // νšŒμ› κ°€μž…
   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();
   }
   
   // id둜 νŠΉμ • νšŒμ› 쑰회
   public Optional<Member> findOne(Long memberId) {
 		return memberRepository.findById(memberId);
   }
}

 

μ˜ˆμ™Έ μΌ€μ΄μŠ€ 처리(쀑볡 νšŒμ› 검증 ν…ŒμŠ€νŠΈ)

정상적인 μΌ€μ΄μŠ€λ„ μ€‘μš”ν•˜μ§€λ§Œ μ˜ˆμ™Έ μΌ€μ΄μŠ€μ— λŒ€ν•œ μ²˜λ¦¬κ°€ 더 μ€‘μš”ν•˜λ‹€.

01. Try-catch μ‚¬μš©

memberService.join(member1);
try {
	memberService.join(member2); //λ‘λ²ˆμ§Έ μ‘°μΈμ‹œμ— μ˜ˆμ™Έκ°€ λ°œμƒν•΄μ•Ό
	fail(); //μ •μƒμ μœΌλ‘œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 경우의 처리
	} catch (IllegalStateException e) {
	//μ˜ˆμ™Έκ°€ μ •μƒμ μœΌλ‘œ λ°œμƒν•œ 경우
	Assertions.assertThat(e.getMessage()).isEqualTo("이미 μ‘΄μž¬ν•˜λŠ” νšŒμ›μž…λ‹ˆλ‹€.");
}

 

02. assertThrow() μ‚¬μš©

memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
Assertions.assertThat(e.getMessage()).isEqualTo("이미 μ‘΄μž¬ν•˜λŠ” νšŒμ›μž…λ‹ˆλ‹€.");

 

05. νšŒμ› μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈ

μœ„μ˜ μ„œλΉ„μŠ€μ—λŠ” 문제점이 μžˆλ‹€. Service와 ServiceTestμ—μ„œ 각각 λ ˆν¬μ§€ν† λ¦¬λ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— μ„œλ‘œ λ‹€λ₯Έ 두 개의 λ ˆν¬μ§€ν† λ¦¬κ°€ μƒμ„±λœλ‹€λŠ” 것이닀. λ¬Όλ‘  μœ„ μ½”λ“œμ—μ„œλŠ” static 속성을 μ‚¬μš©ν–ˆμ§€λ§Œ, λ§Œμ•½ static 속성이 λΉ μ‘Œλ‹€λ©΄, ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„  μ„œλ‘œ λ‹€λ₯Έ λ‘κ°œμ˜ db 에 μ ‘κ·Όν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. λ˜ν•œ ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈμ—μ„œ λ‘κ°œμ˜ 리포지토리λ₯Ό μ΄μš©ν•  수 μ—†λ‹€

 

νšŒμ› μ„œλΉ„μŠ€ μ½”λ“œλ₯Ό DI κ°€λŠ₯ν•˜κ²Œ λ³€κ²½

new둜 μƒˆλ‘œ μƒμ„±ν•˜λŠ” 것이 μ•„λ‹Œ, μ™ΈλΆ€μ—μ„œ 넣어쀄 수 μžˆλ„λ‘(Dependency Injection) μˆ˜μ •ν•˜μ—¬ 같은 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©κ°€λŠ₯ν•˜λ„λ‘ ν•΄μ£Όμ—ˆλ‹€.

/* MemberService.java */
public class MemberService {
   private final MemberRepository memberRepository;
   public MemberService(MemberRepository memberRepository) {
   		this.memberRepository = memberRepository;
   }
   ...
}
/* MemberServiceTest.java */
 MemberService memberService;
 MemoryMemberRepository memberRepository;
 
 @BeforeEach
 public void beforeEach() {
   memberRepository = new MemoryMemberRepository();
   memberService = new MemberService(memberRepository);
 }

@BeforeEachλŠ” 각 ν…ŒμŠ€νŠΈ μ‹€ν–‰ 전에 ν˜ΈμΆœλ˜μ–΄ 항상 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ³ , μ˜μ‘΄κ΄€κ³„도 μƒˆλ‘œ λ§Ίμ–΄μ€€λ‹€
-> ν…ŒμŠ€νŠΈλΌλ¦¬μ˜ 독립성 보μž₯!


- μž‘μ„±ν•œ μ„œλΉ„μŠ€ ν΄λž˜μŠ€μ— μ»€μ„œλ₯Ό λŒ€λ‘œ ctrl+shift+Tλ₯Ό ν•˜λ©΄ ν…ŒμŠ€νŠΈ 클래슀λ₯Ό λ‹¨μΆ•ν‚€λ‘œ 생성할 수 μžˆλ‹€. 

- ν”„λ‘œμ νŠΈκ°€ λΉŒλ“œλ  λ•Œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” ν¬ν•¨λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ©”μ†Œλ“œλͺ…을 ν•œκΈ€λ‘œ 적기도 ν•œλ‹€.

λŒ“κΈ€