Spring boot기반 Web Application 개발[10] - 회원 서비스 개발

2 minute read

Service는 비즈니스 로직을 수행한다. 더 서비스 로직에 가까워 보이는 것들이 Service에 구현 된다. 회원 레포지토리 개발 포스팅 에서 repository에 구현했던 MemoryMemberRepository.java 의 메소드와의 차이를 비교해보는 것도 좋을 것 같다.

비즈니스 로직이란?

비즈니스 로직은 컴퓨터 프로그램에서 실세계의 규칙에 따라 
데이터를 생성·표시·저장·변경하는 부분을 일컫는다. 
이 용어는 특히 데이터베이스, 표시장치 등 
프로그램의 다른 부분과 대조되는 개념으로 쓰인다.

[출처] 비즈니스 로직 - 위키백과

위키백과에 따르면 비즈니스 로직은 실세계의 규칙에 따라 데이터를 생성·표시·저장·변경 하는 것이라고 한다. 서비스 이용자(유저)가 원하는 행위를 응용 프로그램이(ex - Web 애플리케이션) 바르게 수행할 수 있도록 하기 위해 반드시 거쳐야하는 과정이다.

쉽게 말해, 버그없이 애플리케이션이 동작하도록 검증하는 로직이라고 할 수 있지 않을까(?)

이해를 돕기 위해 추가적으로 설명하자면, Controller는 브라우저(사용자)의 Request를 어떻게 처리할지 고민한다면, Service는 브라우저(사용자)의 요청에 대해 어떤 처리를 할 것인가를 고민한다. 중복 회원 방지비밀번호 일치 확인 등을 Service의 예로 들 수 있다.

이번 포스팅에서는 Service 로직을 구현해볼 것이다.

MemberService

Join

회원과 관련 된 Service 로직을 구현해보자. 아래와 같이 service 패키지를 추가하고, MemberService.java 클래스 파일을 생성하자. 그리고 join - 회원가입 비즈니스 로직을 구현해보자.

image

파일명 : MemberService.java
위치 : \src\main\java\hello.hellospring\service\MemberService.java
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.respository.MemoryMemberRepository;


public class MemberService {

    private final MemoryMemberRepository memberRepository
						=new MemoryMemberRepository();

    /**
     * 중복 회원 관리
     */
    public Long join(Member member){
        memberRepository.findName(member.getName())
                .ifPresent(m->{
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
        memberRepository.save(member);
        return member.getId();
    }
}

  • Name이 중복된다면 IllegalStateException 처리
  • IllegalStateException 을 통과하면 회원 정보 저장

[참고]

아래 두 코드는 완벽하게 동일하다. Optional은 여러 메소드를 실행할 수 있는데 그 중 하나가 ifPresent()이다. 이 메소드를 활용해 이미 존재하는 정보를 판단할 수 있다.

- code 1
  memberRepository.findName(member.getName())
           .ifPresent(m->{
               throw new IllegalStateException("이미 존재하는 회원입니다.");
           });
 -------------------------------------------------------------------------        
- code 2
  Optional<Member> result=memberRepository.findName(member.getName());
        result.ifPresent(m->{
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        });
 -------------------------------------------------------------------------

서비스 로직 수행 메소드에서 세부 기능은 따로 분리하는게 좋다.

memberRepository.findName(member.getName())
	.ifPresent(m->{
		throw new IllegalStateException("이미 존재하는 회원입니다.");
	});

코드를 드래그 한 뒤, 전구 표시를 클릭하면 코드를 refactoring할 수 있다. 여기서, Extract Method를 클릭하고 아래와 같은 화면이 나오면, Name을 설정해주자.

image

자동으로 설정한 validateDuplicateMember라는 이름의 메소드가 생성된 것을 확인할 수 있다.

image

findMembers

전체 회원을 조회하는 메서드를 추가하자.

    /**
     * 회원 전체 조회
     */
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }
  • List로 반환

findOne

아이디로 회원 정보를 조회하자.

    /**
     * 회원 아디로 조회
     */
    public Optional<Member> findOne(Long memeberId){
        return memberRepository.findID(memeberId);
    }

  • 일치하는 id 의 Member 객체 반환

전체코드

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.respository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;


public class MemberService {

    private final MemoryMemberRepository memberRepository=new MemoryMemberRepository();

    /**
     * 중복 회원 관리
     */
    public Long join(Member member){
        validateDuplicateMember(member);
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findName(member.getName())
                .ifPresent(m->{
                  throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }

    /**
     * 회원 전체 조회
     */
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

    /**
     * 회원 아디로 조회
     */
    public Optional<Member> findOne(Long memeberId){
        return memberRepository.findID(memeberId);
    }

}

기본적인 service의 비즈니스로직을 구현했다. 다음 포스팅에서 마찬가지로 junit을 활용해 Test를 진행해보자.


이 포스팅은 인프런 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트 강의를 토대로 작성되었습니다.

Reference

Leave a comment