Kim-Baek 개발자 이야기

[스프링 핵심원리] 9. 회원 도메인 개발 본문

개발/Spring

[스프링 핵심원리] 9. 회원 도메인 개발

김백개발자 2021. 9. 29. 20:32
김영한님의 [스프링 핵심 원리] 강의를 정리하고, 내가 생각한 내용까지 정리하는 포스팅

회원 도메인의 설계까지 이전 강의에서 완료를 했으니 이제 실제로 코딩을 하는 단계이다. 코딩한 모든 내용은 깃허브에 올려두었고, 맨 아래에 링크를 첨부해두었다.

package core.order.member;

public enum Grade {
    BASIC,
    VIP
}

먼저 회원 등급인 Grade를 Enum으로 만들어준다.

package core.order.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;
    }
}

다음으로는 회원 도메인을 만들어준다. 생성자와 Getter, Setter 까지 포함해서 만들어줄 수 있도록 하자.

package core.order.member;

public interface MemberRepository {

    void save(Member member);

    Member findById(Long memberId);
}

그리고 멤버를 저장하기 위한 역할로 쓰이는 MemberRepository 인터페이스를 만들어준다. 이 저장방식의 역할은 save 와 회원아이디로 멤버를 찾는 역할이다.

package core.order.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);
    }
}

이렇게 역할을 만들었으면 그에 맞는 구현을 만들어야한다. 먼저 MemoryMemberRepository를 만들었다. HashMap으로 메모리에 멤버를 저장하는 기능을 한다. 

사실 이 자료구조도 Concurrent HashMap을 써야 동시성 문제를 방지할 수 있으나, 예제이기 때문에 그냥 HashMap을 사용한다.

package core.order.member;

public interface MemberService {

    void join(Member member);

    Member findMember(Long memberId);
}

그리고 서비스 역할을 하는 멤버서비스 인터페이스를 만들어준다. 여기서 하는 역할은 회원가입을 시키고, 회원아이디로 회원을 찾아주는 역할을 수행한다.

package core.order.member;

public class MemberServiceImpl implements MemberService {

    private MemberRepository memberRepository = new MemoryMemberRepository();

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

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

그리고 MemberService의 구현체인 MemberServiceImple 이다. 실제로 여기서 어떤 저장소 역할을 사용할지를 결정하게 된다. 지금은 OCP나 DIP 를 위반하지만 MemoryMemberRepository를 직접 생성해서 의존한다.

이렇게 기본적인 회원도메인의 개발은 완료가 된다.

https://github.com/bgc8214/spring-core/tree/step1


 

반응형
Comments