오늘은 몰랐으면 내일은 알면 된다
[Spring 입문] 7. 회원관리 예제(3) 회원 서비스 개발 본문
먼저 다음과 같이 service 패키지 아래에 memberService 클래스를 만든다

그 다음, repository를 불러온다. 아직 db가 정해져있지 않기 때문에, 앞서 MemoryMemberRepository를 만들어 두었다.
private final MemberRepository memberRepository = new MemoryMemberRepository();
단순히 저장만 하려면 repo 의 save 메서드를 불러주면 되겠다.
public Long join(Member member) {
memberRepository.save(member);
return member.getId();
}
그러나 만약 같은 이름을 가진 회원은 가입을 못하게 하려면 어떻게 해야할까?
이름으로 검색했을 때 그 결과가 나온다면 IlligalStateException을 발생시킨다.
public Long join(Member member) {
//같은 이름이 있는 중복 회원X
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(member1 -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
memberRepository.save(member);
return member.getId();
}
ifPresent는 어떠한 값이 있으면 로직을 동작시킨다. null의 가능성이 있는 경우 Optional로 감싸서 처리하는데, 이 경우에 사용할 수 있는 메서드 중 하나이다.
그런데 optional을 바로 반환하는 것은 권장되지 않는다고 한다.
다음과 같이 코드를 수정할 수 있다.
public Long join(Member member) {
//같은 이름이 있는 중복 회원X
memberRepository.findByName(member.getName())
.ifPresent(member1 -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
memberRepository.save(member);
return member.getId();
}
그런데 또! findByName은 중복되어서 사용할 수 있기 때문에, 따로 메서드를 뽑는 것이 좋다고 한다.
windows에서의 경우 ctrl+alt+shift+T 로 refactoring을 할 수 있다.

extract method 를 선택하게 되면 메서드를 추출하여 refactoring 할 수 있고, 메서드 이름을 지정할 수 있다.

그러면 다음과 같은 코드가 완성되었다.
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
public Long join(Member member) {
//같은 이름이 있는 중복 회원X
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(member1 -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
}
service는 비즈니스 의존적으로 설계해야한다. repo는 단순히 데이터를 넣었다 빼는 용도로 설계되기 때문에, 메서드명 자체도 기능에 충실하게 작성해야 한다. service도 마찬가지로 비즈니스 로직을 실행시키는, 동작에 관련된 이름으로 작성한다.
그 외에 모든 멤버찾기, 특정 멤버찾기도 아래와 같이 작성한다.
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
'Java > Spring' 카테고리의 다른 글
| [Spring 입문] 10. 스프링빈과 의존관계 (2) 자바 코드로 직접 스프링 빈 등록하기 (0) | 2022.09.26 |
|---|---|
| [Spring 입문] 9. 스프링빈과 의존관계 (1) 컴포넌트 스캔과 자동 의존관계 설정 (0) | 2022.09.26 |
| [Spring 입문] 6. 회원관리 예제(2) 회원 도메인과 리포지토리 만들기 (0) | 2022.09.20 |
| [Spring 입문] 5. 회원관리 예제(1) 비즈니스 요구사항 정리 (0) | 2022.09.19 |
| [Spring 입문] 4. 정적 컨텐츠, MVC와 템플릿 엔진, API (0) | 2022.09.19 |