[Spring] 스프링 핵심 원리 이해1 - 회원 도메인 설계

김대준·2021년 12월 26일
0

spring

목록 보기
11/25
post-thumbnail

회원 도메인 설계


📌 회원 도메인 요구사항

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



📌 회원 도메인 협력 관계

회원 도메인 협력 관계



📌 회원 클래스 다이어그램

회원 클래스 다이어그램



📌 회원 객체 다이어그램

회원 객체 다이어그램

  • 회원 서비스: MemberServiceImpl





회원 도메인 코드


📌 회원 엔티티

✔ 회원 등급

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;
    }
}
  • Entity : 실체, 객체라는 의미로 실무적으론는 엔티티라고 부른다.
  • 즉, 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 것으로 설명 할 수 있다.
  • 예) 학생이라는 엔티티는 학번, 이름, 학점, 등록일자, 생일, 전공 등 속성으로 특징 지을 수 있다.

📌 회원 서비스

✔ 회원 서비스 인터페이스

package hello.core.member;

public interface MemberService {

    void join(Member member);

    Member findMember(Long memberId);

}
  • 회원 가입
  • 회원 조회



✔ 회원 서비스 구현체

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);
    }
}
  • 인터페이스의 구현객체가 하나 뿐이면 구현 클래스 이름을 인터페이스명impl 이라고 한다.



📌 회원 저장소

✔ 회원 메모리 인터페이스

package hello.core.member;

public interface MemberRepository {

    void save(Member member);

    Member findById(Long memberId);

}
  • DB에 회원정보 저장
  • DB에 회원정보 조회



✔ 회원 저장소

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);
    }
}
  • HashMap은 동시성 문제로 실무에서는 ConcurrentHashMap을 쓴다.





회원 도메인 테스트


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

    }
}
  • JUnit 테스트 사용

📌 org.assertj.core.api.Assertions

  • Assertionsorg.assertj.core.api.Assertions 클래스다.

Assertions.assertThat(객체1).isEqaulsTo(객체2)

  • assertThat()으로 비교할 대상을 설정하고 isEqualTo()로 사용자가 생각하는 값을 비교한 뒤 그게 맞는지 검사하는 테스트다.
  • assertThat()의 강점은 오류가 났을 때 기대값과 실제값을 둘 다 보여줘서 뭐가 틀린지 명확하게 보여줘서 오류 찾는 시간을 단축시킨다.

Assertions.assertThat(객체1).isSameAs(객체2)

  • 참고로 assertThat.isSameAs는 참조한느 값이 같은지 비교하고, isEqualTo()는 원시값이 같은지를 비교한다.

Assertions.assertThat(객체1).isInstanceOf(객체2);

  • assertThat으로 테스트할 대상을 넣고, isInstanceOf는 앞의 테스트 대상의 인스턴스니? 를 묻는다.
  • 앞에 자식이 될 요소를, 뒤에는 부모가 될 요소를 넣는다. 즉, 참조나 상속을 받고있니? 를 묻고 있다.



📌 org.junit.jupiter.api.Assertions

Assertions.assertThrows(에러클래스, 에러발생);

  • 일부러 오류를 발생시켜서 테스트하는 코드
  • 회원이 조회가 안되거나, 문자가 들어와야하는데 숫자가 들어간다거나 같은 예외처리 테스트 코드
  • 예외가 들어와서 오류가 제대로 나오는지 테스트하기 위해 쓰인다.
  • 첫 번째 인자에는 에러를, 두 번째 인자에는 에러 발생 요소를 넣는다. 제대로 에러가 뜨면 true를 반환한다.





문제점


  • OCP 원칙을 준수하지 못했다.
  • DIP 원칙을 준수하지 못했다.
  • 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있다.






강의 : 스프링 핵심 원리 - 기본편

profile
kureungkureung

0개의 댓글