[spring입문]회원 관리 예제 - 백엔드 개발 (2)
회원 서비스 개발
회원 가입 및 중복 회원 검증, 회원 조회가 가능한 서비스 개발
회원 서비스
- MemberService
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();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
서비스 클래스는 멤버 클래스보다 뭐랄까 비즈니스 쪽에 가까움. 그렇기 때문에 비즈니스 쪽에 가까운 용어를 써야 매칭이 잘 됨.
서비스는 비즈니스에 의존적으로 설계해야함.
리포지토리는 단순히 기계적으로 개발스럽게 용어들을 선택함. (role에 맞도록 선택)
회원 서비스 테스트
(테스트는 메서드 이름 한글도 가능하다고 함)
기존에는 회원 서비스가 메모리 회원 리포지토리를 직접 생성하게 했다.
public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); }
회원 리포지토리의 코드가 회원 서비스 코드를 DI(의존관계 주입) 가능하게 변경한다.
public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } ... }
회원 서비스 테스트
- MemberServiceTest
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
@Test
public void 회원가입() throws Exception {
//Given
Member member = new Member();
member.setName("hello");
//When
Long saveId = memberService.join(member);
//Then
Member findMember = memberRepository.findById(saveId).get();
assertEquals(member.getName(), findMember.getName());
}
@Test
public void 중복_회원_예외() throws Exception {
//Given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//When
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class,
() -> memberService.join(member2));//예외가 발생해야 한다.
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
}
@BeforeEach : 각 테스트 실행 전에 호출된다. 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존관계도 새로 맺어준다.
@BeforeEach //각 테스트 실행 전에 public void beforeEach(){ memberRepository = new MemoryMemberRepository(); //MemoryMemberRepository를 만들고 memberService = new MemberService(memberRepository); //memberService에 넣어줌. 그러면 같은 MemoryMemberRepository가 사용됨 }
멤버 서비스 입장에서 보면 자기가 직접 이용하지 않고, 멤버 리포지토리를 외부에서 넣어줌.
이런 것을 Dependent Ijection? 암튼 DI라고 함 (의존관계를 주입해주는 것)public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } … }
Author And Source
이 문제에 관하여([spring입문]회원 관리 예제 - 백엔드 개발 (2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ksmlucky/spring회원-관리-예제-백엔드-개발-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)