본문 바로가기
스프링 핵심원리 - 기본편

스프링 핵심 원리와 이해1 - 예제 만들기 (회원 도메인 설계)

by leko 2023. 5. 4.

1. 회원을 가입하고 조회한다.

2. 회원은 일반과 VIP 2가지 등급

3. 회원 데이터는 자체 DB를 구축하거나 외부시스템과 연동가능(미확정)  --> 인터페이스를 만들고 구현체를 언제든지 갈아끼울 수 있도록 설계하기

 

회원 클래스 다이어그램

<<interface>> MemberService     <===  MemberServiceImpl  -----> <<interface>> MemberRepository  <---- MemoryMemberRepository  / DbMemberRepository 

 

1.회원 객체/엔티티

1) 회원등급

public enum Grade { // 2가지 회원등급
	BASIC,
	VIP
}

2) 회원 엔티티

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() { //get 매서드
  	return id;
  }
  
  public void setID(Long id){ //set 매서드
  	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;
 }
 
}

2. 회원 저장소

1) 회원저장소 인터페이스

pubic interface MemberRepository{
	void save(Member member);  //회원을 저장하는 함수 
    Member findById(Long memberId); // 회원을 조회하는 함수
}

2) 메모리 멤버 레포지토리 구현하기  // 데이터베이스가 확정이 안되었기에 가장 단순하게 구현

만약 hashmap함수가 동시성 이슈 발생한다면 ConcurrentHashMap함수 사용하기

public class MemoryMemberRepository implements MemberRepository {
	private static Map<Long, Member> store = new HashMap<>();  //HashMap 함수 key,value
    
    @Override //오버라이딩
    public void save(Member member) {
    	store.put(member.getId(), member);
  }
  
   @Override //오버라이딩
   public Member findById(Long memberId) {
  	 return store.get(memberId);
  }

}

 

3. 회원 서비스 

1)회원 서비스 인터페이스

public interface MemberService {
	void join(Member member); // 회원 가입하기
    Member findMember(Long memberId); //회원아이디로 회원 조회하기
}

2) 회원 서비스 구현하기

public class MemberServiceImpl implements MemberService {
	private final MemberRepository memberRepository = new MemoryMemberRepository();  
    //멤버레포지토리 객체가 메모리멤버레포지토리 인스턴스를 가리킴
    public void join(Member member) { //멤버서비스의 join함수 구현
    	memberRepository.save(member);  //메모리멤버레포지토리에서 구현한 save 함수 사용
	}
     public Member findMember(Long memberId) { //멤버서비스의 findMember함수 구현
     	return memberRepository.findById(memberId); //메모리멤버레포지토리에서 구현한 findById함수 사용
 	}
 
}

 

4. 테스트하기 

1)

public class MemberApp {
 public static void main(String[] args) {
 	Member m= new Member(1L, "memberA", Grade.VIP);
    
 	MemberService memberService = new MemberServiceImpl(); //멤버서비스객체가 멤버서비스구현인스턴스를 가리킴
    membeService.join(m);
    Member findm = memberSevice.findMember(1L);
    
    System.out.println("new member=" + m.getName()); //memberA
    System.out.println("find member=" + findm.getName()); //memberA

2)

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
	MemberService memberService = new MemberServiceImpl();
    
    @Test
 	void join() {
    //given
    	Member m = new Member(1L,"memberA", Grade.VIP);
    //when
    	memberService.join(m);
        Member fm = memberService.findMember(1L);
    //then
    	Assertions.assertThat(m).isEqualTo(fm);
    
    }
}