회원 관리 예제를 통해 기본적인 백엔드 개발을 해 보겠다. 우선 요구사항은 다음과 같다.
일반적인 웹 애플리케이션 계층 구조
클래스 의존 관계
아직 데이터 저장소가 선정되지 않은 상황이기 때문에 인터페이스를 통해 추후에 데이터 저장소가 선정 되면 쉽게 클래스를 변경할 수 있도록 해 준다. 또한 저장소가 없기 때문에 일단 메모리 기반의 데이터 저장소를 사용한다.
회원 객체
그림과 같이 id와 name 변수를 생성하고 각각의 변수에 getter와 setter를 만들어 준다.
id는 구별하기 위해 시스템이 부여해 주는 번호로 long 타입을 사용하였다.
회원 리포지토리 인터페이스
그림과 같이 인터페이스를 만들어 준다.
회원 리포지토리 메모리 구현체
새로 class를 하나 생성하고 만들어 두었던 인터페이스를 impletments 한다.
그리고 map 형식의 store 변수와 long 타입의 sequence 변수를 선언해 준다.
각각의 override 된 함수를 구현해 준다.
회원을 등록하기 위해 사용하는 함수이다. 멤버를 등록하기 위해 id를 부여해 주고 store 변수에 put 메서드를 통해 저장해 준다.
id를 통해 회원 조회를 위해 사용하는 함수이다. store 변수에서 get 메서드를 통해 해당 id의 member를 반환해 준다.
name을 통해 회원 조회를 위해 사용하는 함수이다. store 변수들을 훑으면서 name과 memeber에 저장된 name이 같으면 반환한다.
('->' 표현은 왼쪽에 있는 것이 사용할 매개변수이고, 오른쪽에 있는것이 실행문이다.)
모두 찾는 함수로, store에 저장된 member들을 list 형식으로 반환한다.
개발한 기능이 올바르게 작동하는 지 알아보기 위해 main 메서드를 통해 실행해 볼 수도 있고, 웹 애플리케이션의 컨트롤러를 통해서도 할 수 있다. 하지만 이런 방법은 복잡하고 오래걸린다는 단점이 있다.
자바는 JUnit이라는 프레임워크를 통해 원하는 대로 동작 하는지 테스트 코드를 작성하여 검증해 볼 수 있다.
given(주어짐) - when(실행했을 때) - then(결과) 순으로 작성하면 가독성이 올라가고 좀 더 유연하게 구현할 수 있다.
회원 리포지토리 메모리 구현체 테스트
그림과 같이 test 폴더에 패키지와 클래스를 생성한다. 그리고 테스트할 메서드들을 @Test를 붙여서 생성해 준다.
테스트 코드들은 메서드 별로 수행시켜 볼 수 있다.
save()
save에 대한 테스트 코드 이다. member 변수가 제대로 저장 되는지 확인하기 위해 member 변수의 name을 spring으로 setting 해 준 후, save()를 통해 member를 repository에 저장해 준다. 그리고 나서 Assertions()를 통해 member와 repository에서 해당 id의 변수가 같은지 확인한다.
실행이 정상적으로 되면 다음과 같은 결과가 나온다.
추가적으로 위의 코드에서 junit이 아닌 assertj를 활용하면 주석처리한 코드를 통해 확인을 해 볼 수 있다.
findByName()
findByName에 대한 테스트 코드이다. member1,2에 각각 name을 달리하여 저장해 준다. 그리고 member1의 name을 findByname()에 넘겨서 반환된 결과를 result에 저장해 준다. 마지막으로 Assertions를 통해 두 결과가 같은지 확인해 준다.
결과가 잘 나온것을 볼 수 있다. 만약 result의 name을 member2의 name으로 해 준다면 결과가 틀릴 것이고, 다음과 같이 결과 화면을 확인할 수 있다.
findAll()
findAll에 대한 테스트 코드이다. save를 한 후 list에 저장된 member의 수와 findAll을 통해 나온 list의 size와 같은지 비교하여 파악하는 코드이다.
Test 단위
테스트코드는 메서드 단위로 할 수 있지만 클래스 단위로 돌릴 수도 있다. 하지만 클래스 단위로 돌릴 경우 메서드의 순서와는 상관 없이 돌려서 되던 부분도 안될 수 있다.
이런 부분을 해결하기 위해 각각의 테스트가 끝날 때 마다 데이터를 클리어 해 줘야 한다.
우선 다음과 같이 데이터를 clear해주는 함수를 테스트 하고자 하는 클래스에 선언해 준다.
그리고 나서 테스트 코드에 다음과 같이 추가해 준다.
@AfterEach는 각각의 메서드 실행 후 자동적으로 호출되도록 하는 어노테이션이다. 즉 각 메서드에 대한 테스트가 끝나면 생성된 데이터를 clear해 주는 것이다.
실행 결과는 아래와 같이 나타난다.
출처 : 인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/lecture/49582?tab=note&speed=1.25