개발 & 방법론
Mockito 알아보기 (부제 : BDD)
테스트 코드 입문자라면 겪어보는 문제 테스트 코드를 작성한지 얼마 안 되었을 때 의존성이 있는 객체의 테스트 코드를 작성하면서, 의존하는 객체의 실제 인스턴스를 생성해서 진행한 적이 많았다. 나중에 변경이 생기면 관련된 테스트가 모두 실패하는 상황이 잦았다. (고치는 것도 고역이였다.) 그러다 보니 나중엔 테스트 코드 때문에 변경이 무서워지는 상황이 생겼다. 유연하게 변경하기 위한 테스트 코드 때문에 변경이 무섭다니... 아이러니한 상황이다. 또한 외부 API를 의존할 경우에 테스트 코드를 어떻게 작성해야 할지 막히는 경우도 있다. 잘못된 걸 인식했으면 해결하기 위해 고민을 해야 했는데 당시에는 '테스트 코드가 복잡해지면 이런갑다~' 하고 아무 생각없이 넘어갔다. DDD 세레나데 교육과 인프런 백기선 강..
AssertJ 알아보기 (부제 : Jupiter, Hamcrest 맛보기 )
많은 곳에서 JUnit에서 제공하는 공식 기능인 Jupiter가 아닌 AssertJ를 사용하고 있다. 여러 교육과정이나 인강에서도 AssertJ를 권장하는데 그 이유는 무엇일까? 간단히 알아보자. AssertJ 이란? 테스트에 관련된 많은 기능을 제공하고 메서드 체이닝으로 가독성 높은 테스트 코드 작성을 지원하는 오픈 라이브러리다. AssertJ Import AssertJ의 Assertions를 사용 할 때 주의점은 것은 기존 JUnit의 Assertions와 같은 클래스명을 가진다. import 경로는 org.assertj.core.api 다. AssertJ 사용방법 assertThat(검증대상) 로 시작하며 메서드 체이닝을 이용하여 검증 메서드를 연쇄적으로 사용할 수 있다. AssertJ가 제공하는 ..
JUnit5 알아보기
인텔리제이를 사용하는 자바 개발자가 90% 이상 사용한다는 JUnit을 간단히 알아보러 한다. 자세한 내용은 공식 가이드를 참고하기 바란다. JUnit 5 JUnit이란? JUnit은 자바 프로그래밍 언어용 유닛 테스트 프레임워크이다. JUnit은 컴파일 타임에 JAR로서 링크된다. [위키백과] JUnit5 구성요소 Junit5는 3가지로 구성되어 있다. - JUnit Platform : JVM에서 테스트 프레임워크를 실행하는 기반, 테스트 엔진 API 제공 - JUnit Jupiter : 테스트를 작성하기 위한 프로그래밍 & 익스텐션 모델을 제공 - JUnit Vintage : 이전 버전을 위한 테스트 엔진 제공 (JUnit3 & JUnit4 호환) 왜 JUnit5 인가? JUnit 시리즈 중에서 20..
테스트를 통한 코드 보호
레거시 코드, 빈약한 모델 구조의 프로젝트를 파악하기란 무척이나 어렵다. 레거시 코드를 리팩토링하는 건 더 어렵다. 어떻게 리팩토링을 시작해야 할까? 최선의 방법은 테스트 코드다. 테스트 코드란? 기능을 검증하는 코드를 테스트 코드라 한다. 테스트에는 단위 테스트, 통합 테스트, 인수 테스트가 있다. - 단위 테스트 : 기능 별로 테스트 진행, 필요한 부분만 따로 진행할 수 있다. - 통합 테스트 : 외부 모듈을 묶어서 진행, 단위 테스트에서 발견하지 못한 에러를 발견할 수 있다. - 인수 테스트 : 시스템을 대상으로 검증, 최대한 운영과 흡사한 환경에서 진행한다. 레거시에 테스트 코드를 작성하는 이유? 테스트 코드를 통해 레거시의 여러 가지를 파악할 수 있다. - 도메인 파악 : 레거시 코드를 통해 무..
레거시 코드, 빈약한 도메인 모델(Anemic Domain Model)
이전 시간에 잘못된 소프트웨어를 언급했었다. 이번에는 잘못된 소프트웨어를 지칭하는 대표적인 용어 레거시 코드를 간단히 알아보고 그중 하나인 빈약한 도메인 모델을 알아보려 한다. 레거시 코드 레거시란 용어를 말하면 누구나 다음과 같이 비슷한 생각을 할 것이다. - 매우 악취가 풍기는 코드 - 파악하기 힘든 코드 - 의존성이 매우 강하게 결합된 코드 - 전혀 의미를 알 수 없는 변수명과 함수명 - 큰 진흙 덩어리 - 테스트코드 작성하기 두려운 존재 - 기타 등등 즉, 이해할 수 없고 수정하기도 힘든 코드를 뜻하는 경우가 많다. 이런 레거시 코드의 특징은 새로운 기능이 추가될수록 점점 감당하기 어려워진다. 하지만 레거시 코드를 기피할 수 없다. 언젠간 극복해야할 과제다. 빈약한 도메인 모델 (Anemic Do..
도메인 주도 설계(Domain Driven Design)란?
도메인 주도 설계(Domain Driven Design, DDD)를 도입하는 회사나 DDD 경험 있는 개발자를 구하는 모집 공고가 흔하다. 커뮤니티 게시판에도 DDD 스터디 모집글이 보이고, 아는 지인들도 DDD 스터디 진행하거나 찾고 있다. DDD가 무엇이고, 많은 회사와 개발자들이 매달리고 있을까? 우선 도메인이 등장한 배경부터 알아보자. 왜 도메인 주도 설계인가? 레거시는 이해할 수 없는 코드가 덕지덕지 있는 것을 경험해봤을 거다. 존재 이유를 모르는 코드 수많은 분기문이 있다. 이러한 형태는 새로운 요구 사항이 추가되거나 버그가 발생했을 때 해당 메서드에 코드가 여러줄이 증가하는 걸 볼 수 있다. 또한, 비즈니스 규칙은 자바뿐만 아니라 자바스크립트, SQL에도 구현되어 있으며, 코드가 아닌 운영 ..
테스트 코드를 작성하는 이유
지금 테스트 어떻게 하시나요? 이전까지 일해왔던 레거시 환경에서는 테스트가 서버를 띄우고 Postman 이나 화면에서 직접 입력폼 하나씩 입력하는 방식으로 다양한 use case 에 맞게 수작업 단순노동을 하면서 결과를 보내고 콘솔로 찍히는 로그가 정상인지 확인하는게 일반적인 테스트인줄 알았다. 이 방식은 경험상 단점이 존재한다 시간이 많이 필요 : 서버 띄우고 직접 입력폼 하나씩 입력하는 방식은 불필요한 행동이 많아 시간적 소비가 많다 유스케이스 기록 : 다양한 유스케이스에 대한 테스트를 기억하기 위해선 엑셀같은 문서에 남겨야한다. 최소 수십개의 테스트를 진행하다 까먹고 다시하거나 잊고 누락하는 경우가 생기기 때문이다 상황 대처 느림 : 운영중에 예상치 못한 에러가 발생하면 빠르게 파악하고 수정해서 반..
12주차 : 애노테이션
애노테이션에 대해 알아보자 12주차 과제: 애노테이션 · Issue #12 · whiteship/live-study 목표 자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수) 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 마감일시 2021년 2월 6일 토요일 오후 1시까지. github.com 목표 자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수) 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 Annotation 이란? 개발을 하다보면 클래스, 메서드, 변수 앞에 붙은 @ 표시를 많이 보았을 것이다 어노테이션이라 부르며, 자바5부터 추가된 요소다 사전적 의미는 "주석"이며 의미대로 자바 ..