간단한 회원 기능을 구현 및 테스트를 완료하였고, 이제 간단한 로직을 구현한다!
hello-spring -> src -> main -> java -> hello.hellospring에서 service 이름의 패키지를 만들고 MemberService 클래스를 만든다.
이 곳에서 회원 서비스 기능을 작성하는 것이다.
import ...
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// 회원 가입
public Long join(Member member) {
validateDuplicateMember(member); // 중복 회원 검증 함수
memberRepository.save(member); // 중복하는 회원이 없으면 저장
return member.getId(); // 임의로 member id 반환
}
private void validateDuplicateMember(Member member) { // 중복 회원 검증 함수
memberRepository.findByName(member.getName())
.ifPresent(m -> { // member 객체의 name이 이미 존재하는 name이라면...
throw new IllegalStateException("이미 존재하는 회원입니다."); // 오류!
});
}
// 전체 회원 조회
public List<Member> findMembers() {
return memberRepository.findAll(); // 이전에 만들었던 함수 실행
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId); id로 객체를 가져
}
}
위의 코드가 회원 서비스의 비즈니스 로직 부분이다!
이제 Test를 구현해보겠다.
선생님께서 test의 중요성을 말씀해 주셨는데, 단순한 코드면 모르겠지만 코드가 몇 만라인 넘어가고 하면 test가 정말 중요하다고 하였다. 같이 작업하는 사람들 간에도 중요한 커뮤니케이션 일 것이라고!!
hello-spring -> src -> test -> java -> hello.hellospring 에 service 패키지를 만들고, 클래스 MemberServiceTest를 만든다
Test 작성 방식은 다음과 같다!
Given : 입력 값이 주어지면
When : 어떤 상황에서
Then : 이렇게 결과가 나올 것이다.
다음 포인트 단어를 생각하여 test를 작성하면 원활할 것이라고 말씀해 주셨다.
import ...
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
// Test가 끝날 때마다 실행
@AfterEach
public void afterEach() {
memberRepository.clearStore(); // List<Member> 초기화
}
// Test 실행 전마다 실행
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository(); // 객체 생성 -> List<Member>를 초기화하기 위해 필요! MemoryMemberRepository()에 List<Member>을 오버라이딩하였기 때문...
memberService = new MemberService(memberRepository); // 객체 생성
}
@Test
void 회원가입() { // 한글로 입력해도 가능 -> 한 눈에 이해하기 쉬움
// given
Member member = new Member();
member.setName("hello");
// when
Long saveId = memberService.join(member); // 함수 리턴값을 ID(Long 타입)으로 설정하였음
// then
Member findMember = memberService.findOne(saveId).get(); // 회원 ID를 입력하여 member 객체를 받아옴
assertThat(member.getName()).inEqualTo(findMember.getName()); // 만든 객체의 name과 함수로 받아온 객체의 name과 같은 경우 Check
}
@Test
public void 중복_회원_예외() { // test는 예외 상황을 test하는 것이 중요(Point)
// 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));
// 오류 메시지가, "이미 존재하는 회원입니다." 이면 Check
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
다음과 같이 입력하면 회원 서비스의 비즈니스 로직과 테스트를 구현한 것이다!
아직 DB를 설정하지 않은 상태라 프로그램 자체에서 저장되는 형태인 것 같다
DB까지 지정하고 설정한다면 매우 복잡해질 것 같다
테스트의 aseert 문법이 많이 어려운 것 같다..
오류 상황도 지정해야하고, 람다함수도 잘 모르는 상태라 그런 것 같다
이렇게 이번주 강의 내용은 이것으로 끝이다!
다음 주도 화이팅!
'Spring Boot(스프링 부트)' 카테고리의 다른 글
Spring Boot(스프링 부트) > 정적 컨텐츠 vs. MVC vs. API (4) | 2024.11.09 |
---|---|
자바 기초 문법 및 웹 이해 (10) | 2024.11.05 |
Spring Boot > 세션과 쿠키 (0) | 2024.05.28 |
Spring Boot(스프링 부트) > 백엔드 개발(회원 관리 예제) (5) | 2024.05.28 |
Spring Boot(스프링 부트) > 스프링 웹 개발(정적 컨텐츠, MVC와 템플릿 엔진, API) (4) | 2024.05.20 |