개발 공부 기록하기 108

Unable to find method java.lang.String org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper.getKotlinPluginVersion() 원인

회사에서 사용하는 프로젝트의 언어 (Kotlin), 프레임워크 (Spring Boot) 최신화를 하려고 하는 중인데 Unable to find method ''java.lang.String org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper.getKotlinPluginVersion()'' 'java.lang.String org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper.getKotlinPluginVersion()' Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) Re-downloa..

mockk 간단 사용법

https://mockk.io/ MockK Provides DSL to mock behavior. Built from zero to fit Kotlin language. Supports named parameters, object mocks, coroutines and extension function mocking mockk.io mock 객체 생성하기 val domainRepository = mockk() Argument Matching 사용하기 특정 객체에 expected answer를 부여할때 파라미터를 지정해주어야 한다. matcher는 다음과 같은 느낌으로 동작한다 // 들어오는 파라미터가 1L 일때만 cycle을 반환 every { domainRepository.findById(1L) } r..

이펙티브 코틀린 간단 정리 (Effective Kotlin)

잘 몰랐거나, 인상깊은 부분 위주로만 정리 1장 안정성 안정성 : 크래시가 적으면 사용자와 개발자 모두에게 좋고, 상당한 비즈니스 가치를 제공한다. Item 1. 가변성을 제한하라 시간의 변화에 따라서 변하는 요소를 표현할 수 있다는 것은 유용하지만, 상태를 적절하게 관리하는 것이 생각보다 꽤 어렵다. 프로그램을 이해하고 디버그하기 힘들어진다. 시점에 따라 값이 달라질 수 있기 때문에 코드의 실행을 추론하기 어려워진다. 멀티스레드 프로그램일 때는 적절한 동기화가 필요하다. 테스트하기 어렵다. 상태 변경이 일어날 때 이러한 변경을 다른 부분에 알려야 하는 경우가 있다. 가변성은 시스템의 상태를 나타내기 위한 주요한 방법이다. 하지만, 변경이 일어나야 하는 부분을 신중하고 확실하게 결정하고 사용해야 한다. ..

단위 테스트 - 단위 테스트의 목표와 고전파, 런던파

1부. 더 큰 그림 1. 단위 테스트의 목표 단위 테스트에 시간을 투자할 때는 항상 최대한 이득을 얻도록 노력해야 하며, 테스트에 드는 노력을 가능한 줄이고 그에 따르는 이득을 최대화 해야 한다. 단위 테스트의 목표 : SW 프로젝트의 지속 가능한 성장을 가능하게 하는 것 지속 가능한 프로젝트 성장을 위해서는 '고품질' 테스트에만 집중해야 한다. 코드 커버리지 코드 커버리지가 너무 적을 때는 테스트가 충분하지 않다는 좋은 증거이다. 그러나 반대의 경우는 그렇지 못하다. 100% 커버리지라고 해서 반드시 양질의 테스트 스위트라고 보장하지는 않는다. 높은 커버리지의 테스트 스위트도 품질이 떨어질 수 있다. 테스트 스위트의 품질을 결정하는 데 어떤 커버리지 지표도 의존할 수 없는 이유는 다음과 같다. 테스트 ..

대규모 시스템 설계 기초 - 9. 웹 크롤러 설계

웹 크롤러는 몇 개 웹 페이지에서 시작하여 그 링크를 따라 나가면서 새로운 컨텐츠를 수집한다. 크롤러는 다양하게 이용된다. 검색 엔진 인덱싱 웹 페이지를 모아 검색 엔진을 위한 로컬 인덱스 생성 웹 아카이빙 나중에 사용할 목적으로 장기보관하기 위해 웹에서 정보를 모으는 절차 웹 마이닝 인터넷에서 유용한 자료를 도출 (주주 총회 자료 or 연차 보고서 저장 등) 웹 모니터링 인터넷에서 저작권이나 상표권이 침해되는 사례를 모니터링 웹 크롤러의 기본 알고리즘은 간단하다. URL 집합이 입력으로 주어지면, 해당 URL 들이 가리키는 모든 웹 페이지를 다운로드 한다 다운받은 웹 페이지에서 URL들을 추출한다. 추출된 URL들을 다운로드할 URL 목록에 추가하고 위의 과정을 처음부터 반복한다. 요구사항 정성적 측면..

대규모 시스템 설계 기초 - 8. URL 단축키 설계

bit.ly 를 생각하면 된다. 크게 2가지 기능이 존재함 긴 URL을 넣으면 짧은 URL을 알려준다 (POST) 단축된 URL을 넣으면 원래 URL을 알려준다 (GET) - redirect 기본적인 요구사항 기본 : 높은 가용성, 규모 확장성, 장애 감내 쓰기 연산 트래픽 : 매일 1억건 서비스 유지 기간 : 10년 정도 이를 통해 다음과 같은 조건을 추가로 유추할 수 있다. 초당 쓰기 연산 횟수 : 1160회 (매일 1억건이므로 86400초로 나눔) 읽기 연산을 쓰기 연산의 10배로 가정시 읽기 연산 초당 11600회 TPS 13,000 ~ 14,000 하루 1억건씩 10년이면 총 3650건의 레코드 보관 1레코드 당 100byte 가정시 36.5TB 필요 비즈니스 조건 URL의 길이는 가능한 짧으면..

단위 테스트 4. 좋은 단위 테스트의 4대 요소

좋은 단위 테스트에는 다음 4가지 특성이 있다. 회귀 방지 리팩토링 내성 빠른 피드백 유지 보수성 하나씩 살펴보자 회귀 방지 회귀방지란 SW 버그를 방지할 수 있어야 한다는 의미이다. 코드 수정 후 버그가 있었는데 테스트가 통과하면 안된다. 회귀방지를 평가하려면 다음 사항을 고려해야 한다. 테스트 중에 실행되는 코드의 양 코드 복잡도 코드의 도메인 유의성 회귀방지를 극대화하려면 테스트가 가능한 많은 코드를 실행하는 것을 목표로 해야 한다. 리팩토링 내성 리팩토링 내성은 테스트를 실패로 바꾸지 않고 기본 애플리케이션 코드를 리팩토링 할 수 있는지에 대한 척도이다. 여기서 말하는 리팩토링이란 코드의 비기능적 특징을 개선하는 것으로 가독성을 높이고 복잡도를 낮추는 것이다. 예를 들어 메소드 이름을 바꾸거나 코..

대규모 시스템 설계 기초 - 7. 분산 시스템을 위한 유일 ID생성기 설계

분산 시스템에서 사용될 유일 ID 생성기 요구사항 ID는 유일해야 한다 ID는 숫자로만 구성되어야 한다. ID는 64비트로 표현될 수 있는 값이어야 한다. ID는 발급 날짜에 따라 정렬 가능해야 한다. 초당 10,000 개의 ID를 만들 수 있어야 한다. 선택지 다중 마스터 복제 특징 DB의 auto increment 기능을 활용하는 것이다. 다만 다음 ID를 구할 때 1만큼 증가시키지 않고 k 만큼 증가시킨다. 간단하게 적용할 수 있는 방식이고, 한 데이터 센터에서 어느정도 확장도 가능하다 단점 여러 데이터 센터에 걸쳐 규모를 늘리기 어렵다. ID의 유일성은 보장되겠지만, 그 값이 시간 흐름에 맞추어 커지도록 보장할 수는 없다 서버를 추가하거나 삭제할 때도 잘 동작하도록 만들기 어렵다. k가 고정되고 ..

대규모 시스템 설계 기초 - 6. 키-값 저장소 설계

키-값 저장소는 키-값 DB라고도 불리는 비 관계형 DB이다. 키는 유일해야 하며, 키에 매달린 값은 키를 통해서만 접근할 수 있다. 키-값 저장소로 널리 알려진 것으로는 아마존 다이나모, memcached, Redis 같은 것들이 있다. 분산 키-값 저장소 분산 키-값 저장소를 설계하기 전에, 단일 키-값 저장소를 생각해보자. 단일 키-값 저장소는 간단하다. 키-값 쌍 전부를 메모리에 hash table로 저장하면 된다. 또한 2가지 개선책 1) 데이터 압축 2) 자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 저장 을 이용하면 조금 더 나은 단일 키-값 저장소를 만들 수 있다. 하지만 한 대 서버로는 부족한 때가 찾아오며 결국은 분산 키-값 저장소를 활용할 수 밖에 없다. 먼저 분산 시스템을 설..