project: Gradle Project
Spring Boot: 2.7.2
Language: Java
Packaging: jar
Java: 17
Setting - gradle - build and run using = InteliJ IDEA
인터페이스를 만들고 구현체를 언제든지 갈아끼울 수 있도록 설계
스프링 없이 순수 자바로만 프로그래밍 해보기
클라이언트 -> 회원서비스(-회원가입, -회원조회) -> 회원저장소
<<interface>> MemberService
MemberServiceImpl
<<interface>>MemberRepository
MemoryMemberRepository
DbMemberRepository
Grade.java
package hello.core.Member;
public enum Grade {
BASIC,
VIP
}
Member.java
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;
}
}
MemberRepository.java
package hello.core.Member;
public interface MemberRepository {
void save(Member member);
Member findById(Long memberId);
}
MemoryMemberRepository.java
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<>();
//동시성 이슈때문에 실제론 HashMap을 쓰지 않는다.
@Override
public void save(Member member) {
store.put(member.getId(), member);
}
@Override
public Member findById(Long memberId) {
return store.get(memberId);
}
}
MemberService.java
package hello.core.Member;
public interface MemberService {
//회원가입
void join(Member member);
//회원조회
Member findMember(Long memberId);
}
MemberServiceImpl.java
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);
}
}
MemberApp.java
package hello.core;
import hello.core.Member.Grade;
import hello.core.Member.Member;
import hello.core.Member.MemberService;
import hello.core.Member.MemberServiceImpl;
public class MemberApp {
public static void main(String[] args) {
MemberService memberService = new MemberServiceImpl();
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("find Member = " + findMember);
}
}
MemberServiceTest.java
package hello.core.member;
import hello.core.Member.Grade;
import hello.core.Member.Member;
import hello.core.Member.MemberService;
import hello.core.Member.MemberServiceImpl;
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);
}
}
MemberServiceImpl가 MemberRepository(추상화) MemoryMemberRepository(구체화) 둘다 의존한다. => DIP위반