[TDD] TDD의 기초개념을 알아보자

- 5 mins

주의

비 정기적으로 수정하는 문서

Layered Architecture

Screenshot

계층형 설계

  1. Web Layer
    • DTO
  2. Service Layer : 비즈니스 로직을 구현하는 부분이 아님!, DB에서 데이터를 조회하고 도메인 객체에 메시지를 보내는 역할.
    • Domain : 상태(Data)와 행위를 갖음
  3. Repository Layer : DB와 직접적인 연결관계를 맺는 부분, DB뿐만아니라 외부 API와의 연결도 해당 Layer에서 담당한다.

TDD

아직은 내게 어려운 친구…

Test Driven Development : 테스트 주도 개발

테스트하기 쉬운 코드는

- 새로운 기능이 추가되었을 때 확장하기 쉬운 구조.
- 기능이 변경되었을 때 기능을 변경하기 쉬운 구조.
- (100% 일치하는 것은 아니지만) 테스트하기 쉬운 코드의 경우 상당 부분 확장하기 좋고, 변경하기 좋은 구조를 가진다.

TDD CYCLE

Screenshot

메소드를 짤 때 항시 테스트 코드를 먼저 작성하고 로직을 짤 것
1. 실패하는 단위 테스트를 추가한다.
2. 테스트를 통과하도록 프로덕션 코드를 구현한다.
3. 리팩토링한다.
{ 위 과정을 반복한다. }

Clean Code

오류처리

오류코드보다 예외를 사용할 것

오류코드를 사용하면 호출자가 복잡해짐. 또한 예외 상황을 잊어버리고 처리안 할 수 있음

null을 반환하지마라

시스템

시스템 제작과 시스템 사용을 분리하라

확장

소프트웨어 시스템은 물리적 시스템과 다르다. 관심사를 적절히 분리해서 관리한다면 소프트웨어 아키텍처는 점진적으로 발전할 수 있다.

관심사의 분리

AOP를 활용해 관심사를 분리한다면 시스템이 커지는 상황에서 확장에 유연하게 대처할 수 있다.

시스템 아키텍처 시운전

의사 결정을 최적화하라


ATDD

Acceptance Test Driven Development : 인수 테스트 주도 개발

기존 TDD의 문제점

TDD의 단점을 보완해줄 ATDD

TDD의 단점을 보완하기 위해 인수 테스트(acceptance test)를 먼저 먼저 구현한 후 이후 단위 테스트를 통해 기능을 완성해 가는 과정으로 애플리케이션을 개발할 수 있다.

Screenshot

Acceptance Test 란?

- 인수테스트

전체 시스템이 동작하는가?

@RunWith(SpringRunner.class)
@SpringBootTest

- 통합 테스트

변경할 수 없는 코드를 대상으로 코드가 동작하는가?

- 단위 테스트

객체가 제대로 동작하는가? 객체를 이용하기가 편리한가?

TDD 프로세스 유지

각 기능을 인수 테스트로 시작하라.

테스트를 가장 간단한 성공 케이스에서 시작하라

입력에서 출력 순서로 개발하라

Controller => Service => Repository 순으로 개발.
Domain(Model, Entity) 객체는 각 Layer에서 필요한 시점에 생성

[ATDD 기반으로 로그인 기능을 구현하는 과정]

1. 아이디와 비밀번호가 일치하는 경우에 대한 인수 테스트 구현
2. LoginController => UserService 구현
3. DB에 사용자 데이터 추가를 위한 User Entity, UserRepository 구현
4. 로그인 로직에 단위 테스트를 추가해 로직 완료
5. 아이디와 비밀번호가 일치하지 않는 경우에 대한 인수 테스트 구현
이후 과정 반복

Fixture

https://gist.github.com/bverbeken/5724148

테스트를 진행하다보면 각 Test Case 별로 비슷한 데이터를 계속해서 생성해야 하는 상황이 발생한다. 그래서 각 테스트용 데이터를 매번 만들어 사용한다. 이것을 Fixture(테스트용 데이터)라 한다.

Fixture를 만들기 쉽도록 할 때 Builder Pattern 을 적용하거나, 자주 사용하는 Fixture를 미리 만들어놓고 사용하기도 한다.


Validation

유효성 검사란. 사용자가 입력한 데이터가 유효한지 체크하는 것이다. 유효성 검사는 FE, BE 두 곳 모두에서 해야한다.

만약 불가피하게 한 곳에서만 유효성 검사를 해야한다면 BE는 꼭 해야한다. 왜냐하면 FE는 우회할 방법이 여럿 존재하기 때문에 서버에서 꼭 유효성을 검사해주어야 보안에 문제가 생기지 않는다.

FE와 BE 모두 유효성 검증을 해놨을 때 프론트에서 변경하고 백엔드에서 변경하지 않는다면 문제가 생길 수 있다. 유효성 또한 중복이 될 수 있다.

FE의 유효성 검증은 사용자 경험을 좋게해주는 효과가 있다.

Sehun Kim

Sehun Kim

하다보니 되더라구요.

comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora