[Spring] 02-3. 회원 도메인 실행 및 테스트

지찬우·2022년 12월 20일
0

Spring

목록 보기
7/27
post-thumbnail

이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)

GitHub Repository : https://github.com/jcw1031/spring-core-study


회원 서비스 실행과 테스트

오늘은 우리가 만든 회원 서비스 코드를 실행해 보고 테스트를 해보자. 회원 객체 다이어그램을 만드는 것이다. 우선 main에서 실행해 보자.

🧪 main()을 사용한 테스트

우선 src/main/java/Group이름.core 경로에(member 패키지가 있는 위치) MemberApp 클래스를 생성한다.


main 메서드를 만든다. main을 입력하고 Tab 또는 Enter를 누르면 자동으로 완성된다.


그럼 이제 이 MemberApp의 main에서 회원 서비스가 잘 작동하는지 확인해 보자. 회원 서비스를 사용하기 위해 MemberService 인터페이스를 선언하고, MemberServiceImpl을 생성한다.

사실 이미 DIP는 지켜지지 못했다. 일단 계속 진행하고, 나중에 다시 문제점에 대해 논하고 어떻게 할지 얘기하도록 하겠다.


이제 회원 객체를 생성한다. 여기서 꿀팁은 첫 번째와 같이 new Member()를 입력하고, 단축키를 사용하면 두 번째 처럼 반환 형식에 맞춰 자동으로 입력된다. (빨간 박스에 객체 이름을 입력하고 Enter를 누르면 된다.) id는 1(L은 Long 타입), 이름은 “woopaca”, 등급은 VIP인 회원을 생성했다.

MacOS : ++V
Windows : Ctrl+Alt+V


생성한 Member 객체를 메모리(Map)에 저장해 보자. memberService의 join()을 사용해 저장할 수 있다. 매개변수로 member를 전달한다.


이제 저장이 잘 됐는지 확인해 봐야 한다. 조회는 memberService의 findMember()를 사용한다. id를 통해 검색하니 id를 매개변수로 전달한다.


저장한 회원과 조회한 회원이 같은지 확인해 보자. 간단하게 이름을 출력해서 두 회원이 같은지 확인한다. 여기서 또 꿀팁. soutv를 입력하고 Tab 또는 Enter를 누르면 두 번째 사진처럼 자동으로 value가 설정된다. 우리가 생성한 회원인 member를 먼저 출력하고 조회한 findMember를 출력해 보겠다.


그냥 출력하면 객체의 주소값이 출력되니, getter를 사용하여 이름을 출력해 보자. getName()을 사용하면 된다.


실행은 아래 단축키를 사용해도 되고, main 메서드 옆에 있는 실행 버튼을 눌러 실행하면 된다. console 창에 같은 이름으로 출력되는 것을 확인할 수 있다. 잘 저장되고, 잘 조회된 것이다.

MacOS : ++R
Windows : Ctrl+Shift+F10


지금까지 스프링과 관련된 코드는 하나도 사용하지 않았다. 순수 자바 코드만을 사용했다.

main()으로 테스트를 하는 방법은 좋은 방법이 아니다. 그래서 JUnit이라는 테스트 프레임워크를 사용하는 것이 좋다.

🧪 JUnit을 사용한 테스트 📌

JUnit을 사용하기 위해 테스트 클래스를 새로 만들어야 한다. src/test/java/Group이름.core 패키지 내에 member 패키지를 생성한다. main 폴더가 아닌 test 폴더 내에 있는 core 패키지이므로 주의하자❗️


그리고 방금 생성한 member 패키지에 MemberServiceTest 클래스를 생성한다.


main()에서와 마찬가지로 MemberService 인터페이스를 선언하고 MemberServiceImpl 구현체를 생성한다.


org.junit.jupiter.api 패키지의 @Test 어노테이션을 사용한다.


가입이 잘 되는지 확인할 것이기 때문에 join() 메서드를 만들 것이다.(memberService의 join()과는 다른 메서드이니 혼동하지 않도록 하자.) given에서 Member 객체를 아까와 똑같이 생성해주겠다.

given : 어떠한 것이 주어지고
when : 이렇게 했을 때
then : 이런 식으로 된다!


when에서는 memberService의 join()을 사용해 가입하고, findMember()를 통해 회원을 조회한다. 아까 main에서 할 때와 같기 때문에 어렵지 않다.


then부터는 main에서 한 방식과는 차이가 있다. org.assertj.core.api 패키지의 Assertions를 사용할 것이다. junit.jupiter.api가 아닌 assertj.core.api이므로 주의한다❗️


assertThat()과 같은지를 확인하는 isEqualTo()를 사용한다. 이렇게 하면 테스트 코드 작성은 끝났다.


이제 이 테스트를 돌려 보도록 하자. 실행을 하면 console 창에 초록불이 들어오며 성공했다고 출력된다.


지금까지 우리가 만든 회원 서비스가 잘 작동하는지 main과 JUnit 테스트를 사용해 검증해 보았다. main에서는 우리가 console 창 출력 결과를 확인하여 직접 검증했지만, JUnit 테스트를 사용하면 테스트가 성공인지 아닌지를 출력해 준다.

테스트 코드는 선택이 아닌 “필수”이다.

회원 도메인 설계의 문제점❗️

우리가 앞서 배웠던 객체 지향 설계 원칙을 생각해 보자. 만약 서비스에서 다른 회원 저장소로 변경할 때 OCP와 DIP가 잘 지켜지고 있을까? 답은 X다.

의존관계가 인터페이스(MemberRepository) 뿐만 아니라 구현체(MemoryMemberRepository)까지 모두 의존하는 문제가 있다. MemberServiceImpl은 DIP를 위반하고 있는 것이다❗️


일단 주문과 할인 정책 도메인까지 모두 만들고 해당 문제점과 해결 방안을 설명한다고 한다. 객체 지향 개념을 배울 때부터 제시되었던 문제점이었기에, 빨리 해결책을 배우고 싶다. 강의가 점점 재미있어지는 것 같다😊 두근..!

profile
좋은 개발자가 되자.

0개의 댓글