Back-End/Inflearn 강의

[스프링 입문] 회원 관리 예제 - 백엔드 개발

yeonx 2022. 5. 12. 16:18
728x90

1. 비즈니스 요구사항 정리

  • 데이터 : 회원 ID, 이름
  • 기능 : 회원 등록, 조회
  • 아직 데이터 저장소가 선정되지 않음(가상의 시나리오 :  성능이 중요한 DB로 선정 or 일반적인 관계형 DB로 선정 or NoSQL로 선정)

 

일반적인 웹 애플리케이션 계층 구조

  • 컨트롤러 : 웹 MVC의 컨트롤러 역할
  • 서비스 : 핵심 비즈니스 로직 구현 - 서비스 클래스에 핵심 비즈니스 로직이 들어가 있다(ex> 회원은 중복 가입이 안됨)
  • 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인 : 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

 

클래스 의존관계

  • 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
  • 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민 중인 상황으로 가정
  • 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용

 

2. 회원 도메인과 리포지토리 만들기

  • domain/Member.java : 회원 아이디, 이름, getter/setter
  • repository/MemberRepository.interface : 회원을 저장소에 저장 +아이디로 회원을 찾는 기능 + 이름으로 회원을 찾는 기능 +전체 회원 리스트 반환
  • repository/MemoryMemberRepository.java :
    • private static Map<Long.Member> store 
    • save Member할 때, sequence number를 1씩 올려줌, 선언한 store에 put 해줌
    • store.values().stream().filter(member->member.getName().equals(name)).findAny()
    • 전체 반환 : return new ArrayList<>(store.values());

 

3. 회원 리포지토리 테스트 케이스 작성

  • test/java/~/repository/MemoryMemberRepository.java 

@Test

  • 그 밑 매서드 실행됨
  • test코드 실행 시 순서는 보장이 안됨 ( test 종료 시 clear 해주는 코드 필요)

@AfterEach

  • 이를 사용하면 각 테스트가 종료될 때마다 이 기능을 실행한다. 
  • 여기서는 메모리 DB에 저장된 데이터를 삭제한다.
  • 한 번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있음.
  • 이렇게 되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있음.
  • 테스트는 각각 독립적으로 실행되어야 함.
  • 테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아님

* Optional : 값을 꺼낼 땐 get()으로 꺼냄

* Assertions.assertThat(member).isEqualTo(result) : 결과가 맞는지 확인

*@AfterEach repository.clearstore();

 

4. 회원 서비스 개발

회원 도메인과 리포지토리를 이용해 실제 비즈니스 로직을 작성

 

  • 회원 서비스를 만들려면 회원 리포지토리가 있어야 함 -> private final로 선언
    • private final MemberRepository memberRepository = new MemoryRepository();
    • member join(Member nenber){} - 같은 이름이 있는 중복 회원 x memberRepository.findByName(~) : 이 반환 값이 있으면 이미 존재하는 회원인 것임 result.ifPresent
    • findMembers(){} : memberRepositoy.findAll();
    • findOne(Long memberId){} : membetRepository 

*작성한 코드를 method로 뽑아내는 단축키 : ctrl + T

5. 회원 서비스 테스트

  • MemberService memberservice = new MenberService();
  • @Test코드는 과감하게 한글로 변경해도 됨
  • given, when : memberservice.join, then : Assertions.assertThat(~) 결과가 이렇게 나와야 해
  • 예외 검증도 중요함 (중복 회원도 저장해서 확인해야 함) try{}catch{} , assertThrows()
  • 메모리에 쌓이기 때문에 test를 clear 해줘야 함! -> 근데 repository 선언 필요함! -> 돌 때마다 clear 해줘서
  • 멤버 Repository의 리포지토리랑 testcase의 Repository는 같은 게 좋음 -> 같은 Repository를 테스트하는 것이 맞음
  • MemberService.java에서 memberRepository를  외부에서 넣어 주도록 설계해줌
public MemberService(MemberRepository memberRepository){
	this.memberRepository = memberRespository;
}
  • MemberServiceTest.java 코드에서는 @BeforeEach를 사용해 MemberRepository를 넣어줌 : 테스트를 실행할 때마다 각각 생성을 해줌
class MemberServiceTest{

	MemberService memberService;
    MemoryMemberRepository memberRepository;
    
    @BeforeEach
    public void beforeEach(){
    	memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

	...

}

 

*main코드를 test코드로 생성하는 단축키 : ctrl + shift + T

*command + option + V : 앞에 뭐가 생기ㅁ,,,

*shift + F10 : 이 전에 돌렸던 코드 그대로 돌리게 해 줌

 

참고한 강의 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard