전체 글

초보 개발자의 지식 공유의 장
애플리케이션을 개발할 때 중요하지만 잘 지켜지지 않는 것이 테스트코드를 작성하는 것이다.테스트 코드를 작성하면 어떤점에서 도움이 될까? 여러가지 이유가 있겠지만 결국은 유지보수 비용의 절감 즉, 개발시간의 단축이다.테스트 코드가 없는 상태에서 애플리케이션의 크기가 거대해지면 기능 추가나 기능 변경이 어려워진다. 이 상태에서 코드는 여러 사람의 손을 타게 되고 어느 순간 리팩토링의 필요성을 느끼게 된다. 하지만 테스트 코드가 없기에(검증할 수 있는 방법이 없기에) 리팩토링은 커녕 자연스레 모두가 수정하기 꺼려하는 코드가 된다. 이렇게 코드는 방치되고 유지보수 비용은 폭발적으로 늘어난다. 이것이 테스트 코드 작성의 이유다. 테스트 코드를 작성하면 위 상황을 모두 방지할 수 있다.자동화된 테스트? 회귀 테스트..
프로그래밍에서 사용되는 응집도과 결합도에 대해 살펴보자참고로 좋은 아키텍처는 높은 응집도와 낮은 결합도를 추구한다.응집도관련 요소가 얼마나 한 모듈에 모여 있는가를 나타낸다.메서드, 함수 수준부터 크게는 모듈 수준에 이르기까지 모든 수준에서 응집도를 판단할 수 있다.몇 가지 기준을 대입해서 생각해보면 응집도를 판단하는데 도움이 된다.관련 코드가 한 패키지(또는 한 모듈)에 모여 있는가?관련 코드가 한 클래스에 모여 있는가?관련 코드가 한 함수에 모여 있는가?관련 코드가 한 패키지에 모여 있는가?카드가 등록되고 등록 결과를 SMS에 전송하는 기능이 필요하다고 하자.만약 카드가 등록되고 SMS 전송이 필요하니 SMS 전송기능이 card 패키지안에 있다면 응집도가 낮다고 볼 수 있다.통지 전송 관련 기능이 c..
swagger를 사용하면 api 문서 관리 및 협업에 유용하다.코드와 문서가 분리되어 있으면, 문서 업데이트가 누락될 가능성이 있다. (최신화 x)기존 프로젝트에 적용되어있는 springfox swagger를 사용하려 했더니 spring-boot 3.x 버전에서 지원을 하지 않는다고 한다. (springfox는 2018년 6월 기준으로 업데이트가 중단됨)springdoc는 v2 부터 spring-boot 3.x를 지원하니 해당 lib를 이용하면 되겠다. 워낙 문서가 잘되어 있어서 문서만 보고 적용이 가능하다. 자주 사용될만한 설정만 적어 놓자https://springdoc.org/#Introduction하나의 SpringBoot 어플리케이션에서 여러개의 OpenAPI 를 정의할 수 있다.외부에 제공하는 ..
Fixture Monkey?The easiest way to generate controllable arbitray test objects테스트를 수행할 때 필드가 많은 객체 생성이 필요할때가 있다.Fixture Monkey를 사용하면 테스트 케이스에 맞는 필드값만 설정하고 나머지 필드는 임의의 값으로 생성되게하여 객체를 손쉽게 생성할 수 있다.FixtureMonkey 생성val fixtureMonkey = FixtureMonkey .plugin(KotlinPlugin()) .build()// fixtureMonkey로 객체를 생성하게 되면 필드 타입에 맞는 임의의값이 생성되는데// 특정 필드 타입의 제약조건을 전역적으로 생성하고 싶다면, 아래와 같이 Cusomization Options 를 설정할 ..
컴포넌트(Component)시스템 주요 구성 요소. 특정 기능을 수행하는 독립적인 단위애플리케이션의 큰 단위로, 모듈과 여러 클래스를 포함할 수 있음.사용자 관리 컴포넌트 : 사용자 인증, 등록, 역할 관리 등의 기능을 담당하는 큰 단위결제 컴포넌트 : 결제 처리를 위한 모듈들(결제 API 호출, 결제 내역 저장..)모듈(Module)특정 기능이나 역할을 수행하는 코드 집합으로, 시스템의 특정 부분을 구성코드 재사용성을 높이고 논리적인 그룹화를 목적으로 하는 더 작은 단위. 특정 기능을 수행하는 관련 클래스들을 묶어놓은 코드의 논리적인 단위로 볼 수 있음모듈은 하나의 컴포넌트에 속할 수 있으며, 모듈 내부에서 여러 하위 모듈로 나누어질 수도 있음
개요Gradle Moulti Module 로 구성된 프로젝트에서 PR 요청시 모든 프로젝트의 test를 돌리는 job이 등록되어 있었는데 test 완료 시간도 오래걸릴 뿐더러 수정사항이 없는 모듈의 테스트도 돌아가는 것이 맘에들지 않아 개선 해보고자 한다.방법1. matrix로 모듈들을 정의matrix로 multi module 프로젝트 이름을 정의하고 병렬적으로 실행시키는 방법이다.matrix에 정의된 module 의 숫자만큼 runner에서 병렬 실행name: PR Test & Analysison: pull_request: types: [ opened, reopened, synchronize ] branches: - master - devconcurrency: group..
스레드와 코루틴 스레드 Thread 클래스의 인스턴스는 프로그램이 실행될 때 운영체제의 네이티브 스레드를 나타낸다. 스레드(Thread)의 각 인스턴스는 해당 스택에 대한 메모리를 사용하고 초기화하기 위한 시간이 필요하다. 스레드의 컨텍스트 전환은 꽤 비싼 작업이기 때문에 별도의 스레드에서 짧은 작업을 호출하는 것은 좋은 결과를 가져오기 어렵다. 코루틴 (CoRoutine) 코루틴은 힙 메모리의 객체를 의미하며 코루틴 간의 전환은 운영체제 커널 작업이 아니다. 코루틴은 프로세스에 할당된 힙 메모리 영역을 공유해서 사용한다. 즉, 스레드에 비해 빠르고 적은 비용으로 생성할 수 있으며 자원도 적게 사용된다. 간단 사용법 코루틴은 CoroutineContext 인터페이스로 표시되는 컨텍스트에서 실행된다. El..
부정사(不定詞) : 품사가 정해져 있지 않음 부정사는 동사 본래의 성질을 가지고 있으므로 목적어, 보어 등을 취할 수 있으며, 문장 안에서 명사, 형용사, 부사의 역할을 한다. to + 동사원형 형태의 to 부정사 to를 사용하지 않은 원형부정사 부정사의 명사적 용법 부정사가 문장 안에서 주어, (타동사, 전치사의) 목적어, 보어, 동격의 자리에 위치하여 명사 역할을 하는 것을 말한다. 1. 주어 자리 자신을 안다는 것은 어렵다. To know oneself is difficult. It(가주어) is difficult to know oneself. 사전을 사용하는 것은 필요하다. To use the dictionary is necessary. It(가주어) is necessary to use the d..
1형식 문장(S + V) - 완전 자동사 완전 자동사 : 목적어나 보어가 필요없이 주어에 대한 설명이 가능한 동사 Fire burns. The brid sings sweetly. The earth moves round the snu. There is a beautiful river in that village There + be + 주어 형태는 '~이 있다' 의 뜻을 나태내며 1형식 문장에 속한다. There은 형식상의 주어로 문장을 인도하는 유도부사이며, 진짜 주어는 be동사 다음에 오는 명사 이다. There are many people in front of therailorad station. 2형식 문장(S + V + C) - 불완전자동사 불완전 자동사 : 동사만으로 주어에 대한 설명이 불가능하므..
[Effective Kotlin. 49] 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라 Iterable vs Sequence Sequence 지연(lazy) 연산 따라서 시퀀스 처리함수들은 데코레이터 패턴으로 꾸며진 새로운 시퀀스가 리턴 됨 최종 계산은 toList 또는 count 등의 최종 연산이 이루어질 때 수행됨 Iterable 즉시(eagerly) 연산 처리 함수를 사용할 때마다 연산이 이루어져 List가 만들어짐 public inline fun Sequence.filter( predicate: (T) -> Boolean ): Sequence { return FilteringSequence(ths, true, predicate) } public inline fun Iterable.fil..
깡냉쓰
평범한 개발자 노트