반응형

회원관리 예제


  • 회원 객체
package hello.hellospring.domain;

public class Member {
    //id식별자와 이름이 요구됨
    private Long id;
    private String name;

    //getter, setter생성
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

  • 회원 리포지토리 인터페이스
package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.List;
import java.util.Optional;

//회원 객체 저장소
public interface MemberRepository {
    Member save(Member member);//저장소에 회원 저장
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    //optional 가져오는 값이 없으면 null일 수 잇음(NPE 방지)
    List<Member> findAll();//저장된 모든 회원 리스트 반환
}

 

  • 회원 리포지토리 메모리 구현체
package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository{

    //key는 long 값은 Memeber로
    private  static Map<Long, Member> store = new HashMap<>();//hashmap객체 map 생성(key는 long, value는 member
    private static long sequence = 0L;//0부터 키값 생성해줌

    @Override
    public Member save(Member member) {
        //id값 세팅후 store에 저장
        member.setId(++sequence);//save시 시퀀스값 올려줌
        store.put(member.getId(),member);

        return member;
    }

    @Override
    //store에서 꺼내서 찾으면됨
    public Optional<Member> findById(Long id) {
        //return store.get(id); => null이 반환될수도 있음
        return Optional.ofNullable(store.get(id));//NPE가 발생되지 않게 Optional로 감싸줌
    }

    @Override
    //store에서
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                //stream은 iterator와 유사 => 요소를 순차적 처리, stream()은 stream객체로 반환
                .filter(memeber -> memeber.getName().equals(name))//member 객체를 받아서 equal하면 리턴
                .findAny();//filter로 찾은 값 중 아무값이나 하나 선택
        //루프를 돌면서 찾아지면 반환함, 끝까지 돌려서 없으면 Optional에 null이 포함되어 반환
    }

    @Override
    public List<Member> findAll() {
        //리스트로 반환
        //매개변수로 넘어온 컬렉션 객체가 저장되어 있는 ArrayList를 만듦
        //values는 값의 목록을 Collection 타입으로 리턴함
        return new ArrayList<>(store.values());
    }

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

 

 

  • 회원 리포지토리 메모리 구현체 테스트
package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.junit.jupiter.api.Test;

//굳이 public하지 않아도됨 어디서 가져다 쓰지 않기 때문에
class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository= new MemoryMemberRepository();

    @Test// 테스트를 수행하는 메소드가 된다.
    public void save(){
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        //반환타입이 Optional이므로 값을 꺼낼때 get으로 꺼냄냄
        //get() 메소드를 사용하면 Optional 객체에 저장된 값에 접근할 수 있습니다.
        //Optional<Member>이므로
        Member result = repository.findById(member.getId()).get();
        System.out.println("result = "+(result == member));

    }
}

 

 

출력하여서 확인하여도 된다.

 

출력하지 않고서 확인하는 법은

Assertion을 사용하는 것이다.

 

Assertions.assertThat(member).isEqualTo(result);

를 사용하여도 된다.(org.assertj.core.api)

 

 

    @Test
    public void findByName(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

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

        Assertions.assertThat(result).isEqualTo(member1);

 

정리하면

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

//굳이 public하지 않아도됨 어디서 가져다 쓰지 않기 때문에
class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach//메소드가 끝날때 마다 동작
    //test시 member객체를 계속 만들어서 중복이 되버리므로
    public void afterEach(){
        repository.clearStore();
    }

    @Test// 테스트를 수행하는 메소드가 된다.
    public void save() {
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        //반환타입이 Optional이므로 값을 꺼낼때 get으로 꺼냄냄
        //get() 메소드를 사용하면 Optional 객체에 저장된 값에 접근할 수 있습니다.
        //Optional<Member>이므로
        Member result = repository.findById(member.getId()).get();
        //System.out.println("result = "+(result == member));
        //Assertions.assertEquals(member, null);
        Assertions.assertThat(member).isEqualTo(result);

    }

    @Test
    public void findByName() {
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

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

        Assertions.assertThat(result).isEqualTo(member1);
    }

    @Test
    public void findAll() {
        Member member1= new Member();
        member1.setName("Spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        List<Member> result = repository.findAll();
		//크기가 2인지 확인한다.
        Assertions.assertThat(result.size()).isEqualTo(2);
    }

}

=> 자바는 Junit이라는 프레임워크로 테스트를 실행한다.

(main메소드나 웹 애플리케이션의 컨프롤러를 통하여 테스트할 경우 오래걸리고 반복실행, 여러테스트를 한번에 실행하기 어렵다.)

  • JUnit

    자바에서 독립단위 테스트(Unit Test)를 지원해주는 프레임워크

    assert메소드로 테스트케이스의 수행결과를 판별한다.

    @Test : 테스트를 수생하는 메소드 (각각 테스트가 서로 영향을 주지 않고 독립적으로 실행, @Test마다 객체를 생성)

    @AfterEach, BeforeEach : Test메소드가 실행될때 호출됨(각각 메소드 실행 후, 실행전 호출)

    @AfterAll, BeforeAll : 클래스에 존재하는 모든 메소드를 실행한다고 할때, 메소드 시작전, 끝난후에 실행됨

    메소드설명
    assertEquals(x, y)· 객체 x와 y가 일치함을 확인합니다.· x(예상 값)와 y(실제 값)가 같으면 테스트 통과
    assertArrayEquals(a, b);· 배열 A와 B가 일치함을 확인합니다.
    assertFalse(x)· x가 false 인지 확인합니다.
    assertTrue(x)· x가 true 인지 확인합니다.
    assertTrue(message, condition)· condition이 true이면 message표시
    assertNull(o)· 객체o가 null인지 확인합니다.
    assertNotNull(o)· 객체o가 null이 아닌지 확인합니다.
    assertSame(ox, oy)· 객체 ox와 oy가 같은 객체임을 확인합니다.· ox와 oy가 같은 객체를 참조하고 있으면 테스트 통과· assertEquals()메서드는 두 객체의 이 같은지 확인하고, assertSame()메서드는 두 객체의 레퍼런스가 동일한가를 확인합니다. (== 연산자)
    assertNotSame(ox, oy)· ox와 oy가 같은 객체를 참조하고 있지 않으면 통과
    assertfail()· 테스트를 바로 실패처리

 

728x90
반응형

'공부 > Spring' 카테고리의 다른 글

스프링 웹개발 기초  (0) 2021.10.20
자바 - Map  (0) 2021.10.19
자바 - Set  (0) 2021.10.18
자바 - 컬렉션(List)  (0) 2021.10.15
자바 - 제네릭  (0) 2021.10.14
블로그 이미지

아상관없어

,