SPRING/스프링 입문 (김영한 강사님)

스프링 입문 정리 (3) - 회원 관리 예제-백엔드 개발

_ys2 2023. 7. 10. 02:28
728x90
반응형

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

데이터 : 회원ID, 이름을 만든다.

회원등록, 조회가되는 기능을 만든다.

데이터저장소는 선정되지 않았다는 가정하에 데이터를 메모리에 저장하고 조회하는 방식으로 만든다.

 

사진 출처 : 인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한

 

  • 컨트롤러 : 웹 MVC의 컨트롤러 역할
  • 서비스 : 핵심 비즈니스 로직 구현
  • 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인 : 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리된다.

 

사진 출처 : 인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한

 

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

 

회원 정보를 저장하는 MemberRepository는 인터페이스로 설계되어있다.

이유는 아직 데이터 저장소가 선정되지 않았기 때문에 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소를 사용하고, 추후에 DB가 정해지는 경우 DB에 맞춰서 바꿔서 사용할 수 있도록한다.

 

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

주요 단축기

  • Getter & Setter : Alt + Insert
  • import 정리 : Alt + Shift + O
  • implements Methods : Ctrl + I

 

 

회원객체

Member.java

domain package를 생성해서 회원 정보를 담는 개체를 생성한다.

 

 

회원 리포지토리 인터페이스

MemberRepository.java

 

repository 패키지를 만들고 회원의 정보를 저장할 리포지토리 인터페이스를 생성한다.

인터페이스안에 4가지 기능을 선언해준다.

 

Optional란? 반환값이 null인 경우가 있는데 요즘에는 null이아닌 Optional로 null를 감싸서 반환후 사용한다고 한다.

 

 

회원 리포지토리 메모리 구현체

 

Repository를 만들 때 임시적으로 메모리 저장 방식을 사용한다.

MemberRepository를 구현한 MemoryMemberRepository를 만든다.

static한 HashMap 인스턴스를 생성하여 임시저장소를 만든다.

 

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

단축기

  • static import : Alt + Enter (static import할 메소드가 켜져있는 상태에서)

테스트 케이스를 작성한다.

테스트 케이스 작성시 테스트할 데이터를 만들고, 실제로 테스트할 메소드를 호출한 후 assertThat이나 Assertions.assert.isEqualTo()를 사용하여 검증한다.

 

테스트끼리는 순서에 의존적이면 안된다. 아래의 사진같은 경우는 순서에 의존적이게 되어 테스트가 실패한케이스이다.

 

 

위의 사진에 findByName()이 실패했다. 

순서를 보면 findAll()부터 테스트가 작동한 것을 확인할 수 있다. 이때 name이 'spring1'인 member1이 참조하는 member인스턴스가 만들어졌다.

이후 findByName()테스트 메소드에서도 'spring1' name이 저장된 member1 객체를 만들어 save하여 중복이 발생한다.

둘의 sequence ID는 다르고, HashMap은 value 중복 저장이 가능하기 때문에 name으로 검색을 하면 원치 않는 결과를 가져올 것이기 때문에 정확한 테스트가 되지 않는 것이다.

 

순서 의존도를 없애기 위해 clear를 해줘야 한다.

 

 

MemoryMemberRepository에 메소드 clearSTore( )를 만든 후, @AfterEach 어노테이션을 적용한 메소드를 만든다.

@AfterEach를 붙이면 각 테스트 실행 후 콜백하는 메소드 함수를 만들 수 있다.

이후 테스트를 실행시키면 순서 의존도 없이 테스트가 성공하는 것을 확인할 수 있다.

 

@AfterEach 순서 의존도 없이 실행이 된다.

 

4 ) 회원 서비스 개발

단축기

  • 메소드 추출(Extract Method) : Ctrl + Alt + m

리포지토리 테스트가 끝난 후, 실제 서비스단을 만든다.

 

 

5 ) 회원 서비스 테스트

단축기

  • 테스트 만들기 단축기 : 테스트 클래스에서 Ctrl + Shift + t

MemberServiceTest를 단축키로 만든다.

기존 MemberService에서 MemberRepository를 new로 바로 인스턴스 생성하던 것을 DI방식으로 변경한다.

변경전
변경후

 

테스트 클래스에서 MemberService가 DI를 받을 수 있게 초기화한다.

테스트 코드를 작성할 때는 //given, //when, //then 주석을 미리 세팅하고 작성하면 테스트 코드를 작성하기 쉬워진다.

 

Service 테스트 중, 중복회원예외 테스트를 실행했다.

같은 이름을 가진(getName("spring"))Member 인스턴스를 만든다음 join( )을 시도해본다.

중복 회원이 있으면 throw 할 수 있도록 처리해놨기 때문에 이를 확인하는 테스트가 필요하다.

 

예외 발생시 catch로 넘겨 철하는 방법과 assertThrows를 사용하는 2가지 방법이 있다.

 

출처 : 인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한

반응형