Spring 기본편

2. [Spring] 회원가입 및 조회 요구사항

J-Chris 2022. 3. 1. 15:53

IntelliJ 초기 설정시 참고 사항
File - Settings/Preferences - Gradle - Build and run using : IntelliJ 로 설정 - Run tests using: IntelliJ로 설정하기

이유
- Gradle로 설정하는 것보다 Run 실행 시 속도가 빠르기 때문입니다.

회원 도메인 요구사항
  - 회원을 가입하고 조회할 수 있다
  - 회원은 일반과 VIP 두 가지 등급이 있다.
  - 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)


회원 도메인 협력 관계

 

회원 클래스 다이어그램



회원 객체 다이어그램

 

Grade.java

  • enum 열거형 클래스를 통해 회원등급을 BASIC과 VIP 2가지로 선언합니다.
package hello.core.member;

public enum Grade {
    BASIC,
    VIP
}

 

Member.java 

  • 회원의 ID, 이름, 등급을 선언하고 Member 생성자를 생성합니다.
  • 선언된 각 필드(id, name, grade)에 해당하는 Getter/Setter를 만들어줍니다.
package hello.core.member;

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

 

MemberRepository.java (인터페이스)

  • member 객체를 저장하여 회원등록하는 코드를 작성합니다
  • memberId를 파라미터로 받고 해당하는 memberId를 찾아서 Member 객체를 반환합니다
package hello.core.member;

public interface MemberRepository {

    void save(Member member);

    Member findById(Long memberId);
}

 

MemberService.java (인터페이스)

  • member 객체를 저장하여 회원등록하는 코드를 작성합니다
  • memberId를 파라미터로 받고 해당하는 memberId를 찾아서 Member 객체를 반환합니다
package hello.core.member;

public interface MemberService {

    void join(Member member);

    Member findMember(Long memberId);
}

 

MemberServiceImpl.java

  • MemberService 인터페이스를 상속하여 MemberServiceImpl 구현 클래스를 만들어줍니다
  • 추상화 클래스 MemberRepository와 구현 클래스 MemoryMemberRepository를 모두 의존하고 있어, DIP에 위배가 됩니다
  • member 객체를 파라미터로 받아와서 회원등록을 합니다
  • memberId를 찾아서 해당하는 Member 객체를 반환합니다
package hello.core.member;

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

 

MemoryMemberRepository.java

  • MemberRepository를 상속받아서 MemoryMemberRepository 클래스를 만들어줍니다
  • HashMap 형태의 회원데이터(회원아이디, 회원객체)를 선언하고 put메서드를 통해 회원등록을 합니다
  • 회원아이디(memberId)를 통해 해당하는 Member객체를 반환합니다
package hello.core.member;
import java.util.HashMap;
import java.util.Map;

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

 

MemberServiceTest.java (테스트 코드)

  • MemberServiceImpl이 memberService를 위임하여 memberService 객체를 만듭니다
  • Member 객체를 생성합니다 (아이디 1L, 이름 memberA, 등급이 VIP인 Member)
  • 생성된 Member 객체를 join()을 통해 회원등록합니다
  • findMember()를 통해 회원아이디가 1인 회원을 찾아냅니다
  • 찾은 회원과 앞서 등록된 회원이 같은지 테스트를 합니다
package hello.core.member;

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

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

 

테스트 결과

  • 테스트 확인 결과, 등록된 회원과 찾고 있는 회원이 같다는 결과가 나왔습니다 

[출처] : 스프링 핵심원리 -기본편 강의, 김영한강사님