서비스 구성
저번 게시물과 이어서 이번에는 서비스를 만들어 볼 것이다.
총 3가지의 기능을 만들 것이다. (회원가입, 전체 회원 표시, 한명 찾기)
1. 서비스 만들기 전 세팅
우리가 만든 데이터 베이스를 가져오는 것이 필요하다. 그냥 변수 선언해서 가져월 수 있지만 constructor를 이용해서 가져가는게 중요하다. (추후 중복 방지)
private final MemberRepository memberRepository;
// 컨스트럭터
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
(여기서 의문점... 왜 인터페이스를 들고오지 내 생각에는 MemoryMemberRepository를 끌어오는게 맞는거 같은데.... 아마 인터페이스의 장점을 사용하는거 같은데 이부분은 java를 공부해야겠다.
2.회원가입(join)
회원가입은 join으로 변수명을 만들자!!! 이렇게 규칙아닌 규칙은 추후 협업을 위해서 매우 중요하다 .
member변수를 받으면 id를 반환하며 저장하는 함수를 만들자 (저장은 이전
게시물에서 만들었던 save 함수를 만들것이다. )
+ 중복시 예외를 던지는 것도 만들어야한다.
-> findByName으로 같은 이름을 찾는다 -> 이후 OPtional함수인 ispresent를 이용한다. (값이 있으면 반환)
->예외를 던진다.
public Long join(Member member) {
//같은 이름이 있는 중복 회원 X
//컨트롤 t -> extract method
memberRepository.findByName(member.getName())
.ifPresent(m->{
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
//중복 회원 검증
memberRepository.save(member);
return member.getId();
}
여기서 중요한점 !!!! 컨트롤 t를 누루면 함수가 추출된다. 바로 이렇게!
public Long join(Member member) {
//같은 이름이 있는 중복 회원 X
validateDuplicateMember(member);//컨트롤 t -> extract method
Optional<Member> result = memberRepository.findByName(member.getName());
//중복 회원 검증
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())//커맨드 옵션 v
.ifPresent(m->{
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
함수 이름만 적으면 바로 이렇게 함수가 밖으로 나온다. 유용하게 써먹자!!!
나머지 두개의 함수는 쉽다 .
3. findMembers 모든 회원 찾기 + findOne 한명 찾기
public List<Member> findMembers(){
return memberRepository.findAll()
}
public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId)
}
전체 코드
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long,Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(),member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore(){
store.clear();
}
}
학습 후기
개념 자체는 쉽지만 유용하게 쓸수있는 기능 + 클린 코드를 지향하는 태도는 배워야 할 듯하다.
이미 만들어진 기능을 자꾸 다시 만들려고 한다. 어떠한 함수를 만들던 계획을 세우고 만드는 습관이 필요한 것 같다.
다음 포스팅은 Junit 을 이용한 테스트 코드를 작성하겟다. 안녕
'[BACK-END] > [SPRING]' 카테고리의 다른 글
Spring MVC (0) | 2022.12.16 |
---|---|
Spring bean (0) | 2022.12.14 |
Spring 백엔드 기초 중 기초 [회원관리]-(1) (0) | 2022.12.07 |
IntelliJ 단축키 (0) | 2022.12.05 |
정적 컨텐츠 / MVC / API 방식 기초 (0) | 2022.12.05 |