오늘은 간단한 회원 관리를 해보고 테스트 케이스를 만들어보고자 한다!!
지난 블로그 👉👉
2022.10.07 - [스터디/스프링] - 스프링 공부 일지 - 스프링 웹 개발 방법 3가지
스프링 공부 일지 - 스프링 웹 개발 방법 3가지
오늘은 스프링의 웹 개발 방법을 간단하게 확인해보는 시간을 가졌다!! 저번 블로그 👉👉 2022.10.05 - [스터디/스프링] - 스프링 공부 일지 - Thymeleaf 를 사용한 View 페이지 만들기! 스프링 공부 일
sleecode.tistory.com
회원관리에 앞서
웹 애플리케이션의 계층 구조를 살펴보고자 한다!!!
Repository는 DB에 접근하여, 도메인 객체를 DB에 저장하고 관리할 수 있다.
- 스프링 부트의 DAO 클래스에서도 사용한다.
- 기본적으로 JAVA에서 interface를 만들어서 구현하고,
- JPA 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를 만들어준다!!
그리고 인터페이스에 따라
구현할 MemoryMemberRepository를 얼렁뚱땅 만들면 된다!!! 😁😁😁
여기서 사용되는 Optional<T>와 Stream 에 대해 잠시 이야기하고자 한다!!!
( 둘 다 Java 8 이후부터 제공되는 클래스들이다!! )
먼저 Optional<T>는 Wrapper 클래스 중 하나이다!
예상치 못한 NPE(NullPointerException) 에 특화된 클래스라고 할 수 있다!!
Optional.of() 혹은 Optinal.ofNullable() 을 통해 객체를 생성한다.
- of() 메소드의 경우 null이 저장되면 NPE가 발생하니 주의해야 한다!!
- ofNullable() 메서드는 null이 될 가능성이 있을 경우에 사용한다
- null이라면 비어 있는 Optional 객체를 반환한다
- isPresent()메서드를 통해 null 값인지 확인할 수 있다!
다음으로 Stream은 Iterator 객체를 대신하여 나온 클래스라고 할 수 있다!
내가 기억하는 java 의 stream은 InputStream인데,, 언제 이런 게 나온거지,,
난 자바를 몰라도 한참 모르나 보다,,
요새 새로 자바 책을 살까도 고민 중,,,
컬렉션 객체에서 stream() 메서드를 호출해 스트림 객체를 만들 수 있다!!
람다를 사용해 필터링하고 가공된 결과를 얻을 수 있다는 장점이 있다!!! 👍👍👍
아무튼 람다에 대해 간단하게 설명하고,
그래서 람다를 어떻게 사용하냐면 filter() 메소드를 사용할 것이다!!!
filter()는 말 그대로 stream에서 나오는 데이터에서 특정 데이터를 골라내는 역할을 한다!!
조건식처럼 쓸 수 있는 느낌인 것이다!!!
라고 받아들였다 ^_^
이렇게 해서 간단하게 도메인과 리파지토리를 만들어보았다!!
🤟 다음으로 서비스를 만들어야 하는데
service package를 만들고 그 안에
MemberService 클래스를 만들어준다!
앞서 만든 memberRepository를 사용하는 service를 작성해주면 뚝딱!!!! 😁😁
간단하게 join 하는 함수와 중복 확인 함수, 그리고 회원 조회 함수를 만들어 보았다!!
대충 넘어가는 것 같지만, 아무튼
이제 Test Case를 사용해보고자 한다!!
테스트 케이스는 동작하는지 확인하기 위해 사용한다
Java의 JUnit framework를 사용할 것이다!!
그냥 간단하게
원하는 클래스에서 Ctrl + Shift + T 를 누르고,
Create Test를 하면 다음과 같은 창이 뜬다!!
이렇게 손쉽게 테스트 클래스를 만들 수 있다!!!
그리고 그 안에 테스트 내용을 작성하면 된다!
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();
}
그럼 이렇게 테스트 실행이 성공적으로 된다!!!!
서비스 테스트에서 사용되는
새로운 어노테이션인 @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 테스트 케이스 만들기
아무튼 이렇게 해서 드디어 오늘의 글이 끝났다!!
왜 이렇게 길어졌냐고 물으신다면
카카오 데이터 센터 사건으로 인해 블로그 글이 밀렸기 때문이죠,,, 😂😂😂😂
중간에 글도 조금 날려서 다시 쓰느라 너무 힘들었즤만
뿌듯합니다,,하하하
앞으로도 강의가 많이 남아서 조큼 슬프고
아직 밀린 글이 있어 슬프지만
뿌듯하게 하루를 마무리하며
그럼 안녕!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌🙌
'스터디 > 스프링' 카테고리의 다른 글
스프링 공부 일지 - 웹 MVC 개발 (0) | 2022.11.01 |
---|---|
스프링 공부 일지 - 스프링 빈과 의존관계? 그게 뭔데? (0) | 2022.10.19 |
스프링 공부 일지 - 스프링 웹 개발 방법 3가지 (0) | 2022.10.07 |
스프링 공부 일지 - Thymeleaf 를 사용한 View 페이지 만들기! (0) | 2022.10.05 |
스프링 공부 일지 - 스프링 프로젝트 처음 오픈!! (0) | 2022.08.06 |