스프링 예제 - 회원 도메인

인프런 스프링 핵심 원리 - 기본편 수강 중

프로젝트 설정

  • 스프링 부트 스타터에서 프로젝트 생성
  • Project: Gradle Project
  • Spring Boot: 2.7.0
  • Group: hello
  • Packaging: Jar
  • Java: 11
  • Dependencies: 선택하지 않음

Gradle 라이브러리를 변경할 시에는 코끼리 버튼 또는 우측 Gradle 창에서 Releoad 해주어야 함

비즈니스 요구사항 설계

  • 회원
    • 기능: 회원 가입, 조회
    • 등급: 일반, VIP
    • 데이터 레포지터리는 미정

회원 도메인 설계

회원 도메인 협력 관계

그림1

  • 미확정이기 때문에 회원 저장소 별도 인터페이스 구축
  • 우선 임시 개발용으로 메모리 회원 저장소 구현

회원 클래스 다이어그램

그림2

회원 객체 다이어그램

그림3

  • 실제 인스턴스 관계

회원 도메인 개발

회원 등급

public enum Grade {
    BASIC,
    VIP
}

회원 엔티티

public class Member {

    private Long id;
    private String name;
    private Grade grade;

    public Member(Long id, String name, Grade grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

    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;
    }

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}

  • id, name, grade 선언
  • 생성자, getter 및 setter

회원 저장소 인터페이스

public interface MemberRepository {
    void save(Member member);

    Member findById(Long memberId);
}

회원 서비스 구현 - 메모리 레포지터리

public class MemoryMemberRepository implements MemberRepository{
    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}
  • 실무에선 동시성 이슈 때문에 HashMap보다는 ConcurrentHashMap 사용 권장

회원 서비스 인터페이스

public interface MemberService {

    void join(Member member);

    Member findMember(Long memberId);
}

회원 서비스 구현체

public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository = new MemoryMemberRepository();

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

회원 도메인 - 회원 가입 테스트

//import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.assertj.core.api.Assertions;

public class MemberServiceTest {
    MemberService memberService = new MemberServiceImpl();
    @Test
    void join(){
        //given
        Member member = new Member(1L, "memberA", Grade.VIP);

        //when
        memberService.join(member);
        Member findMember = memberService.findMember(1L);

        //then
        Assertions.assertThat(member).isEqualTo(findMember);
    }
}
  • Assertions.assertThat() 메서드 찾을 수 없으면 core를 import 해야 함
  • 인스턴스화 한 memberjoin() 메서드로 등록된 member(findMember)가 동일한지 테스트
  • 테스트 결과 Good

[참조] 인프런 스프링 핵심 원리 - 기본편 - 링크

끝!