오봉이와 함께하는 개발 블로그

Spring - 이해를 위해 순수 Java로 작성하는 예제(2)(스프링 핵심 원리 이해1 예제 만들기) 본문

BE/Spring

Spring - 이해를 위해 순수 Java로 작성하는 예제(2)(스프링 핵심 원리 이해1 예제 만들기)

오봉봉이 2022. 5. 30. 23:47
728x90

회원 도메인 개발

회원 엔티티

회원 등급

package hello.core.member;

public enum Grade {
    BASIC, 
    VIP
}

회원 엔티티

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

회원 저장소

회원 저장소 인터페이스

package hello.core.member;

public interface MemberRepository {
    void save(Member member);

    Member findById(Long memberId);
}

메모리 회원 저장소 구현체

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

회원 서비스

회원 서비스 인터페이스

package hello.core.member;

public interface MemberSerivce {
    void join(Member member);
    Member findMember(Long memberId);
}

회원 서비스 구현체

package hello.core.member;

public class MemberServiceImpl implements MemberSerivce{

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

회원 도메인 실행, 테스트

package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberSerivce;
import hello.core.member.MemberServiceImpl;

public class MemberApp {
    public static void main(String[] args) {
        MemberSerivce memberSerivce = new MemberServiceImpl();
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberSerivce.join(member);

        Member findMember = memberSerivce.findMember(1L);
        System.out.println("new member = " + member.getName());
        System.out.println("find member = " + findMember.getName());
    }
}

위와 같이 실행하는 방법은 좋은 테스트 방법이 아니기에 JUnit 테스트를 사용하자

package hello.core.member;

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

public class MemberServiceTest {

    MemberSerivce memberSerivce = new MemberServiceImpl();

    @Test
    void join() {
        // given
        Member member = new Member(1L, "memberA", Grade.VIP);
        // when
        memberSerivce.join(member);
        Member findMember = memberSerivce.findMember(1L);
        // then
        Assertions.assertThat(member).isEqualTo(findMember);
    }
}

회원 도메인 설계의 문제점

  • 코드 설계상 문제점
    • 다른 저장소로 변경할 때 OCP를 준수할지?
    • DIP를 잘 지킬지?
  • 의존관계가 인터페이스 뿐만 아니라 구현체까지 모두 의존하는 문제점이 있다.
private final MemberRepository memberRepository = new MemoryMemberRepository();
// memberRepository가 MemberRepository(인터페이스)는 의존해도 되지만 MemoryMemberRepository(구현체)까지 의존하는 문제점 발생
// 추상화에도 의존, 구체화에도 의존한다.
출처 : 인프런 김영한 지식공유자님의 스프링 완전 정복 로드맵 강의
728x90
Comments