인프런 홈페이지 - https://www.inflearn.com/
강의 제목 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
이번 강의의 목표는 스프링 생태계에 어떤 행동이 일어나고 관계에 대해 알아보는 것이므로, 정말 간단한 내용만 다룰 예정.
코드를 글로 올리지는 않을 예정이므로 코드를 얻고자 하면 인프런에 강의에 공개로 올려져 있으니 참고하면 될듯!
컨트롤러 : 웹 MVC의 컨트롤러 역할
서비스 : 핵심 비즈니스 로직 구현
리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
도메인 : 비즈니스 도메인 객체 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정
개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 저장소 사용
이라고 써져있지만 처음에 알아먹기가 어려우니 예제를 얼른 해보도록 하자.
Member 클래스에 id와 Name을 저장할 클래스 생성
repository에 id 와 Name을 저장하고 찾는 기능을 가진 클래스와 인터페이스 생성
원래 글씨를 잘 못ㅆ.
테스트 케이스를 만들고 -> 구현을 하는 경우도 있고
구현을 한 후에 -> 테스트 케이스를 만드는 경우도 있다.
일반적으로 main을 만들어 테스트를 하기에는 번거로움이 있는데 이러한 것을 줄이고자 테스트 케이스가 나왔다.
실행을 하면
이렇게 모든 테스트가 완료된 것을 확인할 수 있다.
회원 서비스를 만들것이기 때문에 서비스 패키지와 클래스를 만들어준다.
회원가입을 할때 간단하게 중복된 Id인지 검사하는 기능을 만들어줄 건데,
예전 같은 경우에는 null예외처리를 해야할 때 if(null ~처럼 처리를 했지만, 지금은 Optional에 한번 감싸고 반환을 한다.
위와 같이 Optional로 받고 밑에 처리할 수도 있지만, 코드가 깔끔하지 않다.
위 처럼 앞의 작업을 이어서 추가 행동을 하도록 만드는 것이 좀 더 깔끔한 코드이다.
더 나아가 위는 하나의 행동을 나타내므로 메서드로 뽑는 것이 좋다.
그냥 있는 메서드 사용하면 된다.
테스트케이스를 일일이 작성할수도 있지만 IntelliJ는 엄청난 기능이 있는데
테스트할 MemberService에서 shift + command + T(윈도우는 몰라요!)를 누르면
이렇게 뜨고 누르면
이렇게 나오는데 밑에 체크박스에 테스트할 메서드 선택한 후 OK 누르면
이렇게 테스트케이스 껍데기를 자동으로 만들어주는 것을 확인할 수 있다.
그리고 강사님께서 말씀해주셨는데 테스트를 할때는 위와 같이 과감하게 한글로 작성해도 된다고 하셨다. 실제 코드로 들어가지 않기 때문이다.
또, 사진에서 given when then 문법이 보이는데
어떤 데이터를 받았고
무엇을 했고
어떤 결과가 나왔는지
다른 사람이 봐도 어떤 행동을 했는지 쉽게 보기 위한 문법이다. 처음에 시작을 할때 이 문법을 사용하고 점점 변형하는 것을 추천
이제 작성해보자.
위는 hello라는 멤버를 만들고, 이 멤버를 join을 통해 넣은 다음 잘 넣어졌는지 테스트하는 케이스입니다.
그런데 사실 이 저희는 테스트에서 더 중요한 것을 해야합니다.
예외 발생의 경우를 넣어야합니다.
join메서드에 중복 회원의 예외경우도 체크를 해줘야하기 때문에 테스트를 하나 더 만듭니다.
같은 이름으로 두 개의 멤버를 생성한 뒤, join에 2번 넣으면 2번째에서 exception이 발생해야 하고 그 문구가 잘 생성되었는지 보는 테스트이다.
결과는 잘 나왔고, isEqualTo("123")이런 식으로 일부러 다른 문자를 넣어보면 더 정확한 판단이 가능하다.
그런데 이 exception을 try catch로 잡기에는 좀 애매한 경우가 있다.
이를 위해 제공된 좋은 문법이 있다.
assertThrows이라는 기능인데 (static으로 위에서 정의되어 앞에를 생략해도 되지만 원래는 Jupiter에 있는 Assertions.assertThrows이다.) 위 문법의 뜻은
memberService.join(member2)
를 실행할 건데IllegalStateException
이 발생해야 된다.
라는 뜻이다. 그러므로 예외가 발생하지 않았거나 첫번째 인자에 NullPointerException이라던지 다른 예외를 넣으면 오류가 나오고 Illegal예외를 잘 넣으면 테스트는 잘 통과된다.
또, 반환값을 이용해 아래처럼 확인할 수도 있다.
그리고 매번 테스트가 끝나면 데이터를 지워주기 위해 AfterEach에 clear을 해주고 BeforEach에 새롭게 넣어준다.