본문 바로가기

컴퓨터/Spring Boot

[TIL] Spring Boot(intellij) - 회원 관리 개발(1)

* 인프런 김영한 강사님의 스프링 입문 강의 정리

회원 관리 백엔드 개발을 진행하였다.

회원관리 도메인, 리포지토리, 서비스, 테스트 케이스 등을 생성하여 실행해 보았다.

 

현재 DB를 설정하지 않았으므로 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계한다.(데이터 저장소를 사용)

 

▶ 웹 계층 구조

컨트롤러 -> 서비스->리포지토리->DB

도메인

 

컨트롤러 : 컨트롤러의 역할

서비스 : 핵심 비즈니스 로직을 구현한다.

리포지토리 : DB에 접근하여 도메인 객체를 DB에 저장하고 관리한다.

도메인 : 비즈니스 도메인 객체

 

예제에서는

 

domain - member

service - MemberService

repository - memberRepository(interface), memoryMemberRepository

 

위와 같이 구성하며

구조는 아래와 같다.

예시

 

▶ 회원 도메인(member) 

package myStudyspring.myStudyspring.domain;

public class member {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

 

▶ 회원 리포지토리

1) 인터페이스(memberRepository)

package myStudyspring.myStudyspring.repository;

import myStudyspring.myStudyspring.domain.member;
import java.util.List;
import java.util.Optional;

public interface memberRepository {
    member save(member member);
    Optional<member> findById(Long id);
    Optional<member> findByName(String name);
    List<member> findAll();

}

회원 저장, 아이디 찾기, 이름 찾기, 회원 전체 조회 메서드

 

2) 리포지토리(memoryMemberRepository)

package myStudyspring.myStudyspring.repository;

import myStudyspring.myStudyspring.domain.member;

import java.util.*;

public class memoryMemberRepository implements memberRepository{

    private static Map<Long, member> store = new HashMap<>();
    private static long sequence = 0L; // key 값을 생성하는 시퀀스


	//회원 저장
    @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();
        // 자바 람다 -> 파라미터로 넘어온 이름과 getName과 일치하는 것을 찾아 optional로 반환
    }

	//전체 회원 조회
    @Override
    public List<member> findAll() {
        return new ArrayList<>(store.values());
    }

	//데이터 클리어
    public void clearStore(){
        store.clear();
    }
}

 

리포지토리에서는 인터페이스를 구현한다.

hashmap에 시퀀스와 맴버 객체를 저장하며,

clearStore는 테스트 시 데이터 클리어를 위한 메서드이다.

 

 

▶ 회원 서비스

package myStudyspring.myStudyspring.service;

import myStudyspring.myStudyspring.domain.member;
import myStudyspring.myStudyspring.repository.memoryMemberRepository;
import myStudyspring.myStudyspring.repository.memberRepository;

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

public class MemberService {

    private final memberRepository memberRepository;

    public MemberService(memberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    /**
     * 회원 가입
     * */
    public Long join(member member){
        validateDuplicateMember(member); // 중복 회원 검증
        memberRepository.save(member);
        return member.getId();
        //회원가입 시 아이디 반환
    }
	
    /**
     * 중복 회원 검증
     * */
    private void validateDuplicateMember(member member) {
        memberRepository.findByName(member.getName())
            .ifPresent(m ->{
                throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
    }

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

	/**
     * 회원 조회
     * */
    public Optional<member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }

}

 

*null이 될 수 있는 값 혹은 null 값은 optional로 감싸서 반환한다.

*ifPresent - optional 메서드로 null이 아닌 존재하는 값이 있을 때 처리한다.

 

 

728x90