회원관리 예제
- 회원 객체
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() · 테스트를 바로 실패처리
'공부 > Spring' 카테고리의 다른 글
스프링 웹개발 기초 (0) | 2021.10.20 |
---|---|
자바 - Map (0) | 2021.10.19 |
자바 - Set (0) | 2021.10.18 |
자바 - 컬렉션(List) (0) | 2021.10.15 |
자바 - 제네릭 (0) | 2021.10.14 |