비즈니스 요구사항
- 데이터: 회원ID, 이름
- 기능: 회원 등록, 조회
- 아직 데이터 저장소가 선정되지 않음(가상의 시나리오)
- 컨트롤러: 웹 MVC의 컨트롤러 역할
- 서비스: 핵심 비즈니스 로직 구현(ex: 회원중복가입X) -> 비즈니스적인 용어사용하기
- 리포지토리: DB에 접근, 도메인 객체를 DB에 저장하고 관리 -> 기계적인, 개발적인용어선택
- 도메인: 비즈니스 도메인 객체 예)회원, 주문, 쿠폰 등등 주로 DB에 저장하고 관리됨
회원리포지토리 -> interface로 설계
why?? 아직 DB선정 X
우선 메모리 구현체로 만듦
향후에 구체적 기술이 선정되면 바꿀거임
따라서 인터페이스를 사용
Optional<T> java8에들어간기능
Null이반환될때 처리방법 -> Optional을 많이사용
감싸사 반환하면 클라이언트에서 뭘 할수가있음.
Optional 로 감싸면 안에 메소드들을 활용할 수있음.ex) ifPresent
.get() method로 값을 꺼낼수있음. -> 바로꺼내는게 좋은 방법은 아니지만 테스트케이스는 가능
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m->{
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
위의 예시는 이쁘지 않다.
memberRepository.findByName(member.getName())
.ifPresent(m->{
throw new IllegalStateException("이미 존재하는 회원입니다.")
});
이렇게 변경가능.
store.values().stream().filter(member -> member.getName().equals(name)).findAny()
람다식 사용
filter-> True 인것만 걸러냄
findAny() -> 찾으면 반환함 , Optional로 감싸서 자동반환
Java -> 문자열비교시 equals함수사용
return new ArrayList<>(store.values());
ArrayList 초기화시 안에 collection 형이 오면 ArrayList로 초기화가능
TEST CASE 작성 이유
main 메서드를 통해 실행하면 실행하는데 오래걸리고, 반복실행이 어렵고, 여러테스트를 한번에 실행하기 어렵다는 단점이 있다.
따라서 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이런 문제를 해결한다.
1. 테스트 클래스는 테스트할 자바클래스이름뒤에 Test를 추가해서 이름 지음.
@Test
public void save(){}
test 어노테이션 사용 후 실행가능
System.out.println("result =" + (member == result));
위 방법처럼 직접 출력시킬 수 있지만 보통 Assert를 사용
Assertions.assertEquals(member,result); // junit version
직접 프린트되진 않지만 테스트해줌. (기대하는거, 실제들어온거)
junit 버전과 assertj 버전이 있음 후버전을 많이 씀.
Assertions.assertThat(member).isEqualTo(result); //assertj version
alt + enter 시 Assertions 생략후 사용가능
assertj -> 바로 읽힘.
Test 시 주의점
Test의 순서는 보장이 안됨. 따라서 의존관계없이 설계가 되어야함.
수행 마다 결과가 중복돼서 제대로된 테스트가 안될 수도 있음.
따라서 한 테스트 수행때마다 repository를 원상태로 돌려놔야함.
test method 이름은 한글로 적어도 됨. ex) 회원_가입
@AfterEach -> 테스트끝날때마다 수행
테스트 메서드 수행 주석(그러나 상에 따라 안맞을수도있으므로 변형하면서 하기)
//given -> 이 데이터 기반으로 하는군
//when -> 이걸 검증하는구나
//then
@Test
public void 중복_회원_예외(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
try{
memberService.join(member2);
}
catch{
}
//then
}
중복회원 test시 try catch로 해도 되지만 조금 번거로움.
@Test
public void 중복_회원_예외(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class,
() -> memberService.join(member2));
//then
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
assertThrows(이런예외가 발생해야함,이걸했을때) -> 사용가능
'Spring > 스프링입문' 카테고리의 다른 글
[스프링입문] 섹션6-1. 스프링 DB 접근 기술 - Jdbc, JdbcTemplate (0) | 2023.01.17 |
---|---|
[스프링입문] 섹션5. 회원관리 예제 - 웹MVC개발 (0) | 2023.01.17 |
[스프링입문] 섹션4. 스프링 빈과 의존관계 (2) | 2023.01.16 |
[스프링입문] 섹션2. 스프링 웹 개발 기초 (0) | 2023.01.12 |
[스프링입문] 섹션1. 프로젝트 환경 설정 (0) | 2023.01.12 |