회원 서비스는 회원 Repository와 Domain을 활용하여 비즈니스 로직을 작성하는 부분이다. 우선 [Service]라는 패키지를 만들고, 하위에 [MemberService]라는 클래스를 생성합니다.
회원 서비스를 만드려면 우선적으로 회원 Repository가 있어야 한다. MemoryMemberRepository는 MemberRepository 인터페이스를 implement한 것이기 때문에 가능하다.
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
}
먼저 회원 가입 비즈니스 로직을 작성한다. 같은 이름인 회원은 포함하지 않겠다는 비즈니스 로직을 구현하기 위해서는 추가되는 member의 name이 repository에 있는지 확인해야 한다.
그러므로 Optional로 감싼 Member 타입의 result에 findByName 메서드 실행 결과를 담는다. 있을 수도 없을 수도 있기 때문이다.
만약 result가 ifPresent라면(동일한 이름이 있다면) try-catch 문처럼 throw하면 된다.
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
/**
* 회원 가입
*/
public Long join(Member member) {
// 같은 이름인 중복 회원 x
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.")
});
memberRepository.save(member);
return member.getId();
}
}
하지만 코드를 좀 이쁘게 하기 위해서는 다음과 같이 수정할 수 있다.어차피 Optional 형태로 값이 있든 없든 result에 저장된다. 그러므로 memberRepository.findByName(member.getName())에 바로 ifPresent를 걸어버려도 상관 없다.
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
/**
* 회원 가입
*/
public Long join(Member member) {
// 같은 이름인 중복 회원 x
memberRepository.findByName(member.getName())
.ifPresent()(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.")
});
memberRepository.save(member);
return member.getId();
}
}
하지만 이처럼 findByName으로 쭉 로직이 나오기 때문에 이는 따로 메서드로 뺄 수 있다. 바로 단축키 [Control] + [T]를 통해.
이후 [Extract Method]([option] + [command] + [M])를 누르면 다음과 같이 자동으로 분리할 수 있다.
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) {
// 같은 이름인 중복 회원 x
memberRepository.findByName(member.getName())
.ifPresent() (m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.")
});
}
}
이제 전체 회원 조회와 ID를 기반으로 특정 회원 조회 메서드를 구현한다.
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) {
// 같은 이름인 중복 회원 x
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);
}
}
출처
https://www.inflearn.com/course/스프링-입문-스프링부트
'🌱 Spring > 회원 관리 예제' 카테고리의 다른 글
[Spring] 웹 UI 및 비즈니스 로직(가입, 조회) 연결 (0) | 2023.07.05 |
---|---|
[Spring] Spring Bean과 의존 관계 (0) | 2023.07.05 |
[Spring] 회원 서비스 테스트(Dependency Injection) (0) | 2023.07.05 |
[Spring] 회원 Repository 테스트 케이스 작성(메서드 실행 순서 보장?) (0) | 2023.07.03 |
[Spring] 회원 Domain과 Repository 구현 (0) | 2023.07.02 |