/** 아키텍쳐 패턴
아키텍처 패턴 = 소프트웨어의 구조를 위한 기본적인 토대.
시스템들과 역할을 정의, 여러 시스템사이의 관계와 규칙 포함
그중 계층형 아키텍처 패턴을 많이 채택하게된다.
계층을 확실하게 나누고, 자신의 바로 아래 계층에만 의존하게 만드는게 목표.
컨트롤러 = 클라이언트의 요청을 받고 응답을 해주는 역할 요청에 들어온 데이터 내용 검증또한 기능
서비스 = API 핵심적인 동작, 비즈니스 로직이 수행되는 부분
저장소 = 데이터베이스 혹은 데이터베이스와 통신하는 부분
**/
/** MOCK
.mockReturnValue() Mock 함수의 반환값 지정
.tobe(value) = .toEqual(value) 근데 투비는 더 엄격함
.toMatch(regexp|string) 입력받은 문자열이 결과값과 같은지
.toBeTruthy() 결과값이 true인지
.toBeInstanceOf(Class) 입력받은 예상값과 Class가 동일한 Instance인지 검증 (error) 검증시에 주로 사용
.toHaveProperty(keyPath, value?) 입력받은 객체의 key와 value가 일치하는지
.toMatchObject(object) 입력받은 객체와 결과 객체가 일치하는지
**/
/** Global Jest
afterAll(fn, timeout) 모든 test()가 완료된 이후에 수행 테스트 완료 이후 변경된 데이터나 mock초기화
afterEach(fn, timeout) 각 test()가 완료된 이후에 수행 MOCK또는 전역변수 초기화
beforeAll(fn, timeout) 테스트코드가 실행되기 전 최초로 수행, db초기화 or 전역MOCK 초기화
beforeEach(fn, timeout) 각 test()가 실행되기 전 수행, 테스트가 실행되기 전 동일한 설정 반복
**/
/** Mock Function
.mock 객체는 특정코드를 실행하지않고, 원하는 부분만 테스트하고싶을때, 실제로 존재하는 값 처럼 사용할 수 있도록 만든 가짜 객체
.toHaveBeenCalledTimes(number) 몇번 호출되었는지 검증
.toHaveBennCalledWith(arg1, arg2, ...) 어떤 인자를 이용해 Mock이 호출되었는지 검사
**/
/**
의존성 주입: 객체사이의 의존 관계를 외부에서 제공
그러니까 간단히 말하자면 Mock test는 나오는 밸류보다, 참조하는 객체가 같으냐, 경로가 같으냐 를 테스트한다고 생각한다.
나오는 value자체를 확인하는 것 은 .toHaveBeenCalledWith method고 그냥 경로가 연결 되어있는가를 확인하는게 .toEqual 혹은 .toBe 이다.
**/