728x90

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

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

본 블로그는 해당 스프링 강의(김영한) 수강 후, 작성된 게시물입니다.


회원 서비스 개발

회원 서비스는 회원 레포지토리와 도메인을 활용해서 실제 비즈니스 로직을 작성하는 화면

레포지토리는 단순히 저장소에 넣었다 뺏다하는 느낌
서비스는 비즈니스에 가까운?

service와 repository 함수 이름 생성
repository : 단순한 기계적으로 개발스럽게 이름 사용 (그저 데이터를 넣었다 빼는 동작을 일컫도록)
service : 비즈니스에 의존적으로 설계 (비즈니스에 가까운 용어를 사용하여, 명확한 역할과 매칭되도록 )

1. 폴더 구성

service 폴더를 생성한 후, MemberService 클래스를 생성한다.

2. 회원가입 생성

회원 가입을 하는 join 함수를 생성한다. 8번째 줄에 레포지토리를 선언한다. 중복 회원 검증에 대한 방법은 크게 3가지가 있으며, 여기서는 방법[3]을 사용한다.

▼ 회원가입 생성 함수

방법[3]을 사용하도록 하겠다.

3. 회원 조회 생성

전체 회원 조회와 회원 조회 함수를 생성한다.


회원 서비스 테스트

 

1. 테스트 케이스 생성

① 서비스 클래스에서 단축키를 사용하여 Create New Test를 클릭한다.

ctrl + shift + T (for Window) / commend + shift + T (for Mac)

② Create New Test 생성

Testing library는 JUnit5, Class Name은 디폴트로 지정해준 MemberServiceTest, 맨 아래 테스트할 함수를 체크박스로 체크 후, OK를 클릭

③ 테스트 케이스 클래스 생성

다음과 같이 테스트 케이스 클래스가 생성된 것을 확인할 수 있다.

 

2. 테스트 케이스 작성

테스트의 구조
1. given (제공)
2. when (조건)
3. then (결과)

무언가 주어졌을때(given), 이런 조건으로(when), 이런 결과가 나와야해(then)

※ 테스트는 과감하게 한글로 작성해도 된다!!

① 회원가입 테스트 작성

다음과 같이 회원가입 테스트를 작성한 후, 실행을 시켜 잘 동작하는지 확인한다.

member.setName("hello"); // member에 hello라는 이름을 넣고,
Long saveId = memberService.join(member); // 회원가입 후, 회원가입한 id를 반환받는다.
Member findMember = memberServie.findOne(saveId).get(); // 해당 아이디의 member로 반환받는다.
assertThat(member.getName()).isEqualTo(findMember.getName()); // 회원가입하려는 이름(member.getName())과 회원가입이 완료된 이름(findMember.getName())이 일치한지 검증한다.

▽ Assertions

더보기

Assertions는 assertj를 사용

org,assertj.core.api 사용

▽ static import

더보기

Assertions를 static import를 하여 사용한다.

alt + enter (for Window) / command + enter (for Mac)
다음과 같이 static으로 import가 되며, 맨 아래 assertThat은 Assertions 없이 사용할 수 있다.

 

② 중복 회원가입 테스트 작성

→ 회원가입에서 중요한 중복검증을 따로 작성하여 테스트 확인

예외가 터져야하는 경우를 테스트하는 방법은 3가지가 있다. 하나는 try-catch로 감싸기, 다른 하나는 assertThat 사용, 마지막 하나는 assertThat에서 메세지까지 검증하는 방법이다.


주의!!!!

테스트에서 항상 데이터 클리어를 해주어야 한다.

그래서 MemoryMemberRepository 변수를 선언한 후, @AfterEach 어노테이션을 선언하여 테스트 메소드가 돌때마다 memoryMemberRepository를 클리어해주는 작업을 실행한다.


문제점 발견!!!

MemberService에서 new MemoryMemberRepository()랑, MemberServiceTest에서 new MemoryMemberRepository()가 서로 다른 레포지토리라는 점.

물론 MemoryMemberRepository에 store를 static으로 선언하여 상관은 없지만, static으로 선언하지 않으면 다른 DB가 되어 문제가 생기게 된다.


해결 방법 - DI(dependency Injection)

MemberService에서 new로 생성한 memoryMemberRepository를 삭제하고, 그 아래에 생성자를 생성한다.

MemberServiceTest에서 @BeforeEach 어노테이션을 선언하여 메소드 실행 전, 실행하는 함수를 작성한다.

생성자 생성 단축키 : alt + insert (for Window)
OK 클릭
MemberService 입장에서는 자기가 직접 객체를 생성(new)하지 않고, 외부에서 생성한 객체를 넣어주므로써 DI가 적용된다. dependency Injection!!!!

 

728x90

+ Recent posts