[spring입문]회원 관리 예제 - 백엔드 개발 (2)

20936 단어 SpringSpring

회원 서비스 개발

회원 가입 및 중복 회원 검증, 회원 조회가 가능한 서비스 개발

회원 서비스

  • 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;
    }}

좋은 웹페이지 즐겨찾기