TIL - JAVA spring DAY 6

jihan kong·2022년 1월 10일
0

JAVA spring 입문

목록 보기
7/20
post-thumbnail

회원 서비스 개발과 테스트

회원의 도메인과 리포지토리에 관한 내용을 설계했으니, 이를 토대로 비즈니스 로직을 건드려볼 차례다. 먼저 main method의 하위 package로 service 를 생성한 후, MemberService 라는 class를 생성한다.

이 후, MemberService class에 들어갈 내용은 다음과 같다.

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(); 
    // 1.

    /**
     * 2.
     */
    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("이미 존재하는 회원입니다.");
            });
    }

    /**
     * 3.
     */
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

각 코드 라인에 주석으로 넘버링을 해두었고, 다음은 그 라인에 관한 설명이다.

  1. 회원 서비스를 만들기 위해선 회원 리포지토리가 필요하므로 MemoryMemberRepository 객체를 생성한다.
  1. 회원가입을 위한 코드로 가입시에 중복된 이름으로 회원가입하는 것을 방지하기 위한 코드이다. 우리가 만드는 서비스는 ID(key)이름으로만 회원을 생성하기 때문에, 키 값에 중복값이 있다면 데이터 고유 무결성의 원칙에 위배가 될 것이다. 한 편, 위 코드는 원래....
Optional<member> result = memberRepository.findByName(member.getName());
  		result.ifPresent(m -> {
  			throw new IllegalStateException("이미 존재하는 회원입니다.");
  		});

로 나타내어진 코드이나 ifPresent 문법을 사용하기 위해 전에
언급했던 Optional로 코드를 감쌌다. Optional의 최대 장점이 여기서 나온다. 단순히 NPE(NullPointerException) 를 피하기 위해서도 사용하지만 OptionalWrapper class. 즉, 클래스이므로 각종 메소드를 제공해준다는 것이다. ifPresent 문법은 참조하는 변수(위 코드에서는 member)가 Null이 아니라 어떠한 값이 존재한다면 괄호 안의 로직이 동작하게끔 하는 문법이다.

강사님께서 말씀하시길, findByName 과 같이 회원가입시 동작되는 코드들은 method를 따로 추출하는 것이 좋다고 하셨다. 위 코드를 block 처리한 후, Ctrl + Alt + m을 눌러 메소드를 추출했다. (MacOS의 경우, Cmd + Opt + m) 따라서, 다음과 같이 메소드가 생성되는것이다.

private void validateDuplicateMember(Member member) {
    memberRepository.findByName(member.getName())
        .ifPresent(m -> {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        });
}
  1. 전체 회원을 조회하는 코드이다. 회원가입을 위한 코드와 비슷하나, findAll, findById 을 return 해주는 것이 그 특징이다.

다음과 같이, 서비스를 개발할때는 join, findMembers와 같이 조금 더 비즈니스와 맞닿아있는 느낌을 받을 수 있었다. 강사님께서 말씀하신 서비스 클래스의 특징이라고 하셨다. 서비스에 의존적으로 개발을 함으로써 이를 통해 기획자나 다른 이해관계자들과 의사소통을 할 수 있다는 것을 배웠다.

회원 서비스 테스트는 다음 포스팅에서....

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글