Backend/게시판만들기

[Spring실습] 5분만에 알아보는 회원가입 서비스 만들기-3

Chung-A 2020. 11. 30. 00:03

<스프링을 이용한 간단한 회원가입 서비스 만들기>

본 포스팅은 스프링을 이용한 간단한 예제 프로젝트입니다.


이번에는 저번에 만든 userRepository 저장소를 이용해서

서비스 클래스를 만들어보고자 한다.

 

먼저 저번 포스팅에서 만든 Repository의 코드는 다음과 같다.

(인터페이스는 생략한다.)

public class MemoryUserRepositoryImpl implements UserRepository {

    Map<Long, UserVO> userMap = new HashMap<>();
    private static long sequence=0L;

    @Override
    public UserVO save(UserVO userVO) {
        userVO.setId(++sequence);
        userMap.put(userVO.getId(), userVO);
        return userVO;
    }

    @Override
    public Optional<UserVO> findById(Long id) {
        return Optional.ofNullable(userMap.get(id));
    }

    @Override
    public Optional<UserVO> findByName(String name) {
        return userMap.values().stream().filter(
                u->u.getName().equals(name)
        ).findAny();
    }

    @Override
    public List<UserVO> findAll() {
        return new ArrayList<>(userMap.values());
    }

    @Override
    public void clearData() {
        userMap.clear();
    }
}

단순하게 저장과 조회 기능만 제작한 리포지토리이다.

 

그리고 이번에 서비스 클래스에서 만들 기능은 다음과 같다.

메소드명 기능
join 회원가입기능.
이름은 중복되면 안된다는 기획 요청이 들어왔다고 가정하여
유저정보를 받아서 저장하되 이름이 중복된 회원이면 예외를 발생시킨다.
findAllUsers 모든 회원들의 정보를 반환한다.
findOne Id가 일치하는 회원 한명을 반환한다.

 

 

 

해당 기능을 제작해보면 다음과 같이 코드를 짤 수 있다.

 

@RequiredArgsConstructor
@Service
public class UserService {

    private final UserRepository userRepository;

    /**
     * 회원가입.
     */
    public Long join(UserVO userVO) {
        //이름 중복검사.
        validateUserInfo(userVO);

        //저장.
        UserVO savedUser = userRepository.save(userVO);
        return savedUser.getId();
    }

    private void validateUserInfo(UserVO userVO) {
        userRepository.findByName(userVO.getName()).ifPresent(
                u-> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }

    /**
     * 전체회원 조회
     */
    public List<UserVO> findAllUsers() {
        return userRepository.findAll();
    }

    /**
     * 유저 id로 조회
     */
    public Optional<UserVO> findOne(Long userId) {
        return userRepository.findById(userId);
    }
}

코드에서 주목할 점은 크게 두가지인 것 같다.

 

1. Repository를 생성할 때 의존성 주입 방식 도입

먼저 UserRepository를 받아올 때 new 로 생성하는 것보다는 생성자를 통해

외부에서 의존성 주입을 해주는 방식으로 구현을 하였다.

(@RequireArgsConstructor 어노테이션을 쓰면 어노테이션 프로세서를 통해 자동으로 생성자코드를 만들어준다, lombok 라이브러리를 사용하면 사용가능하다.)

 

외부에서 주입해주면 Test코드를 짤 때 편리함은 물론, 추후 유지보수를 하면서 기획자의 요청에 따라 기능이 변경되면 클래스를 부품처럼 갈아끼울 수 있게된다.

(이 개념은 Java의 다형성을 이용한 DI 개념과도 연결되는데 이 DI와 관한 개념은 추후에 포스팅하도록 하겠다.)

 

2. 중복된 이름을 가진 회원 처리

중복된 회원의 처리를 위해 회원가입 시  findByName으로 먼저 해당 이름을 가진 유저가 있는지 검색해준다.

그 결과가 Optional로 들어오기 때문에 ifPresent 로 결과가 있는지 검증하고 있을 시 

람다식으로 예외를 발생시키는 방식으로 구현을 하였다.

 

그리고 이 내용들을 메서드로 따로 빼어 다른 개발자가 join 메서드를 봤을 때 보다 쉽게 읽힐 수 있도록 하였다.

 


Reference

이 포스팅은 아래의 강좌를 참고하여 만들어졌습니다.


  • 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8#description

 

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 Back-End Java Spring MVC Spring Boot 온라인 강의 백엔

www.inflearn.com