스터디/스프링

스프링 공부 일지 - 간단한 회원 관리와 테스트 케이스 만들기!!

sleesm 2022. 10. 9. 17:40

 

 

 

오늘은 간단한 회원 관리를 해보고 테스트 케이스를 만들어보고자 한다!!

 

 

지난 블로그 👉👉

2022.10.07 - [스터디/스프링] - 스프링 공부 일지 - 스프링 웹 개발 방법 3가지

 

스프링 공부 일지 - 스프링 웹 개발 방법 3가지

오늘은 스프링의 웹 개발 방법을 간단하게 확인해보는 시간을 가졌다!! 저번 블로그 👉👉 2022.10.05 - [스터디/스프링] - 스프링 공부 일지 - Thymeleaf 를 사용한 View 페이지 만들기! 스프링 공부 일

sleecode.tistory.com

 

 

 

 

 

 

 

 

 

 


 

 

 

회원관리에 앞서 

 

웹 애플리케이션의 계층 구조를 살펴보고자 한다!!!

 

Spring 에서 사용되는 웹 앱 계층 구조

 

 

Repository는 DB에 접근하여, 도메인 객체를 DB에 저장하고 관리할 수 있다.

  • 스프링 부트의 DAO 클래스에서도 사용한다.
  • 기본적으로 JAVA에서 interface를 만들어서 구현하고,
  • JPA Repository를 사용하는 것이 일반적이다.

https://www.educba.com/spring-boot-repository/ 👉 스프링 부트에서 repository의 역할

 

 

 


DAO(Data Access Object) 는 

실제 DB에 접근하기 위해 생성하는 객체를 의미한다.

 

DTO(Data Transfer Object)

계층 간 데이터 교환을 위한 자바 빈즈를 의미한다.

일반적으로 순수한 데이터의 객체이며, getter와 setter 메서드만 가지고 있다.


 

 

 

 

 

 

 

 

 

Service는 Repository(DAO)로 접근하여 가져온 DTO를 사용해, 비즈니스 로직을 수행하는 부분이다.

  • 요청받은 URL에 맞는 Controller가 수신 받음
  • Controller가 요청을 처리하기 위해 Service 호출
  • Service에서 가공한 정보를 Controller에 전달
  • Controller가 Service의 결과물을 전달

 

 

 

 

 

 

Controller는 2가지로 요청을 처리할 수 있다. (이전 글 참고)

  • 요청에 맞는 View 전달
  • 요청에 맞는 데이터 JSON(XML)으로 전달

 

 

 

 

 

 

 

 

 


 

이제 회원 관리를 위한 코드를 작성해보자!!!!

 

 

 

 

 

☝ 먼저 회원 객체를 위한 도메인 만들기!!

 

는 간단하다.

그냥 domain package를 만들고 Member class를 만들어서

필요한 필드를 채워주고 Getter/Setter 함수를 만들어주면 끝!!!

 

 

 

 

 

 

 

 

 

 

✌ 다음은 Repository 만들기!!! 

 

 

인터페이스를 중심으로 뻗어 나갈 것이기 때문에 

먼저 Interface를 만들어준다!!

 

MemberRepository interface

 

 

그리고 인터페이스에 따라 

구현할 MemoryMemberRepository를 얼렁뚱땅 만들면 된다!!! 😁😁😁

 

 

 

 

 

 

 

 

 

 


 

 

 

여기서 사용되는 Optional<T>와 Stream 에 대해 잠시 이야기하고자 한다!!!

 

( 둘 다 Java 8 이후부터 제공되는 클래스들이다!! )

 

 

 

 

 

먼저 Optional<T>는 Wrapper 클래스 중 하나이다!

예상치 못한 NPE(NullPointerException) 에 특화된 클래스라고 할 수 있다!!

 

 

 

 

Optional.of() 혹은 Optinal.ofNullable() 을 통해 객체를 생성한다.

  • of() 메소드의 경우 null이 저장되면 NPE가 발생하니 주의해야 한다!!
  • ofNullable() 메서드는 null이 될 가능성이 있을 경우에 사용한다
    • null이라면 비어 있는 Optional 객체를 반환한다
    • isPresent()메서드를 통해 null 값인지 확인할 수 있다!

 

Optional.ofNullable() 을 통한 객체 생성 예시 in MemoryMemberRepository
Optional의 ifPresent() 메소드 사용 예시 in MemberService

 

 

 

 

 

 

 

 

 

다음으로 Stream은 Iterator 객체를 대신하여 나온 클래스라고 할 수 있다!

 

내가 기억하는 java 의 stream은 InputStream인데,, 언제 이런 게 나온거지,,

난 자바를 몰라도 한참 모르나 보다,,

요새 새로 자바 책을 살까도 고민 중,,,

 

 

컬렉션 객체에서 stream() 메서드를 호출해 스트림 객체를 만들 수 있다!!

람다를 사용해 필터링하고 가공된 결과를 얻을 수 있다는 장점이 있다!!! 👍👍👍

 

아무튼 람다에 대해 간단하게 설명하고,

그래서 람다를 어떻게 사용하냐면 filter() 메소드를 사용할 것이다!!!

 

 

filter()는 말 그대로 stream에서 나오는 데이터에서 특정 데이터를 골라내는 역할을 한다!!

 

조건식처럼 쓸 수 있는 느낌인 것이다!!!

 

라고 받아들였다 ^_^

 

 

stream().filter()의 예시 in&nbsp;MemoryMemberRepository

 

 

 


 

 

 

 

 

 

 

이렇게 해서 간단하게 도메인과 리파지토리를 만들어보았다!!

 

 

🤟 다음으로 서비스를 만들어야 하는데

 

service package를 만들고 그 안에

MemberService 클래스를 만들어준다!

 

 

앞서 만든 memberRepository를 사용하는 service를 작성해주면 뚝딱!!!! 😁😁

 

간단하게 join 하는 함수와 중복 확인 함수, 그리고 회원 조회 함수를 만들어 보았다!!

MemberService의 메소드들

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

대충 넘어가는 것 같지만, 아무튼

 

이제 Test Case를 사용해보고자 한다!!

 

 

 

 

 

테스트 케이스는 동작하는지 확인하기 위해 사용한다

Java의 JUnit framework를 사용할 것이다!!

 

 

 

 

그냥 간단하게

원하는 클래스에서 Ctrl + Shift + T  를 누르고,

Create Test를 하면 다음과 같은 창이 뜬다!!

 

Test case를 만드는 예시

 

이렇게 손쉽게 테스트 클래스를 만들 수 있다!!!

 

그리고 그 안에 테스트 내용을 작성하면 된다!

만들어진 테스트 케이스 예시

 

 

 

MemoryMemberRepositoryTest 에서 

 

새로운 Member 객체를 만들고 repository에서 받아온 다음,

받아온 객체와 만든 객체가 동일한 지 확인하는 형태로 save() 함수를 테스트해봤다!!

 

 

 

이 과정에서 객체끼리 비교하는 방법이 크게 3가지가 있다!!!

 

  • System.out.println() 을 사용해 콘솔 창에 직접 확인해보기!
System.out.println("result = " + (result == member));

 

 

  • org.junit.jupiter.api.Assertions 사용하기!
Assertions.assertEquals(member, null);

 

 

 

  • org.assertj.core.api.Assertions 사용하기!
    • Alt + Enter 를 눌러서 static으로 만들면 asserThat()을 바로 사용할 수 있다!
Assertions.assertThat(member).isEqualTo(result);

 

 

 

 

 

 


AsserJ의 Assertions vs. JUnit의 Assertions

 

 

https://annaduldiier.medium.com/assertj-vs-junit-483b7d6dc997

 

AssertJ vs JUnit

Use AssertJ for fluent and more readable assertions.

annaduldiier.medium.com

 


 

 

 

 

 

 

 

 

 

 

 

테스트를 돌릴 때 주의해야 하는 점이 있다!!

 

모든 테스트의 순서는 랜덤이라는 점이다


그렇기 때문에 이전 테스트에서 repository에 저장한 값들을 reset 해줄 필요가 있다!!!!

 

그래서 사용하는 것이 @AfterEach  이다!!

 

 

그전에 먼저, 

MemoryMemberRepository에서 저장한 것을 reset 해주는 함수가 추가되어야 한다!

public void clearStore(){
        store.clear();
    }

 

 

이후, 테스트 케이스에 @AfterEach 어노테이션과 함께

앞서 만든 clearStore() 함수를 넣어주면,

매 테스트가 종료될 때마다 이 기능을 실행하게 된다!!!

@AfterEach
public void afterEach(){
    repository.clearStore();
}

 

 

 

그럼 이렇게 테스트 실행이 성공적으로 된다!!!!

MemoryMemberRepositoryTest 테스트 케이스 실행 결과

 

 

 

 

 

 

서비스 테스트에서 사용되는

 

새로운 어노테이션인 @BeforeEach 가 있다!!

 

 

테스트를 진행할 때마다 사용되는 repository와 service를 달리하기 위해 사용되는 어노테이션으로

테스트를 진행하기 직전에 함수를 호출해준다!!!

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

 

 

@AfterEach와 @BeforeEach는 

클래스에서 사용되는 생성자와 소멸자의 느낌이다

 

 

 

 

 

 

 

 

 

 

 

 

그리고 테스트를 하기 위해 기억하면 좋을 문법이 있다

 

바로 Given-When-Then 형식이다!!

 

  • Given 은 뭔가가 주어지는 상황이다

  • When은 이것을 실행했을 때이다

  • Then은 실행한 결과이다

 

아래와 같이 코드와 함께 보면 어떤 상황인지 확실히 알 것이다!!

    @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("spring");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

 

 

 

이렇게 쓰면 어떤 테스트 케이스를 쓸 때도, 쉽게 작성할 수 있다고 한다!!! (By 김영한 강사님)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

아무튼 이렇게 해서 도메인, 리파지토리, 서비스를 사용한

간단한 회원관리 코드와 테스트 케이스까지 작성해봤다!!!😊😊😊😊

 

 

 

 

 

 

 

 

 

 

 


날 위한,, 

 

Window에서 사용하는 InteliJ에서 사용하기 좋은 단축키들!

Ctrl + P                             정보 확인
Alt + Insert                       GetSet 만들기
Shift + F6                         변수 이름 변경 (복붙하고 나서 변수 이름 변경할 때 사용하기 좋음)
Ctrl + Alt + V                     return 값에 맞추어 객체를 만들어 값 할당까지 자동으로 해줌
Ctrl + Alt + M                   extract method 하기 (작성한 코드를 method로 만들어 밖으로 빼낼 수 있음)
Ctrl + Alt + L                     코드 자동 정렬
Ctrl + Shift + T                 테스트 케이스 만들기

 

 

 

 

 

 

 

 

 

 

 

 


아무튼 이렇게 해서 드디어 오늘의 글이 끝났다!!

왜 이렇게 길어졌냐고 물으신다면

카카오 데이터 센터 사건으로 인해 블로그 글이 밀렸기 때문이죠,,, 😂😂😂😂

 

중간에 글도 조금 날려서 다시 쓰느라 너무 힘들었즤만

뿌듯합니다,,하하하

 

앞으로도 강의가 많이 남아서 조큼 슬프고

아직 밀린 글이 있어 슬프지만

뿌듯하게 하루를 마무리하며

 

 

그럼 안녕!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌