“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 주차 시작!
“2023년 06월 12일 부터 06월 18일 까지의 나의 루틴.”
#목차
22주차
2023-06-12
- 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.
2023-06-13
2023-06-14
2023-06-15 스터디
- 오늘도 어김없이 영한 님의 인강과 함께 출근 하였다.
스터디
- asd - 데이터 모델링
- 왕돼지티라노의 기록 - 복합 키와 식별 관계 매핑
2023-06-16
- 오늘은 동빈나 님의 코테 영상을 보면 서 출근 하였다.
- 앞으로는 코테 준비를 많이 하려고 한다.
- 물론 영한 님의 인강 또한 추가로 조금 씩 들을 예정이다.
Back to [Routine] 21 주차 시작!
Continue with [Routine] 23 주차 시작!
“2023년 06월 05일 부터 06월 11일 까지의 나의 루틴.”
#목차
21주차
2023-06-05
- 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.
2023-06-06
- 오늘은 공휴일이라 영한 님의 인강을 들으며 운동하였다.
2023-06-07
- 오늘도 어김없이 영한 님의 인강을 들으며 출근하였다.
2023-06-08
2023-06-09
Back to [Routine] 20 주차 시작!
Continue with [Routine] 22 주차 시작!
“2023년 05월 29일 부터 06월 04일 까지의 나의 루틴.”
#목차
20주차
2023-05-29
- 운동 13일차!
- 오늘도 어김없이 영한 님의 인강을 들으면서 출근하였다.
- 이제부터 출근시간 사진을 굳이 올리지 않으려 한다. 일단 운동하고 나서 별 의미가 없어진듯하다.
- 혹시나 운동을 하지 않고 일찍 올 날이 있으면 그때 하는 게 나을 것 같다.
2023-05-30
2023-05-31
- 운동 15일차!
- 역시나 오늘도 어김없이 영한 님의 인강과 함께!
2023-06-01 스터디 발표
스터디 발표
- 승연씨 - Google Bard
- 코드 지우개 - 람다식3, 4
2023-06-02
- 오늘도 어김없이 영한 님의 강의를 들으면서 출근하였다.
Back to [Routine] 19 주차 시작!
Continue with [Routine] 21 주차 시작!
“해당 포스팅은 우아한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
인터페이스를 가지고 있다. Platform
은 TestEngine
을 통해서 테스트를 발견하고, 실행하며, 결과를 보고한다.JUnit Jupiter
: TestEngine
의 실제 구현체는 별도 모듈이며, 그 중 하나가 Jupiter-Engine
이다. 이 모듈은 Jupiter-API
를 사용해서 작성한 테스트 코드를 발견하고 실행한다. Jupiter API
는 JUnit5
에 새롭게 추가된 테스트 코드용 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()
}
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
패키지에 있다.”
Annotation | description |
---|
@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) 으로 선언할 수 있다. 이러한 어노테이션은 상속되지 않는다. |
@Tag | Class 또는 Method 수준에서 테스트를 필터링하기 위한 태그를 선언하는 데 사용되며, TestNG 또는 JUnit4 의 범주에 있는 테스트 그룹과 유사하다. 이러한 어노테이션은 클래스 수준에서는 상속되지만, 메서드 수준에서는 상속되지 않는다. |
@Disabled | Test Class 또는 Test Method 를 비활성화하는 데 사용되며, JUnit4 의 @Ignore 와 유사하다. 이러한 어노테이션은 상속되지 않는다. |
@Timeout | @Test , @TestFactory , @TestTemplate 또는 lifecycle method 의 실행이 지정된 기간을 초과하는 경우 실패하는 데 사용된다. 이러한 어노테이션은 상속된다. |
@ExtendWith | 확장을 선언적으로 등록하는 데 사용된다. 이러한 어노테이션은 상속된다. |
@RegisterExtension | 필드를 통해 확장을 프로그래밍 방식으로 등록하는 데 사용된다. 이러한 필드는 음영 처리되지 않는 한 상속된다. |
@TempDir | lifecycle method 또는 test method 에서 필드 주입 또는 매개변수 주입을 통해 임시 디렉터리를 제공하는 데 사용되며, org.junit.jupiter.api.io 패키지에 있다. |
Continue with [JUnit5] JUnit5 어노테이션 ver1
Continue with [JUnit5] JUnit5 어노테이션 ver2
JUnit4 vs JUnit5 @Annotations 생명주기(LifeCycle)
Feature | JUnit4 | JUnit5 |
---|
Test Method임을 선언 | @Test | @Test |
해당 클래스에 위치한 모든 테스트 메서드 실행 전에 딱 한 번 실행되는 메서드. @BeforeAll 어노테이션을 사용하기 위해선 static 을 선언해줘야 한다. | @BeforeClass | @BeforeAll |
해당 클래스에 위치한 모든 테스트 메서드 실행 후에 딱 한 번 실행되는 메서드 @AfterAll 어노테이션을 사용하기 위해선 static 을 선언해줘야 한다. | @AfterClass | @AfterAll |
해당 클래스에 위치한 모든 테스트 메서드 실행 전에 실행되는 메서드 | @Before | @BeforeEach |
해당 클래스에 위치한 모든 테스트 메서드 실행 후에 실행되는 메서드 | @After | @AfterEach |
Test Method 나 Class 를 비활성화 | @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
“2023년 05월 22일 부터 05월 28일 까지의 나의 루틴.”
#목차
19주차
2023-05-22

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

2023-05-24

- 운동 10일차!
- 오늘도 어김없이 영한 님의 인강을 들으면서 출근하였다.
2023-05-25 스터디

- 운동 11일차!
- 오늘도 어김없이 영한 님과 함께!
스터디
asd - HTTP와 HTTPS와 Https 적용 방법
왕돼지티라노의 기록 - 상속 관계 매핑
2023-05-26

- 운동 12일차!
- 역시나 항상 출근은 영한 님과 함께!
Back to [Routine] 18 주차 시작!
Continue with [Routine] 20 주차 시작!
“2023년 05월 15일 부터 05월 21일 까지의 나의 루틴.”
#목차
2023-05-15

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

- 운동 6일차!
- 오늘도 어김없이 영한 님과 함께!
2023-05-17 스터디 발표
- 오늘은 회사 내부 사이트 시스템 점검으로 인해 사진 캡쳐를 하지 못하였다.
- 운동 7일차!
- 오늘도 어김없이 영한 님, 책과 함께!
스터디 발표
- 코드 지우개 - 람다식2, 3
- 승연씨 - OSI 7 계층의 캡슐화 비캡슐화
2023-05-18
- 오늘은 병원 검진 받는날이라 휴가를 사용했다.
- 오전 9시에 나갔는데 집에 오니… 오후 5시…
- 내 휴가………..
2023-05-19

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

TDD Process
- 코드를 작성하기 전에 특정한 기능에 한에서, 기능도 조금 더 세분화해서 딱 하나의 케이스에 대해서 테스트 코드를 먼저 작성한다.
- 그리고 테스트를 실행하는데 당연히 실패하게 된다. 왜냐하면 기능을 구현하지 않았기 때문이다.
- 그래서 이 실패한 테스트가 성공할 정도의 조금의 양만, 딱 그만큼의 기능만 하는 코드를 작성해서 다시 테스트를 진행한다.
- 작성한 테스트를 성공하게 만든다.
- 이렇게 하나의 테스트가 완성이 되면 이제 그다음 기능으로 넘어가서, 그 기능에 해당하는 테스트를 작성하고, 테스트를 수행해서 실패하면 이 실패한 코드가 성공할 수 있을 만큼의 코드만 작성해서 다시 테스트를 수행해서 성공하면 다시 그다음의 테스트를 진행한다.
- 이렇게 테스트 코드를 조금 작성하고, 기능을 조금 구현하고 다시 테스트 코드를 조금 작성하고, 기능을 조금 구현하고 이런 식으로 개발해 나가는 것을 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에서는 TDD가 어느 정도 유용할 수 있으나 2에서는 쓸모가 없다. 코드의 어떤 부분이 변경될지 예측하는 것은 어렵기 때문이다.
- 1은 애초에 안 변하고, TDD 방식으로 모든 코드에 대해 테스트를 짤 경우, 특히 2에서 코드를 변경해야 하는데 테스트가 발목을 잡는다.
- 그러므로 (포프는) 제품 코드 전에 테스트 코드를 짜자는 TDD 방식을 쓰지 않는다.
- 일단 코드를 그냥 짜고, 실제로 버그가 일어나고 가정이 틀리는 시점에서 그에 대한 테스트 코드를 작성한다
Reference
“2023년 05월 08일 부터 05월 12일 까지의 나의 루틴.”
#목차
2023-05-08

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

- 오늘도 어김없이 영한 님의 인강과 이펙티브 자바 3/E를 읽으며 출근하였다.
- 오늘 출근이 늦은 이유는 일어나는 시간은 똑같지만 헬스장을 다니기 시작했다.
- 요새 체력이 너무 많이 떨어진 거 같고 운동도 하고 싶어서 헬스장을 다니기 시작하였다.
- 지금 다리는 후들후들 거리지만 오랜만에 헬스장 가서 운동해서 그런지 너무 상쾌하다!
- 앞으로 매일 아침 운동을 하고 출근할 예정이다.
AWS SUMMIT SEOUL 2023 참석 발표
- 영조씨 : Amazon EC2
EC2
: AWS 클라우드에서 확장 가능 컴퓨팅 용량을 제공.
- 유나씨 : SnowFlake(데이터 통합 플랫폼 관리 시스템, (유/무료))
DataCloud
플랫폼ON-PREM
1st Gen Data Lake
Public Cloud
Data Lakehouse
SnowFlacke
: 하나의 Cloud Platform
으로 모든 데이터 처리 가능.
- 태준이 : AWS CodeCatalyst, CodeWhisperer
CodeCatalyst
: 개발 외적인 방해 요소들을 해결, Code, Build, Test, 팀 관리 등만 신경쓰면 된다.CodeWhisperer
: 개발 내적인 방해 요소들을 해결,
- 승연씨 : AWS의 등장 배경
- 보영씨 : 하시코프가 제안하는 클라우드 배포/운영/보안강화 (CI/CD)
- 배포 :
IaC의 대명사 Terraform
- 운영 :
Nomad
- 보안강화 :
Vault
주용대리 : Databricks on AWS
- 차장님 : AWS EKS 안전성
2023-05-10

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

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

- 운동 4일차! 수술한 지 꾀 지났지만 그로 인해 근육들이 녹고 코어도 잡히지 않았다는 문제를 발견하였다.
- 또한 상체의 괜찮지만 하체의 근육과 코어, 스트레칭 문제로 인해 앞으로 이것들을 기본적으로 다 잡아 놓고 3대 운동을 할 계획이다.
- 오늘도 어김없이 영한 님의 인강과 함께!
Back to [Routine] 16 주차 시작!
Continue with [Routine] 18 주차 시작!
“2023년 05월 02일 부터 05월 07일 까지의 나의 루틴.”
#목차
2023-05-02 스터디

- 오늘도 어김없이 영한 님의 인강과 함께 출근하였다.
- 어제 영한 님의 페이스북에서 알게 된 사실인데, 영한 님이 우아한형제들의 CTO 자리에서 물러나 새로운 도전을 한다는 얘기를 들었다.
- 인강하시면서 참 힘들다고 하셨는데…
- 인강 듣고 수강평을 작성하면 일일이 감사하게도 답변을 달아주시는 걸 보고 깜짝 놀랐다.
- 영한 님도 정말 힘들게 배우신 기술들을 나와 같은 사람들에게 최대한 좋은 정보로 주시려는 그 마음을 수강생들이 모두 다 느껴져서 수강평이 엄청 좋은 듯 하다.
- 나 역시 영한 님의 인강이 참 잘 와닿고 재미있게 느껴진다.
- 역시 뭔가를 할 땐 재미있어야 좀 더 관심이 가는듯하다.
- 아무튼! 영한 님의 새로운 도전을 멀리서나마 응원하고 싶다!
- 많은 수강생들에게 힘을 주었으니! 이젠 영한 님이 진심으로 하고자 하시는 거에 나 같은 수강생들이 조금이나마 힘이 되었으면 좋겠다.
스터디
asd - 컬레션 프레임워크4
왕돼지티라노의 기록 - 연관관계 매핑 - 다대다
슈팅이가키우는강아지 - 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 주차 시작!