Study / / 2022. 2. 11. 15:10

[김영한 스프링 강의 1] 회원 관리 예제

[요약]

1.비즈니스 요구사항을 정의

-데이터 : 회원 ID, 이름

기능 : 회원 등록, 조회

 

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

  - 도메인은 Member 클래스를 정의

  - 리포지토리는 Interface와 Class파일로 나뉘는데

전자는 기능의 정의를 통해 상속받을 수 있도록 하기 위함

후자는 실제 기능을 구현한다.

ex) 아래와 같음

[인터페이스]
Member save(Member member);


[클래스]
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

 

3.테스트 케이스 작성

테스트 케이스 작성시 @Test 어노테이션을 사용한다.

테스트 하려는 repository를 new하여 객체를 생성하고 각각의 메서드를 테스트할 수 있는 코드를 작성한다.

이때 테스트를 하는데 repository에 동시에 값이 들어가 정상적인 테스트가 실패하는 경우가 생긴다.

ex) 아래와 같음

@Test
public void findByName(){
    Member member1 = new Member();
    member1.setName("spring1"); 
    repository.save(member1); //member1 생성함  1


    Member member2 = new Member();
    member2.setName("spring2"); 
    repository.save(member2); //member2 생성함 2

    Member result = repository.findByName("spring1").get();

    assertThat(result).isEqualTo(member1);
}

 @Test
    public void findAll(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1); //member1 생성함  1

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2); //member1 생성함  1

        List<Member> result = repository.findAll();

        assertThat(result.size()).isEqualTo(2);

    }

이를 해결하기 위해서 @afterEach 라는 각각의 테스트 케이스 실행 후에 동작하는 어노테이션을 이용한다.

1.초기화 하려는 객체 내부에 store.clear(); 코드를 가진 메서드 생성

2.테스트 케이스에서 해당 메서드를 구현하고 @AfterEach를 붙여주어 케이스가 끝나면 store.clear();

 

모든 테스트 케이스는 순서와 상관없이 메서드별로 따로 동작하게 만들어야 하며,

순서에 의존적이면 절대 안된다.

 

4.회원 서비스 개발

회원 서비스는 실제로 동작하는 비즈니스 로직을 구현하는 메서드를 만든다.

repository에는 save , findById, findAll과 같은 기계적인 메서드를 만든다.

중복된 값을 체크할때는 optional<> 제네릭 타입을 이용하며, ifPresent를 이용해 간결한 코드 작성이 가능

 

5.테스트 케이스 작성

  • 테스트 케이스를 만들려고 하는 클래스에 ctrl+shift+T 단축키를 사용하여 테스트 케이스 작성을 쉽게한다.              
  • 테스트 케이스 매서드명은 한글로도 사용이 가능하며, 해당시 직관적으로 보기 쉽다.                                                 
  • assertThat(검증할 데이터).isEqualTo(검증할 데이터2)를 사용하여 두 값이 같은지 테스트가 가능하다.                                               
  • 테스트 케이스는 given, when, then으로 나뉘어 작성하는게 좋다. 각각 주어지는 데이터로, 어떤 상황에, 어떤 결과가 나올지 생각하여 코드를 나누어 테스트를 작성한다. 이와 같이 작성하면 직관적으로 어떤 데이터를 이용해서 어떤 기능을 테스트 하는구나~ 를 알 수 있다.

exception등의 예외를 테스트할때 

assertThrows(IllegalStateException.class,() -> memberService.join(member2));

의 형태로 사용이 가능하다.

 

동일한 에러가 발생했는지 확인하기 위해서는

assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

의 형태로 확인할 수 있다.

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유