Spring

[Spring] Spring 핵심 원리 : 순수한 Java 애플리케이션 - 회원 도메인

yjk490 2023. 6. 21. 15:05

1. 설계

도메인 협력관계

회원 가입
 1) 클라이언트는 회원 서비스에 회원 가입을 요청한다.
 2) 회원 서비스는 클라이언트로부터 받은 회원 정보를 회원 저장소에 저장한다.

회원 조회
 1) 클라이언트는 회원 서비스에 회원 정보를 요청한다.
 2) 회원 서비스는 회원 번호를 통해 회원 저장소에서 회원 정보를 조회한다.
 3) 조회한 회원 정보를 반환한다.

클래스 다이어그램

2. 개발

회원 엔티티와 회원 등급

public class Member {
    private Long memberId;
    private String name;
    private Grade grade;

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

    public Long getMemberId() {
        return memberId;
    }

    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }

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

    @Override
    public String toString() {
        return "Member{" +
                "memberId=" + memberId +
                ", name='" + name + '\'' +
                ", grade=" + grade +
                '}';
    }
}

public enum Grade {
    BASIC,
    VIP
}

 

회원 서비스 인터페이스와 구현체

public interface MemberService {
    Member signUp(Member member);
    Member findMember(Long memberId);
}

public class MemberServiceImpl implements MemberService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    @Override
    public Member signUp(Member member) {
        memberRepository.saveMember(member);

        return member;
    }

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

클라이언트가 회원 가입이나 회원 조회 요청을 하면 MemberServiceImpl의 메서드가 호출된다. 회원 정보는 memberRepository로 저장하거나 조회한다. 다른 종류의 회원 저장소 구현체를 적용하려 할 때는 참조변수 memberRepository에 회원 저장소 구현체를 대입하는 코드만 수정하면 된다. 메서드 내의 코드를 수정하지 않아도 된다. 참조변수 memberRepository는 인터페이스 타입이기 때문이다.

회원 저장소 인터페이스와 메모리 회원 저장소 구현체

public interface MemberRepository {
    void saveMember(Member member);
    Member findById(Long memberID);
}

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

    @Override
    public void saveMember(Member member) {
        store.put(member.getMemberId(), member);
    }

    @Override
    public Member findById(Long memberID) {
        return store.get(memberID);
    }
}


3. 실행

public class MemberApp {
    public static void main(String[] args) {
    	MemberService memberService = new MemberServiceImpl();

        Member member = new Member(1L, "memberA", Grade.VIP);
        Member savedMember = memberService.signUp(member);
        Member foundMember = memberService.findMember(member.getMemberId());

        System.out.println("savedMember = " + savedMember.toString());
        System.out.println("foundMember = " + foundMember.toString());
    }
}
/* 실행 결과
savedMember = Member{memberId=1, name='memberA', grade=VIP}
foundMember = Member{memberId=1, name='memberA', grade=VIP}
*/