스프링 입문 - 회원 서비스 개발
회원 서비스 클래스를 만들어보자.
회원 서비스는, 회원 리포지토리와 도메인을 활용해서 실제 비즈니스 로직을 작성하는 것이다.
service라는 이름으로 패키지를 생성했다.
그리고 여기에 MemberService 라는 이름으로 클래스를 생성했다.
서비스를 작성해 보자.
private final MemberRepository memberRepository = new MemoryMemberRepository();
일단, 회원 서비스를 만들려면, 회원 리포지토리가 있어야 한다.
public Long join(Member member) {
memberRepository.save(member);
return member.getId();
}
그리고, 회원 가입을 만들어보자.
회원가입은 memberRepository에 save()를 호출해주면 된다.
그리고 반환은 임의로 Id를 반환하도록 작성 하겠다.
그런데 회원 가입을 할 때,
비즈니스 로직중에, "같은 이름이 있는 중복 회원은 가입이 안된다." 라는 조건이 있었다.
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
} );
따라서 join메서드에서 save()를 호출하기 전에,
findByName(member.getName()); 을 호출해서 같은 이름이 있는지 확인해야 한다.
result가 Optional로 반환이 되므로,
만약에 result가 null이 아니라 값이 있으면, "이미 존재하는 회원입니다" 라고 던지도록 한다.
ifPresent는 result가 만약에 null이 아니라 값이 있으면 동작하도록 하는 것이다. (result의 반환 타입이 Optional이기 때문에 가능) Optional로 한번 감싸면, Optional안에 객체가 있는 것이다. 그래서 Optional 관련된 여러 메서드를 사용할 수 있게 된다. 그래서 최근에는 null일 가능성이 있는 것은, Optional로 한번 감싸서 반환해 준다.
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
} );
그런데 이 코드처럼 Optional을 바로 반환하는 것은 권장하지 않는다.
memberRepository.findByName(member.getName());
Optional<Member> result = 을 없애면,
이 코드의 반환이 Optional이므로,
여기다가 바로 .ifPresent();가 들어갈 수 있다.
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
} );
그래서 이렇게 수정해서 작성하는 것이 좋다.
그런데, 코드를 봤을 때, 뭔가 로직이 쭉 있으면,
이런 경우에는 메서드로 뽑는게 좋다.
단축키는 ctrl+t (리팩토링 관련된 기능)를 눌러서, method를 검색하면, Extract Method를 찾을 수 있다.
선택하고, 이름을 지정해줘야하는데,
이름은 validateDuplicateMember 라고 지정했다.
그러면 이렇게 메서드로 리팩토링 된다.
이렇게 해두면, 좋은 점은,
"아! join()을 하면, 중복 회원을 검증하고, 통과하면 저장하는구나!"라고 바로 이해할 수 있게 된다.
이번에는 전체 회원을 조회하는 기능도 만들어 보자.
memberRepository의 findAll()을 호출해서 반환한다.
하나만 더 만들어 보자.
memberId로 멤버를 찾는 기능이다.
회원 서비스 클래스를 작성했다.
이제, 회원가입을 했을 때, 중복회원이면 오류가 발생하는지(IllegalStateException)이 터지는지, 검증을 해봐야 한다.
검증하는 방법은 여러가지가 있지만,
제일 좋은 방법은, 테스트 케이스를 활용하는 방법이다.
다음시간에는 회원 서비스 테스트를 해보자.
'Spring' 카테고리의 다른 글
컴포넌트 스캔과 자동 의존관계 설정 (0) | 2022.05.18 |
---|---|
스프링 입문 - 회원 서비스 테스트 (0) | 2022.05.18 |
스프링 입문 - 회원 리포지토리 테스트 케이스 작성 (0) | 2022.05.17 |
스프링 입문 - 회원 도메인과 리포지토리 만들기 (0) | 2022.05.17 |
스프링 입문 - 비즈니스 요구사항 정리 (0) | 2022.05.17 |
댓글
이 글 공유하기
다른 글
-
컴포넌트 스캔과 자동 의존관계 설정
컴포넌트 스캔과 자동 의존관계 설정
2022.05.18 -
스프링 입문 - 회원 서비스 테스트
스프링 입문 - 회원 서비스 테스트
2022.05.18 -
스프링 입문 - 회원 리포지토리 테스트 케이스 작성
스프링 입문 - 회원 리포지토리 테스트 케이스 작성
2022.05.17 -
스프링 입문 - 회원 도메인과 리포지토리 만들기
스프링 입문 - 회원 도메인과 리포지토리 만들기
2022.05.17