[Routine] 23 주차 시작!

[Routine] 23 주차 시작!

2023년 06월 19일 부터 06월 25일 까지의 나의 루틴.

#목차

23주차

2023-06-19

  • 오늘도 동빈나 님의 코테 강의를 들으면서 출근하였다.

2023-06-20

  • 오늘은 영한 님의 인강과 함께 운동을 하고, 개발바닥 영상을 보며 출근하였다.

2023-06-21

코테 커밋

2023-06-22 스터디

  • 오늘도 어김없이 영한 님의 인강과 바킹독 님의 코테 영상을 보며 출근하였다.

코테 커밋


스터디

  • 이번 주는 앞으로 스터디에 대한 향후 계획을 전면 바꾸어 새롭게 시작하기로 하였다.
  • 새롭게 시작할 스터디를 위해 회의를 하였고, 결론은 코딩 테스트의 한 문제를 두고 각자 풀고 토의하는 방안으로 결론 내었다.
  • 다음 주 부턴 앞으로 스터디는 당분간 코딩테스트가 될 예정이다.

2023-06-23

  • 오늘도 어김없이 영한 님과 바킹독 님의 인강을 들으면서 출근하였다.

Back to [Routine] 22 주차 시작!

Continue with [Routine] 24 주차 시작!

[Routine] 22 주차 시작!

[Routine] 22 주차 시작!

2023년 06월 12일 부터 06월 18일 까지의 나의 루틴.

#목차

22주차

2023-06-12

  • 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.

2023-06-13

  • 오늘도 어김없이 영한 님과 함께!

2023-06-14

  • 휴가!

2023-06-15 스터디

  • 오늘도 어김없이 영한 님의 인강과 함께 출근 하였다.

스터디

  1. asd - 데이터 모델링
  2. 왕돼지티라노의 기록 - 복합 키와 식별 관계 매핑

2023-06-16

  • 오늘은 동빈나 님의 코테 영상을 보면 서 출근 하였다.
  • 앞으로는 코테 준비를 많이 하려고 한다.
  • 물론 영한 님의 인강 또한 추가로 조금 씩 들을 예정이다.

Back to [Routine] 21 주차 시작!

Continue with [Routine] 23 주차 시작!

[Routine] 21 주차 시작!

[Routine] 21 주차 시작!

2023년 06월 05일 부터 06월 11일 까지의 나의 루틴.

#목차

21주차

2023-06-05

  • 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.

2023-06-06

  • 오늘은 공휴일이라 영한 님의 인강을 들으며 운동하였다.

2023-06-07

  • 오늘도 어김없이 영한 님의 인강을 들으며 출근하였다.

2023-06-08

  • 오늘도 역시 영한 님의 인강과 함께!
  • 오늘은 AWSOME DAY ONLINE CONFERENCE를 하는 날여서 AWS에 대해 좀 더 공부할 생각이다.

2023-06-09

  • 오늘도 영한 님의 인강과 함께 출근하였다.

Back to [Routine] 20 주차 시작!

Continue with [Routine] 22 주차 시작!

[Routine] 20 주차 시작!

[Routine] 20 주차 시작!

2023년 05월 29일 부터 06월 04일 까지의 나의 루틴.

#목차

20주차

2023-05-29

  • 운동 13일차!
  • 오늘도 어김없이 영한 님의 인강을 들으면서 출근하였다.
  • 이제부터 출근시간 사진을 굳이 올리지 않으려 한다. 일단 운동하고 나서 별 의미가 없어진듯하다.
  • 혹시나 운동을 하지 않고 일찍 올 날이 있으면 그때 하는 게 나을 것 같다.

2023-05-30

  • 운동 14일차!
  • 오늘도 어김없이 영한 님과!

2023-05-31

  • 운동 15일차!
  • 역시나 오늘도 어김없이 영한 님의 인강과 함께!

2023-06-01 스터디 발표

  • 오늘도 어김없이 영한 님과 함께!

스터디 발표

  1. 승연씨 - Google Bard
  2. 코드 지우개 - 람다식3, 4

2023-06-02

  • 오늘도 어김없이 영한 님의 강의를 들으면서 출근하였다.

Back to [Routine] 19 주차 시작!

Continue with [Routine] 21 주차 시작!

[JUnit5] JUnit5

[JUnit5] JUnit5

“해당 포스팅은 우아한Tech[10분 테코톡] 🌊 바다의 JUnit5 사용법을 참고하여 포스팅하였습니다. 영상을 제작해주신 우아한Tech바다님에게 감사드립니다.”

#목차

JUnit5

단위 테스트(Unit Test) 란?

“프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차이다.”

  • 모든 함수와 메서드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.
  • 이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.

JUnit 이란?

JetBrains 조사에 따르면 단위 테스트를 수행하는 Java 개발자의 93%JUnit을 사용하고, 51%Mockito 를 사용한다.”

  • Java 개발자의 93%가 사용하는 단위 테스트 프레임워크이다.

JUnit5 란?

  • JUnit5는 2017년 10월에 공개 되었으며, SpringBoot 2.2버전 이상부터 기본으로 제공하고 있다.

JUnit5 Architecture

JUnit4는 하나의 jar 파일로 의존성을 불러와 다른 라이브러리를 참조해서 사용하는 구조였는데, JUnit5부터는 JUnit5그 자체로 모듈화가 되어있다. JUnit5는 3개의 하위 프로젝트, 즉 JUnit Platform, JUnit Jupiter, JUnit Vintage로 구성이 되며 Java8부터 사용가능하다.”

  • JUnit Platform : 테스트를 발견하고 테스트 계획을 생성하는 TestEngine 인터페이스를 가지고 있다. PlatformTestEngine을 통해서 테스트를 발견하고, 실행하며, 결과를 보고한다.
  • JUnit Jupiter : TestEngine의 실제 구현체는 별도 모듈이며, 그 중 하나가 Jupiter-Engine이다. 이 모듈은 Jupiter-API를 사용해서 작성한 테스트 코드를 발견하고 실행한다. Jupiter APIJUnit5에 새롭게 추가된 테스트 코드용 API로서, 개발자는 Jupiter API를 사용해서 테스트 코드를 작성할 수 있다.
  • JUnit Vintage : 기존에 JUnit4 버전으로 작성한 테스트 코드를 실행할 때에는 Vintage-Engine 모듈을 사용한다.

JUnit5 설정 방법

  • SpringBoot 프로젝트
    • SpringBoot 2.2버전 이상부터는 기본적으로 JUnit5 의존정이 자동으로 추가되어 따로 설정할 필요 없이 바로 사용 가능하다.
// file: "build.gradle" 
// spring boot 3.0.6 버전 (2023-05-03 기준)
dependencies {
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
    useJUnitPlatform()
}
  • SpringBoot 프로젝트가 아닐 경우
    • 다음과 같이 의존성을 추가해주면 된다.

Maven Setup

<!-- file: "pom.xml"-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

JUnit5 Platform

Gradle Setup

// file: "build.gradle"
test {
    useJUnitPlatform()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

Using JUnit5 with Gradle

JUnit5 @Annotations

JUnit Jupiter에는 테스트 구성 및 프레임워크 확장을 위해 다음과 같은 어노테이션을 지원한다. 달리 명시되지 않는 한, 모든 핵심 어노테이션은 junit-jupiter-api 모듈의 org.junit.jupiter.api 패키지에 있다.”

Annotationdescription
@Test메서드가 테스트 메서드임을 나타낸다. JUnit4@Test 어노테이션과 달리 이 어노테이션은 attributes(속성)를 선언하지 않는데, 이는 JUnit Jupiter의 테스트 확장이 자체 전용 어노테이션을 기반으로 작동하기 때문이다. 이러한 메서드는 재정의하지 않는 한 상속된다.
@ParameterizedTest메서드가 매개변수화된 테스트임을 나타낸다. 이러한 메서드는 재정의되지 않는 한 상속된다.
@RepeatedTest메서드가 반복 테스트에 대한 테스트 템플릿임을 나타낸다. 이러한 메서드는 재정의되지 않는 한 상속된다.
@TestFactory메서드가 동적 테스트를 위한 테스트 팩토리임을 나타낸다. 이러한 메서드는 재정의되지 않는 한 상속된다.
@TestTemplate메서드가 등록된 프로바이더가 반환하는 호출 컨텍스트의 수에 따라 여러 번 호출되도록 설계된 테스트 케이스용 템플릿임을 나타낸다. 이러한 메서드는 재정의되지 않는 한 상속된다.
@TestClassOrder어노테이션된 테스트 클래스에서 @Nested 테스트 클래스에 대한 테스트 클래스 실행 순서를 구성하는 데 사용된다. 이러한 어노테이션은 상속된다.
@TestMethodOrder어노테이션된 테스트 클래스에 대한 테스트 메서드 실행 순서를 구성하는 데 사용되며, JUnit4@FixMethodOrder와 유사하다. 이러한 어노테이션은 상속된다.
@TestInstance어노테이션된 테스트 클래스에 대한 테스트 인스턴스 라이프사이클을 구성하는 데 사용된다. 이러한 어노테이션은 상속된다.
@DisplayName테스트 클래스 또는 테스트 메서드의 사용자 지정 디스플레이 이름을 선언한다. 이러한 어노테이션은 상속되지 않는다.
@DisplayNameGeneration테스트 클래스에 대한 사용자 지정 디스플레이 이름 생성기를 선언한다. 이러한 어노테이션은 상속된다.
@BeforeEach@BeforeEach 어노테이션이 달린 메서드가 현재 클래스의 각각 @Test, @RepeatedTest, @ParameterizedTest 또는 @TestFactory 어노테이션이 달린 메서드 전에 실행되어야 함을 나타낸다(JUnit4@Before와 유사). 이러한 메서드는 재정의되거나 대체되지 않는 한 상속됩니다(즉, Java의 표시 규칙에 관계없이 서명만 기준으로 대체됨).
@AfterEach@AfterEach 어노테이션이 달린 메서드가 현재 클래스의 각각 @Test, @RepeatedTest, @ParameterizedTest 또는 @TestFactory 어노테이션이 달린 메서드 이후에 실행되어야 함을 나타낸다(JUnit4@After와 유사). 이러한 메서드는 재정의되거나 대체되지 않는 한 상속된다(즉, Java의 표시 규칙에 관계없이 서명만 기준으로 대체됨).
@BeforeAll@BeforeAll 어노테이션이 달린 메서드가 현재 클래스의 모든 @Test, @RepeatedTest, @ParameterizedTest@TestFactory 어노테이션이 달린 메서드보다 먼저 실행되어야 함을 나타낸다(JUnit4@BeforeClass와 유사). 이러한 메서드는 숨겨지거나 재정의되거나 대체되지 않는 한(즉, Java의 표시 규칙에 관계없이 서명만 기준으로 대체되지 않는 한) 상속되며, per-class 테스트 인스턴스 라이프사이클이 사용되지 않는 한 정적(static)이어야 합니다.
@AfterAll@AfterAll 어노테이션이 달린 메서드가 현재 클래스의 모든 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory 어노테이션이 달린 메서드 다음에 실행되어야 함을 나타낸다(JUnit4@AfterClass와 유사). 이러한 메서드는 숨겨지거나 재정의되거나 대체되지 않는 한(즉, Java의 표시 규칙에 관계없이 서명만 기준으로 대체되지 않는 한) 상속되며, per-class 테스트 테스트 인스턴스 라이프사이클이 사용되지 않는 한 정적(static)이어야 합니다.
@Nested@Nested 어노테이션이 달린 클래스가 정적(static)이 아닌 중첩된 테스트 클래스임을 나타낸다. Java8부터 Java15까지에서는 “클래스-별” 테스트 인스턴스 라이프사이클을 사용하지 않는 한 @BeforeAll 및 @AfterAll 메서드를 @Nested 테스트 클래스에서 직접 사용할 수 없다. Java16부터는 테스트 인스턴스 라이프사이클 모드 중 하나를 사용하여 @Nested 테스트 클래스에서 @BeforeAll@AfterAll 메서드를 정적(static)으로 선언할 수 있다. 이러한 어노테이션은 상속되지 않는다.
@TagClass 또는 Method 수준에서 테스트를 필터링하기 위한 태그를 선언하는 데 사용되며, TestNG 또는 JUnit4의 범주에 있는 테스트 그룹과 유사하다. 이러한 어노테이션은 클래스 수준에서는 상속되지만, 메서드 수준에서는 상속되지 않는다.
@DisabledTest Class 또는 Test Method비활성화하는 데 사용되며, JUnit4@Ignore와 유사하다. 이러한 어노테이션은 상속되지 않는다.
@Timeout@Test, @TestFactory, @TestTemplate 또는 lifecycle method의 실행이 지정된 기간을 초과하는 경우 실패하는 데 사용된다. 이러한 어노테이션은 상속된다.
@ExtendWith확장을 선언적으로 등록하는 데 사용된다. 이러한 어노테이션은 상속된다.
@RegisterExtension필드를 통해 확장을 프로그래밍 방식으로 등록하는 데 사용된다. 이러한 필드는 음영 처리되지 않는 한 상속된다.
@TempDirlifecycle method 또는 test method에서 필드 주입 또는 매개변수 주입을 통해 임시 디렉터리를 제공하는 데 사용되며, org.junit.jupiter.api.io 패키지에 있다.

Continue with [JUnit5] JUnit5 어노테이션 ver1

Continue with [JUnit5] JUnit5 어노테이션 ver2

JUnit4 vs JUnit5 @Annotations 생명주기(LifeCycle)

FeatureJUnit4JUnit5
Test Method임을 선언@Test@Test
해당 클래스에 위치한 모든 테스트 메서드 실행 딱 한 번 실행되는 메서드. @BeforeAll 어노테이션을 사용하기 위해선 static을 선언해줘야 한다.@BeforeClass@BeforeAll
해당 클래스에 위치한 모든 테스트 메서드 실행 딱 한 번 실행되는 메서드 @AfterAll 어노테이션을 사용하기 위해선 static을 선언해줘야 한다.@AfterClass@AfterAll
해당 클래스에 위치한 모든 테스트 메서드 실행 에 실행되는 메서드@Before@BeforeEach
해당 클래스에 위치한 모든 테스트 메서드 실행 에 실행되는 메서드@After@AfterEach
Test MethodClass비활성화@Ignore@Disabled
동적 테스트에 사용N/A@TestFactory
중첩 테스트에 사용N/A@Nested
태그 지정 및 필터링@Category@Tag
확장을 선언적으로 등록할 때 사용N/A@ExtendWith

@BeforeAll vs @BeforeEach 와 @AfterAll vs @AfterEach

  • 두 개 어노테이션 모두 하나 혹은 여러 개의 테스트 조건을 setup할 때 사용하지만 하나의 테스트 클래스 안에 여러 개의 테스트가 있는 경우 @BeforeEach@AfterEach는 여러번 실행되지만, @BeforeAll@AfterAll은 딱 한 번만 실행된다.
  • @BeforeEach@AfterEach@Test 어노테이션이 붙은 메서드가 실행이 되기 전(@BeforeEach)과 후(@AfterEach) 실행이 된다.
  • @BeforeAll@AfterAll은 해당 클래스 내에 처음 시작(@BeforeAll)과 맨 마지막 끝(@AfterAll)에 실행이 된다.

JUnit5 LifeCycle 예시

import static org.assertj.core.api.Assertions.assertThat;

class JUnit5LifecycleTest {
  @BeforeAll
  static void BeforeAll() {
    System.out.println("@BeforeAll");
  }

  @BeforeEach
  void BeforeEach() {
    System.out.println("@BeforeEach");
  }

  @AfterEach
  void afterEach() {
    System.out.println("@AfterEach");
  }

  @AfterAll
  static void AfterAll() {
    System.out.println("@AfterAll");
  }

  @Test
  void 라이프사이클_테스트1() {
    String str = "abc";
    System.out.println("라이프사이클_테스트1 = " + str);
    assertThat(str).contains("a");
  }

  @Test
  void 라이프사이클_테스트2() {
    String str = "abc";
    System.out.println("라이프사이클_테스트2 = " + str);
    assertThat(str).contains("b");
  }
}
결과 출력

JUnit5 LifeCycle Example 1

Assertions

  • 실제 테스트에서 검증하고자 하는 내용을 확인하는 기능을 제공하는 패키지이다.
  • 실제 값(actual)기대한 값(expected)과 같은지 확인하는 메서드이다.
  • Assertions에 대해서는 아래 포스팅에서 자세히 다루고 있습니다.

Continue with [JUnit5] JUnit5 AssertJ

Reference

[Routine] 19 주차 시작!

[Routine] 19 주차 시작!

2023년 05월 22일 부터 05월 28일 까지의 나의 루틴.

#목차

19주차

2023-05-22

  • 운동 8일차! 헬스장이 오늘까지 리모델링이라 집에서 운동하였다.
  • 오늘도 어김없이 영한 님의 인강과 함께 출글하였다.

2023-05-23

2023-05-24

  • 운동 10일차!
  • 오늘도 어김없이 영한 님의 인강을 들으면서 출근하였다.

2023-05-25 스터디

  • 운동 11일차!
  • 오늘도 어김없이 영한 님과 함께!

스터디

  1. asd - HTTP와 HTTPS와 Https 적용 방법

  2. 왕돼지티라노의 기록 - 상속 관계 매핑


2023-05-26

  • 운동 12일차!
  • 역시나 항상 출근은 영한 님과 함께!

Back to [Routine] 18 주차 시작!

Continue with [Routine] 20 주차 시작!

[Routine] 18 주차 시작!

[Routine] 18 주차 시작!

2023년 05월 15일 부터 05월 21일 까지의 나의 루틴.

#목차

2023-05-15

  • 운동 5일차! 주말에 스트레칭과 함께 하체 스쿼트 운동을 조금 해주었더니 오늘 코어 운동과 하체 운동하는 게 좀 더 수월했다.
  • 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.

2023-05-16

  • 운동 6일차!
  • 오늘도 어김없이 영한 님과 함께!

2023-05-17 스터디 발표

  • 오늘은 회사 내부 사이트 시스템 점검으로 인해 사진 캡쳐를 하지 못하였다.
  • 운동 7일차!
  • 오늘도 어김없이 영한 님, 책과 함께!

스터디 발표

  1. 코드 지우개 - 람다식2, 3
  2. 승연씨 - OSI 7 계층의 캡슐화 비캡슐화

2023-05-18

  • 오늘은 병원 검진 받는날이라 휴가를 사용했다.
  • 오전 9시에 나갔는데 집에 오니… 오후 5시…
  • 내 휴가………..

2023-05-19

  • 오늘도 어김없이 영한 님과 함께 출근하였다!

Back to [Routine] 17 주차 시작!

Continue with [Routine] 19 주차 시작!

[TDD] 테스트 주도 개발

[TDD] 테스트 주도 개발

“해당 포스팅은 드림코딩테스트 코드와 TDD 🧪(feat. 프론트엔드, 백엔드를 위한 테스트 코드)을 참고하여 포스팅하였습니다. 영상을 제작해주신 드림코딩엘리님에게 감사드립니다.”

#목차

TDD(Test-Driven Development)

Test란?

Test란?

  • 개발자들이 말하는 테스트란?
    • 소프트웨어 테스트를 말하며, 애플리케이션 제품이나, 서비스의 품질을 확인하고, 버그들을 찾는데 사용하고 있다.
    • 한마디로 소프트웨어 테스트란, 제품이 원하는 데로 동작하는지 확인하는 것과 애플리케이션이 우리가 원하는 데로 동작하는지 검증하고 확인하는 것이다.
    • 여기서 제품이란, 우리의 메서드, 기능, UI, 성능, API 스펙이 우리가 원하는 데로 동작하는지 확인하는 것이다.


Software Test란?

Software Test란?

  • 우리의 목표가 무엇이냐에 따라서, 우리의 플랫폼과, 환경이 무엇이냐의 따라서 다양한 테스트가 있다.
  • 많은 개발자들이 정말 많이 사용하는 Unit Test부터 Functional Test, Integration Test, Component Test, Contract Test, E2E Test, Performance Test 등등 정말 많은 테스트가 있다.
  • 우리가 뭘 원하느냐, 어떤 걸 확인하고 싶냐에 따라 다양한 테스트들이 있지만 이 테스트들의 프로세스는 딱 하나로 정의할 수 있다.


Software Test Process

Software Test Process

  • 특정한 기능을 수행하는 비즈니스 로직을 가지고 있는 소스코드가 있다면, 그에 해당하는 테스트 코드를 작성한다.
  • 이때, 이 테스트 코드는 우리의 코드가 우리가 예상하고 원하는 요구사항에 맞는지 확인할 수 있어야 한다.
  • API 스펙, Query, 메서드, 특정한 기능, 성능, UI 등이 어떻게 돼야 하는지 이러한 정의에 따라서 다양한 테스트 프레임워크나 라이브러리를 사용할 수 있다.
  • 이렇게 특정한 상황에 우리가 원하는 데로, 예상한 데로 동작하는 것을 검증하는 테스트 코드를 작성해두었다면 이 테스트 코드를 수행해서 모든 테스트가 성공하는지 확인해야 한다.
  • 만약 테스트가 실패하게 된다면 우리 코드가 어떤 부분이 잘못되었는지 확인하고 수정해야 한다.
  • 테스트가 다시 통과할 때까지 이 부분(pass)을 계속 반복해 줘야 한다.
  • 여기서 테스트의 포인트는 우리가 예상하는 요구사항에 맞게 우리 코드가 동작하는지 검증하는 것이다.
  • 많은 개발자들과 기업들이 TDD 방법론을 중요시하는 곳이 굉장히 많은 것을 볼 수 있다.
  • 그렇다면 TDD란 과연 무엇일까?


TDD(Test-Driven Development)란?

TDD(Test Driven Development)란?

  • Test-Driven Development의 약자이며, 테스트 주도 개발이라 한다.
  • 조금 풀어서 얘기하면 개발하기 전에 즉, 코드를 작성하기 전에 테스트 코드를 먼저 작성하는 방식. 이렇게 개발하는 방식을 TDD라고 한다.
  • TDD는 특정한 기술 프레임워크나 라이브러리를 말하는 것이 아니라 우리가 어떻게 개발해 나갈 것인가를 정의하는 개발 방식, 개발 방법론 중에 하나이다.


TDD전 기존 개발 프로세스

TDD전 기존 개발 프로세스

  • TDD를 적용하기 전 개발 프로세스는 설계 및 디자인 -> 코드 개발 -> 해당 코드를 테스트 실행하게 된다.
  • 테스트를 진행 후 버그나 또는 변경사항이 발견된다거나 하게되면 다시 코드를 수정한다거나, 수정된 설계를 통해 다시 개발 코드를 수정하게 된다. 좀더 세분화해서 보자면..
  1. 코드를 작성하고
  2. 프로그램(Tomcat)을 실행한 뒤
  3. Postman과 같은 API 테스트 도구로 HTTP 요청을 하고
  4. 요청 결과를 System.out.println() 또는 log.debug()로 눈으로 검증하게 된다.
  5. 결과가 다르다면 다시 프로그램(Tomcat)을 중지하고 코드를 수정하게 된다.
  • 만약 수정할 코드들이 있다면 2 ~ 5번의 작업을 반복적으로 계속 수행해야 한다.
  • 또한 테스트를 실행하려면 프로그램(Tomcat)을 켜는데 시간도 상당히 소모되게 된다.


TDD Process

TDD Process

  1. 코드를 작성하기 전에 특정한 기능에 한에서, 기능도 조금 더 세분화해서 딱 하나의 케이스에 대해서 테스트 코드를 먼저 작성한다.
  2. 그리고 테스트를 실행하는데 당연히 실패하게 된다. 왜냐하면 기능을 구현하지 않았기 때문이다.
  3. 그래서 이 실패한 테스트가 성공할 정도의 조금의 양만, 딱 그만큼의 기능만 하는 코드를 작성해서 다시 테스트를 진행한다.
  4. 작성한 테스트를 성공하게 만든다.
  • 이렇게 하나의 테스트가 완성이 되면 이제 그다음 기능으로 넘어가서, 그 기능에 해당하는 테스트를 작성하고, 테스트를 수행해서 실패하면 이 실패한 코드가 성공할 수 있을 만큼의 코드만 작성해서 다시 테스트를 수행해서 성공하면 다시 그다음의 테스트를 진행한다.
  • 이렇게 테스트 코드를 조금 작성하고, 기능을 조금 구현하고 다시 테스트 코드를 조금 작성하고, 기능을 조금 구현하고 이런 식으로 개발해 나가는 것을 TDD라고 한다.
  • 이렇게 TDD 방법을 이용해서 모든 기능이 다 구현이 완료되었다면 그동안 작성해왔던 테스트 코드들이 성공적으로 통과되어야 한다.
  • 여기까지는 기능을 구현하는데 만 조금 더 집중해서 빠르게 코드를 작성했다면…


TDD(Test-Driven Development) Refactoring

TDD(Test Driven Development)

  • 이제 작성해둔 테스트 코드들을 기반으로 해서 조금 더 자신감 있게 코드에 퀄리티를 향상하고, 아키텍처를 개선하고, 리팩토링을 해나갈 수 있다.
  • 이렇게 실패하는 테스트 코드를 먼저 작성하고, 그에 해당하는 기능을 구현해나가는 방식 이것이 TDD인데…


오히려 코드량이 늘어나고 처리할 작업들이 많아지는데 왜 TDD를 지향해야 할까?

오히려 코드량이 늘어나고 처리할 작업들이 많아지는데 왜 TDD를 지향해야 할까?

  • 그렇다면 오히려 코드량이 늘어나고 처리해야할 작업들이 더 많아질텐데 왜 많은 사람들이 TDD… TDD… 하는 것일까?


TDD의 장점

TDD의 장점

  • 작성하고자 하는 모든 요구사항에 대한 철저한 분석명확한 이해가 필요하기 때문이다.
  • 명확한 요구 사항을 기반으로 해서 설계자의 관점에서 코드를 작성해 나갈 수 있기 때문이다.
  • 그래서 TDD를 이용하면 우리가 원하는 모든 요구 사항(목표)에 대해서 점검할 수 있다.
  • 또한, 사용자 입장에서 코드를 작성할 수 있다.
  • 이를 기반으로 테스트 코드에서 이런 식으로 우리 코드를 사용하면 되겠구나.. 라고 생각하게 되는데 조금 더 개발자스럽게 얘기해 보자면..
  • 구현보다는 인터페이스에 조금 더 집중해서 코드를 작성해 나갈 수 있다. =>구현 < 인터페이스 -> 코드의 퀄리티 향상
  • 이렇게 작성하면 당연히 코드의 퀄리티가 향상이 되고, 시스템 전반적인 설계를 향상할 수 있다.
  • 그리고 실패한 테스트 -> 기능구현, 실패한 테스트 -> 기능구현 이렇게 지속적으로 개발을 게임하듯이 해나갈 수 있기 때문에 개발 집중력도 향상할 수 있다.

결론

  • 무조건 TDD가 옳은 건 아니다. 하지만 개발에 있어 장점이 굉장히 많다.
  • 위 내용은 TDD에 관해 주로 장점을 설명하였다. 하지만 아래는 무조건 TDD를 사용하자! 가 아닌 적절하게, 꼭 필요한 곳에서 TDD를 사용해야 한다는 내용이다.
  • 아래는 포프TV - 효율적인 테스트 코드 작성법을 잘 요약한 설명이니 위 내용과의 차이점을 느끼고 생각해 보는 계기가 되었으면 한다.

효율적인 테스트 코드 작성법 - 요약

  • 소프트웨어 개발, 테스팅 또한 경제적인 활동이다. 자원(시간, 인력)을 적게 투입하여 최대한의 효용을 뽑아내어야 한다.
  • 코드에 따라 유닛 테스트는 필요할 때도 있고 필요하지 않을 때도 있다. 유닛 테스트가 필요한 경우는 다음과 같다.
    1. 알고리즘이 매우 복잡하지만 수학적으로 잘 정의된 경우, 구현 상의 명백한 버그를 없애기 위해 필요하다.
    2. 제품이 실제로 사용되고 발전하면서 자꾸 변하거나 가정이 틀리는 부분의 버그를 없애기 위해 필요하다.
  • 1에서는 TDD가 어느 정도 유용할 수 있으나 2에서는 쓸모가 없다. 코드의 어떤 부분이 변경될지 예측하는 것은 어렵기 때문이다.
  • 1은 애초에 안 변하고, TDD 방식으로 모든 코드에 대해 테스트를 짤 경우, 특히 2에서 코드를 변경해야 하는데 테스트가 발목을 잡는다.
  • 그러므로 (포프는) 제품 코드 전에 테스트 코드를 짜자는 TDD 방식을 쓰지 않는다.
  • 일단 코드를 그냥 짜고, 실제로 버그가 일어나고 가정이 틀리는 시점에서 그에 대한 테스트 코드를 작성한다

Reference

[Routine] 17 주차 시작!

[Routine] 17 주차 시작!

2023년 05월 08일 부터 05월 12일 까지의 나의 루틴.

#목차

2023-05-08

  • 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.
  • 그리고 기존에 읽던 책이 너무 어려운 내용이라 다시 바꾸었다.
  • Java를 사용하는 개발자라면 너무나 유명한 조슈아 블로크(또는 조슈아 블로치)의 이펙티브 자바 3/E를 읽기 시작하였다.

2023-05-09 AWS 참석 발표

  • 오늘도 어김없이 영한 님의 인강과 이펙티브 자바 3/E를 읽으며 출근하였다.
  • 오늘 출근이 늦은 이유는 일어나는 시간은 똑같지만 헬스장을 다니기 시작했다.
  • 요새 체력이 너무 많이 떨어진 거 같고 운동도 하고 싶어서 헬스장을 다니기 시작하였다.
  • 지금 다리는 후들후들 거리지만 오랜만에 헬스장 가서 운동해서 그런지 너무 상쾌하다!
  • 앞으로 매일 아침 운동을 하고 출근할 예정이다.

AWS SUMMIT SEOUL 2023 참석 발표

  1. 영조씨 : Amazon EC2
    • EC2 : AWS 클라우드에서 확장 가능 컴퓨팅 용량을 제공.
  2. 유나씨 : SnowFlake(데이터 통합 플랫폼 관리 시스템, (유/무료))
    • DataCloud 플랫폼
      1. ON-PREM
      2. 1st Gen Data Lake
      3. Public Cloud
      4. Data Lakehouse
      5. SnowFlacke : 하나의 Cloud Platform으로 모든 데이터 처리 가능.
  3. 태준이 : AWS CodeCatalyst, CodeWhisperer
    • CodeCatalyst : 개발 외적인 방해 요소들을 해결, Code, Build, Test, 팀 관리 등만 신경쓰면 된다.
    • CodeWhisperer : 개발 내적인 방해 요소들을 해결,
  4. 승연씨 : AWS의 등장 배경
    • Amazon VPC
    • AWS 클라우드 네트워크
  5. 보영씨 : 하시코프가 제안하는 클라우드 배포/운영/보안강화 (CI/CD)
    • 배포 : IaC의 대명사 Terraform
    • 운영 : Nomad
    • 보안강화 : Vault
  6. 주용대리 : Databricks on AWS

  7. 차장님 : AWS EKS 안전성
    • AWS EKS 데이터 플랜

2023-05-10

  • 운동 2일차! 아침 일찍 운동하고 출근하니까 너무 개운한 거 같다!
  • 꾸준한 운동을 통해 기초 체력을 늘리고 건강한 몸을 유지하고 싶다!
  • 오늘도 역시나 영한 님의 인강을 들으면서 출근하였다.

2023-05-11

  • 운동 3일차! 오늘은 가슴 운동을 했다.
  • 여태껏 내가 혼자 운동했던 모든 것들이 잘 못 되었다는 것을 또 한 번 느끼게 되었다.
  • 출근은 역시나 영한 님의 인강을 들으면서 출근하였다!

2023-05-12

  • 운동 4일차! 수술한 지 꾀 지났지만 그로 인해 근육들이 녹고 코어도 잡히지 않았다는 문제를 발견하였다.
  • 또한 상체의 괜찮지만 하체의 근육과 코어, 스트레칭 문제로 인해 앞으로 이것들을 기본적으로 다 잡아 놓고 3대 운동을 할 계획이다.
  • 오늘도 어김없이 영한 님의 인강과 함께!

Back to [Routine] 16 주차 시작!

Continue with [Routine] 18 주차 시작!

[Routine] 16 주차 시작!

[Routine] 16 주차 시작!

2023년 05월 02일 부터 05월 07일 까지의 나의 루틴.

#목차

2023-05-02 스터디

  • 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.
  • 어제 영한 님의 페이스북에서 알게 된 사실인데, 영한 님이 우아한형제들의 CTO 자리에서 물러나 새로운 도전을 한다는 얘기를 들었다.
  • 인강하시면서 참 힘들다고 하셨는데…
  • 인강 듣고 수강평을 작성하면 일일이 감사하게도 답변을 달아주시는 걸 보고 깜짝 놀랐다.
  • 영한 님도 정말 힘들게 배우신 기술들을 나와 같은 사람들에게 최대한 좋은 정보로 주시려는 그 마음을 수강생들이 모두 다 느껴져서 수강평이 엄청 좋은 듯 하다.
  • 나 역시 영한 님의 인강이 참 잘 와닿고 재미있게 느껴진다.
  • 역시 뭔가를 할 땐 재미있어야 좀 더 관심이 가는듯하다.
  • 아무튼! 영한 님의 새로운 도전을 멀리서나마 응원하고 싶다!
  • 많은 수강생들에게 힘을 주었으니! 이젠 영한 님이 진심으로 하고자 하시는 거에 나 같은 수강생들이 조금이나마 힘이 되었으면 좋겠다.

스터디

  1. asd - 컬레션 프레임워크4

  2. 왕돼지티라노의 기록 - 연관관계 매핑 - 다대다

  3. 슈팅이가키우는강아지 - docker - 포트 바운딩


2023-05-03

  • 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.

2023-05-04

  • 오늘은 AWS SUMMIT SEOUL 2023에 참석하였다.
  • 3년 만에 열리는 AWS 행사는 여러 기업들이 참여하여 기업 제품 및 서비스들을 소개하고 행사 상품들을 나누어 주는 행사이다.
  • 또한, 수요일, 목요일 2일을 나누어 시간대별로 AWS 입문, 중급, 고급, 커뮤니티로 나누어 새로운 서비스 및 제품 향상들을 설명하는 자리를 가졌다.

  • 전시회에서 사은품도 많이 받고 입문 코스를 들으면서 AWS의 위대함을 다시 한번 느끼게 됐다.
  • 앞으로 매년 AWS 행사뿐만 아니라 다른 행사들도 참여할 의지가 어마어마하게 생기게 된거 같다.

Back to [Routine] 15 주차 시작!

Continue with [Routine] 17 주차 시작!

Pagination