[BACK-END]/[SPRING]

Spring 백엔드 기초 중 기초 [회원관리]-(2)

지기음 2022. 12. 7. 14:40

서비스 구성 

저번 게시물과 이어서 이번에는 서비스를 만들어 볼 것이다. 

총 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