개발일기
회원 서비스 개발 본문
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
public class MemberService {
private final MemberRepository memberRepository= new MemoryMemberRepository();
/*
* 회원 가입
* @param member
* return
* */
public Long join(Member member){
//같은 이름이 있는 중복 회원X
Optional<Member> result = memberRepository.findByName(member.getName()); //<- memberRepository.findById(member.getName());
memberRepository.save(member);
return member.getId();
}
}
repository에 있는 command + option + v 를 누르면 그냥 리턴을 해준다.
result.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
ifPresent는 안에 Member변수가 이미 있는 경우를 뜻한다.
m-> 통해서 이미 있는 회원이라고 문자열을 출력 해주자. 여기서 ifPresent가 가능한 이유는 Optional이기 때문에 사용할 수 있는 메소드이다.
기존에는 if(null!=) 이런식으로 작성해야 했다. 또한 Optional을 해주면 Optional이라는 것 안에 멤버객체가 있는 것이다.
Optional을 통한 메서드는 isPresent말고도 여러개가 있다.
과거에는 null이 있으면 if(null~~) 이런식으로 했지만 이제는 null이 있으면 Optional로 감싸서 반환해준다.
덕분에 ifPresent 같은 것들을 사용할 수 있다.
데이터를 꺼내고 싶으면 result.get(); <- 을 사용해서 데이터를 꺼내줄 수 있다.
직접 바로 꺼내는 것은 권장하지 않는 방법이다.
OrAtGet()이걸 많이씀 값이 있으면 이걸 꺼내고 없으면 이걸꺼내 이런식으로 사용한다.
memberRepository.findByName(member.getName()).ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
memberRepository.save(member);
return member.getId();
이런식으로 변수명에 해당 값을 반환하지 않고 바로 사용
이렇게 하면 메서드가 쭉나오는데 이걸 메서드로 따로 뽑으려고 하면 따로 뽑아서 사용할 수 있음.
조금 더 깔끔한 코드를 위해서 메서드를 뽑는게 더 좋다.
memberRespositroy에서 ctrl + t하면 리펙토링과 관련된 여러가지 것들이 나온다.
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository= new MemoryMemberRepository();
/*
* 회원 가입
* @param member
* return
* */
public Long join(Member member){
//같은 이름이 있는 중복 회원X
validateDuplicateMember(member);// 중복회원 검증
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName()).ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
}
이제 중복회원을 받지 않는다.
서비스는 좀 더 기능적인 이름으로 사용하고 repository는 좀 더 개발스럽게 용어로 지어준다.
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository= new MemoryMemberRepository();
/**
* 회원 가입
* @param member
* return
* */
public Long join(Member member){
//같은 이름이 있는 중복 회원X
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);
}
}
우리가 만든 코드가 잘되는지 테스트 코드를 작성하여 확인할 것이다.
'Spring > Spring tutorial - 코드로 배우는 스프링 (김영한)' 카테고리의 다른 글
컴포넌트스캔과 자동 의존관계 설정 (2) | 2022.09.26 |
---|---|
회원 서비스 테스트 (3) | 2022.09.19 |
회원 리포지토리 테스트 케이스 작성 (0) | 2022.09.17 |
회원 도메인과 리포지토리 만들기 (0) | 2022.09.17 |
비즈니스 요구 사항 정리 (0) | 2022.09.17 |