오봉이와 함께하는 개발 블로그
Spring - 이해를 위해 순수 Java로 작성하는 예제(2)(스프링 핵심 원리 이해1 예제 만들기) 본문
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
'BE > Spring' 카테고리의 다른 글
Spring - 스프링 핵심 원리 이해2 - 1(객체 지향 원리 적용) (0) | 2022.05.31 |
---|---|
Spring - 이해를 위해 순수 Java로 작성하는 예제(3)(스프링 핵심 원리 이해1 예제 만들기) (0) | 2022.05.31 |
Spring - 이해를 위해 순수 Java로 작성하는 예제(1) (스프링 핵심 원리 이해1 예제 만들기) (0) | 2022.05.30 |
Spring - Spring과 객체지향 (0) | 2022.05.27 |
Spring - 파일 업로드 / 파일 다운로드 (5) | 2022.01.12 |
Comments