2장 기본적인 스프링부트 애플리케이션

sua·2022년 9월 2일
0
post-thumbnail

요구사항

개발하고자 하는 것 : 사용자가 매일 계산 능력을 훈련하는 애플리케이션

사용자 스토리 1

: 온라인에서 무작위로 생성되는 곱셈 문제를 풀고 싶음. 매일 암산으로 두뇌 훈련을 해야 하니까 문제는 너무 쉽지 않아야 함!
-> 세부적인 태스크로 나누기

  1. 비즈니스 로직을 제공하는 기본적인 서비스 만들기
  2. 해당 서비스를 사용할 수 있는 REST API 엔드포인트(endpoint) 만들기
  3. 사용자에게 문제를 보여주는 간단한 웹 페이지 만들기

애플리케이션 구성

애플리케이션 구조 만들기

  1. 스프링 이니셜 라이저 웹 사이트(http://start.spring.io/)에서 프로젝트 생성
  • 그룹 : microservices.book
  • 아티팩트 : social-multiplication
  • 패키지 이름 : microservices.book.multiplication
  • 의존성 : Web만
  1. 애플리케이션 실행하기 (성공)

TDD 실습으로 손 풀기

테스트 주도 개발은 로직보다 테스트를 먼저 작성!

  1. 곱셈을 만드는 Multiplication 클래스 작성
package microservices.book.multiplication.domain;

/**
 * 애플리케이션에서 곱셈을 나타내는 클래스
 */
public class Multiplication {

    // 인수
    private int factorA;
    private int factorB;

    // A * B 의 결과
    private int result;

    public Multiplication(int factorA, int factorB) {
        this.factorA = factorA;
        this.factorB = factorB;
        this.result = factorA * factorB;
    }

    public int getFactorA() {
        return factorA;
    }

    public int getFactorB() {
        return factorB;
    }

    public int getResult() {
        return result;
    }

    @Override
    public String toString() {
        return "Multiplication{" + "인수A=" + factorA + ", 인수B=" + factorB + ", 결과(A*B)=" + result + '}';
    }

}

  1. 서비스 인터페이스 정의 (MultiplicationService)

package microservices.book.multiplication.service;

import microservices.book.multiplication.domain.Multiplication;

public interface MultiplicationService {

  /**
   * 두 개의 무작위 인수를 인수를 담은 {@link Multiplication} 객체를 생성한다.
   * 무작위로 생성되는 숫자의 범위는 11~99.
   *
   * @return 무작위 인수를 담은 {@link Multiplication} 객체
   */
  Multiplication createRandomMultiplication();

}

  1. 곱셈에 필요한 숫자를 매번 무작위로 생성하는 서비스 만들기 (RandomGeneratorService)
package microservices.book.multiplication.service;

public interface RandomGeneratorService {

  /**
   * @return 무작위로 만든 11 이상 99 이하의 인수
   */
  int generateRandomFactor();

}

  1. 테스트 첫 번째 버전 작성
package microservices.book.multiplication.service;

import microservices.book.multiplication.domain.Multiplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;


@RunWith(SpringRunner.class)
@SpringBootTest
public class MultiplicationServiceTest {

  @MockBean
  private RandomGeneratorService randomGeneratorService;

  @Autowired
  private MultiplicationService multiplicationService;

  @Test
  public void createRandomMultiplicationTest() {
    // given (randomGeneratorService 가 처음에 50, 나중에 30을 반환하도록 설정)
    given(randomGeneratorService.generateRandomFactor()).willReturn(50, 30);

    // when
    Multiplication multiplication = multiplicationService.createRandomMultiplication();

    // assert
    assertThat(multiplication.getFactorA()).isEqualTo(50);
    assertThat(multiplication.getFactorB()).isEqualTo(30);
    assertThat(multiplication.getResult()).isEqualTo(1500);
  }
}

-> 그냥 코드만 작성하면 @RunWith 등의 어노테이션에 에러가 뜬다 JUnit4 Classpath를 add 해주면 해결된다.


아직 MultiplicationService의 구현체를 만들지 않았기 때문에 테스트 결과는 실패함! 요구사항을 확인한 후 작성해준다.


  1. MultiplicationServiceImpl 작성
package microservices.book.multiplication.service;

import microservices.book.multiplication.domain.Multiplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
class MultiplicationServiceImpl implements MultiplicationService {

  private RandomGeneratorService randomGeneratorService;

  @Autowired
  public MultiplicationServiceImpl(RandomGeneratorService randomGeneratorService) {
    this.randomGeneratorService = randomGeneratorService;
  }

  @Override
  public Multiplication createRandomMultiplication() {
    int factorA = randomGeneratorService.generateRandomFactor();
    int factorB = randomGeneratorService.generateRandomFactor();
    return new Multiplication(factorA, factorB);
  }
}

  1. 테스트 실행해보기 (성공)

정리

애플리케이션의 요구사항과 테스트 주도 개발 접근법을 알아봄
-> TDD로 간단한 스프링 부트 애플리케이션을 만듦

profile
가보자고

0개의 댓글