| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- jsp
- 깃허브 블로그
- Ajax
- Oracle
- 오라클
- ORA-02292
- MSI
- 전화번호부
- 자바
- spring
- 환경설정
- 순환문
- 백준문제
- ORA-01407
- 티스토리 블로그
- for문
- 무결성 제약조건
- 백준
- 백준문제풀이
- 공부
- 스프링
- 설정
- while
- 인터페이스
- 이클립스
- 이클립스단축기
- 오류모음
- 오류
- 파워서플라이
- 별 찍기
- Today
- Total
danDevlog
[Spring Boot] 회원 관리 예제 - 서비스 개발 / 서비스 테스트 본문
-서비스-
서비스에서는 핵심 비즈니스 로직을 구현한다.
service 패키지 안에 MemberService 클래스를 만들어 구현한다.
public class MemberService {
private final MemberRepository memberRepository;
/**
* 회원 가입
*/
public Long join(Member member) {
// 방식1
// 같은 이름이 있는 중복 회원X
// Optional<Member> result = memberRepository.findByName(member.getName());
// ifPresent 객체가 있으면 람다식 실행, 없으면 아무일도 하지 않음.
// result.ifPresent(m -> {
// throw new IllegalStateException("이미 존재하는 회원입니다.");
// });
// 방식2
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> findMember(){
return memberRepository.findAll();
}
/* 개별 회원 조회 */
public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId);
}
}
구현한 메소드들을 crtl + shift + T 를 누르면 자동으로 테스트 클래스를 생성할 수 있다.
테스트 케이스를 작성할 때
- given (주어진 조건)
- when (검증할 것)
- then (어떻게 되는지)
위 3단계를 거쳐 코드를 작성하면 유용하다.
@Test
void 회원가입() {
//given
Member member = new Member();
member.setName("spring");
//when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
위 테스트를 해보면 잘 실행되지만, 이름이 중복되는 사람의 회원가입을 방지해야 하기때문에 추가로 테스트를 한다.
@Test
public void 중복_회원_예외(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
//then
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// try{
// memberService.join(member2);
// fail("예외가 발생해야 합니다.");
// }catch (IllegalStateException e){
// assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// }
}
try-catch구문보다는 assertThrows 메소드를 사용하는것이 훨씬 간결하고 가독성이 높다.
assertThrows는 첫번째 인자로 발생할 예외 클래스의 class 타입을 받고, 두번째 인자로 람다식을 받는다.
람다식에서 예외가 발생할 경우 Class 타입과 발생한 예외가 같은 타입인지 체크한다.
해당 테스트클래스에서도 마찬가지로 @AfterEach로 초기화를 시켜줘야하는데 MemoryMemberRepositor객체가 존재하지 않는다. 때문에 MemoryMemberRepository 객체를 만들면,
MemoryMemberRepository repository = new MemoryMemberRepository();
@AfterEach
public void afterEach() {
repository.clearStore();
}
하지만 새로 만든 리포지토리는 MemberService의 객체와 다른 인스턴스이다. new로 새로 만들었기 때문이다.
MemberService와 MemberServiceTest 클래스가 서로 같은 인스턴스를 공유하게 만들어야한다.
private final MemberRepository memberRepository;
//바로 new 를 이용해 인스턴스 생성 X
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
//생성자를 이용해 밖에서 주입
MemberService에서는 생성자를 이용해서 밖에서 주입하도록 한다.
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
MemberServiceTest 클래스에서 memberRepository를 주입한다.
이렇게 하면 테스트를 실행할 때마다 각각 MemoryMemberRepository가 생성된다.
MemberService 입장에서 보면 외부에서 MemoryMemberRepository를 주입해줌으로써,
Dependency Injection (DI 의존성 주입) 이 성립한다.
'Spring 입문' 카테고리의 다른 글
| [Spring Boot] 자바 코드로 직접 스프링 빈 등록하기 (0) | 2022.03.26 |
|---|---|
| [Spring Boot] 컴포넌트 스캔과 자동 의존관계 설정 (0) | 2022.03.26 |
| [Spring Boot] 회원 관리 예제 - 회원 리포지토리 테스트 케이스 작성 (0) | 2022.03.22 |
| [Spring Boot] 회원 관리 예제 - 도메인과 리포지토리 만들기 (0) | 2022.03.21 |
| [Spring Boot] 정적 컨텐츠 / MVC와 템플릿 엔진 / API (0) | 2022.03.21 |