3-단위 테스트 구조

단위 테스트를 구성하는 방법 AAA 패턴 사용 AAA 패턴은 각 테스트를 준비(arrange), 실행(act), 검증(assert)이라는 세 부분으로 나눌 수 있다. 준비 구절: 테스트 대상 시스템(SUT)과 해당 의존성을 원하는 상태로 만든다. 실행 구절: SUT에서 메서드를 호출하고 준비된 의존성을 전달하며 출력 값을 캡처한다. 검증: 결과를 검증한다. SUT의 반환 값이나, SUT 협력자의 최종 상태, SUT가 협력자에 호출한 메서드 등으로 결과를 검증할 수 있다. Given-When-Then 패턴과 차이점은 없다. 유일한 차이점은 프로그래머가 아닌 사람에게 Given-When-Then 구조가 더 읽기 쉽다는 것이다....

2024-09-15 · 5 min · 1046 words

2-함께

소프트웨어 관리자의 개선 우선순위 조엘 테스트: 조엘 스폴스키라는 사람이 만든 ‘개발팀 평가 테스트’ 소스 컨트롤을 사용하는가? 한 번에 빌드를 만들어낼 수 있는가? 일일 빌드를 만드는가? 버그 데이터베이스를 가지고 있는가? 새로운 코드를 작성하기 전에 버그를 고치는가? 최신 업데이트된 스케줄이 있는가? 스펙(제품 명세)이 있는가? 프로그래머가 조용한 작업환경에 일하는가? 돈이 되는 한 최고의 툴을 사용하는가? 테스터가 있는가? 채용 면접 때 후보가 코드를 짜게 해보는가? 복도 사용성 테스트를 하는가? 이 테스트의 문제점은 관리자나 경영진이 각 질문의 맥락을 이해하지 못한 채 단순히 12가지 질문에 예라고 답하는 것을 목표로하는 경우가 있다....

2024-09-15 · 4 min · 799 words

2-파드와 디플로이먼트로 컨테이너 실행하기

모든 컨테이너는 파드(pod)에 속하는데, 파드란 쿠버네티스가 하나 또는 그 이상의 컨테이너를 관리하는 데 사용하는 단위다. 파드는 다른 리소스가 관리하고, 이런 고수준 리소스는 컨테이너의 세부사항을 추상화 시킨다. 이 방법으로 자기수복형(self-healing) 애플리케이션이나 바람직한 상태(desired-state) 워크플로가 가능해진다. 쿠버네티스는 어떻게 컨테이너를 실행하고 관리하는가 컨테이너는 일반적으로 애플리케이션 구성 요소 하나를 실행하는 가상화된 환경 가리킨다. 쿠버네티스는 이 컨테이너를 또 다른 가상 환경인 파드로 감싼다. 파드는 컴퓨팅의 단위로, 클러스터를 이루는 노드 중 하나에서 실행된다. 파드는 쿠버네티스로 관리되는 자신만의 가상 IP 주소를 가지며 이 주소로 가상 네트워크에 접속된 다른 파드, 심지어 다른 노드에서 실행되는 파드라도 통신을 주고 받을 수 있다....

2024-09-15 · 3 min · 442 words

2-코틀린 기초

기본 요소: 함수와 변수 Hello, World! 함수를 선언할 때 fun 키워드를 사용한다. 파라미터 이름 뒤에 그 파라미터의 타입을 쓴다. 함수를 최상위 수준에서 정의할 수 있다. 꼭 클래스 안에 함수를 넣어야 할 필요가 없다. 배열도 일반적인 클래스와 마찬가지다. 코틀린에는 자바와 달리배열 처리를 위한 문법이 따로 존재하지 않는다. System.out.println 대신에 println이라고 슨다. 코틀린 표준 라이브러리는 여러 가지 표준 자바 라이브러리 함수를 간결하게 사용할 수 있게 감싼 wrapper를 제공한다. 줄 끝에 세미콜론을 붙이지 않아도 좋다....

2024-09-15 · 5 min · 1029 words

2-컴퓨터의 구조와 성능 향상

컴퓨터의 기본 구성 하드웨어의 구성 CPU: 명령어를 해석하여 실행하는 장치다. 메모리: 작업에 필요한 프로그램과 데이터를 저장하는 장소로, 바이트 단위로 분할되어 주소로 구분한다. 입력장치: 외부의 데이터를 컴퓨터에 입력하는 장치다. 천공카드, 키보드, 마우스, 스캐너 등 출력장치: 컴퓨터에서 처리한 결과를 사용자가 원하는 형태로 출력하는 장치다. 프린터, 모니터, 스피커 저장장치: 메모리보다 느리지면 저렴하고 용량이 크며, 전원이 꺼져도 데이터가 영구히 저장되는 장치다. 버스: 컴퓨터 부품들이 연결하는 통로. 일정한 규칙에 따라 각 장치에 데이터를 전송하는 역할을 한다....

2024-09-15 · 11 min · 2334 words

2-인덱스와 인덱싱

성능 향상과 관련 없는 딴짓 레드헤링(Red Herring): 목표로부터 주의를 딴 데로 돌리는 상황 MySQL 성능을 향상하기 위한 방법을 찾을 때 일반적으로 두 가지 레드헤링이 있다. 하드웨어를 구매하는 것 MySQL 튜닝 더 좋고 빠른 하드웨어! MySQL 성능이 만족스럽지 않을 때 성능 향상에 도움이 되는지 확인하기 위해 스케일업부터 시작하지 말라. 이 경우가 합리적인 2가지 상황 하드웨어 성능 부족으로 명백하게 느린 경우 예) 500GB의 데이터에 1GB의 메모리를 사용하는 경우 애플리케이션의 사용량이 급증하고 있으며, 하드웨어 스케일업이 애플리케이션 실행에 있어 안정성을 담보하기 위한 임시 방편인 경우 단순 스케일업은 아무것도 배우지 못하며, 고사양의 하드웨어 구매로 문제를 대강 뭉개는 데 익숙해질 것이다....

2024-09-15 · 12 min · 2441 words

2-웹 애플리케이션 개발하기

정보 보여주기 스프링 웹 애플리케이션에서는 데이터를 가져오고 처리하는 것이 컨트롤러의 일이다. 브라우저에 보여주는 데이터를 HTML로 나타내는 것은 뷰가 하는 일이다. 도메인 설정하기 도메인: 애플리케이션의 이해에 필요한 개념을 다루는 영역 class Ingredient(val id: String, val name: String, val type: Type) { enum class Type { WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE } } data class Taco(val name: String? = null, val ingredients: List<String>? = null) 컨트롤러 클래스 생성하기 컨트롤러: HTTP 요청을 처리하고, 브라우저에 보여줄 HTML을 뷰에 요청하거나, 또는 REST 형태의 응답 몸체에 직접 데이터를 추가한다....

2024-09-15 · 4 min · 741 words

2-벽돌부터 시작하기 프로그래밍 패러다임

소프트웨어 아키텍처는 코드로부터 시작한다. 프로그래밍 언어는 쉴 틈 없이 쏟아져나왔으며, 프로그래밍 패러다임도 몰아쳤다. 패러다임: 프로그래밍을 하는 방법으로 대체로 언어에 독립적이다. 패러다임은 어떤 프로그래밍 구조를 사용할지, 그리고 언제 이 구조를 사용해야 하는지를 결정한다. 패러다임 개요 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다. 무분별한 점프는 프로그램 구조에 해롭다는 사실을 제시했다. 객체 지향 프로그래밍: 제어흐름의 간접적인 전황에 대해 규칙을 부과한다. 함수 호출 스택 프레임을 힙으로 옮기면, 함수 호출이 반환된 이후에도 함수에서 선언된 지역변수가 오랫동안 유지될 수 있음을 발견했다....

2024-09-15 · 3 min · 540 words

2-단위 테스트란 무엇인가

‘단위 테스트’의 정의 단위 테스트는 작은 코드 조각을 검증하고, 빠르게 수행하고, 격리된 방식으로 처리하는 자동화된 테스트다. 격리 문제는 단위 테스트의 고전파와 런던파를 구분할 수 있게 해주는 근원적 차이에 속한다. 격리 문제에 대한 런던파의 접근 런던파에서는 테스트 대상 시스템을 협력자에게서 격리한다. 하나의 클래스가 다른 클래스 또는 여러 클래스에 의존하면 이 모든 의존성을 테스트 대역(test double)으로 대체해야 한다. 장점 테스트가 실패하면 코드베이스의 어느 부분이 고장 났는지 확실히 알 수 있다. 객체 그래프를 분할할 수 있다....

2024-09-15 · 5 min · 933 words

2-네트워크의 기본 규칙

네트워크의 규칙 프로토콜: 네트워크 내의 컴퓨터 간에 통신 방법에 대한 규칙이나 표준 OSI 모델과 TCP/IP 모델 회사마다 사용하는 기술들을 통일 시키기 위해서 표쥰 규격을 정했다. 이를 OSI 모델이라고 한다. 네트워크의 기본 구조를 7개의 계층으로 나눠서 표준화했다. 7계층: 애플리케이션 계층 이메일, 파일전송, 웹사이트 조회 등 애플리케이션에 대한 서비스를 제공한다. 6계층: 프레젠테이션 계층 문자 코드, 압축, 암호화 등의 데이터를 변환한다. 5계층: 세션 계층 세션 체결, 통신 방식을 결정한다. 4계층: 트랜스포트 계층 신뢰할 수 있는 통신을 구현한다....

2024-09-15 · 2 min · 273 words

2-기본으로 돌아가기

C 에서 문자열의 문제점 널 문자를 찾아서 문자열 끝까지 가보기 전에는 끝을 알아내는 방법이 없다. 문자열 내부에는 어떤 0값도 포함할 수 없으므로, JPEG 그림과 같은 비정형 이진 자료 Binary Large OBject(BLOB)를 C 문자열 내부에 저장할 수 없다. C 문자열이 이런 방삭을 채택한 이유 유닉스와 C 언어를 고안했을 무렵 사용한 PDP-7 마이크로프로세서 때문이다. PDP-7은 ASCIZ 문자열 타입을 지원하는데, ASCIZ에는 ‘끝이 Z(ero)인 ASCII’라는 의미를 가진다. ASCIZ의 문제점 strcat을 구현하는 과정이 러시아 페인트공 알고리즘을 사용하고 있다....

2024-09-15 · 2 min · 266 words

2-개략적인 규모 추정

2의 제곱수 모든 프로그래머가 알아야 하는 응답지연 값 메모리는 빠르지만 디스크는 아직도 느리다. 디스크 탐색은 가능한 피하라. 단순한 압축 알고리즘은 빠르다. 데이터를 인터넷으로 전송하기 전에 가능하면 압축하라. 데이터 센터는 보통 여러 지역에 분산되어 있고, 센터들 간에 데이터를 주고받는 데는 시간이 걸린다. 가용성에 관계된 수치들 고가용성(high availability): 시스템이 오랜 시간 동안 지속적으로 중단 없이 운영될 수 있는 능력 100%는 시스템이 단 한 번도 중단된 적이 없었음을 의미한다. 대부분의 서비스는 99%에서 100%사이의 값을 갖는다....

2024-09-15 · 2 min · 230 words

1-쿼리 응답 시간

성능은 곧 쿼리 응답 시간 쿼리 응답 시간: MySQL이 쿼리를 실행하는 데 소요되는 시간 같은 의미: 응답 시간, 쿼리 시간, 실행 시간, 쿼리 지연 시간 소요 시간: MySQL이 쿼리를 받았을 떄 시작되고 셜과 세트를 클라이언트에 전송한 시점까지의 경과 시간 핵심 지표 갑작스럽게 벌어진 MySQL 성능 저하 현상은 여러 가지를 고려해야 해서 해결 방법을 파악하기 어려울 수 있다. 또한 MySQL 전문가가 아닌 응용 프로그램 엔지니어라면 이 문제가 크게 느껴질 수 있다....

2024-09-15 · 9 min · 1917 words

1-코틀린이란 무엇이며, 왜 필요한가

코틀린의 주요 특성 대상 플랫폼: 서버, 안드로이드 등 자바가 실행되는 모든 곳 코틀린을 활용할 수 있는 가장 일반적인 영역 서버상의 코드 안드로이드 디바이스에서 실행되는 모바일 애플리케이션 코틀린은 개발 과정에서 수행해야 하는 모든 과업에 있어 폭넓게 생산성을 향상시켜준다. 정적 타입 지정 언어 정적 타입: 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드와 메서드를 사용할 떄마다 컴파일러가 타입을 검증해준다. 성능: 실행 시점에 어떤 메서드를 호출할지 알아내는 과정이 필요 없으므로 메서드 호출이 더 빠르다....

2024-09-15 · 4 min · 671 words

1-자라기

현실 세계에는 학교 학습보다 야생 학습이 더 많이 필요하다. 야생 학습의 특징 대부분 협력적이다. 대부분 비순차적이다. 대부분 자료에 한정이 없다. 대부분 명확한 평가가 없다. 대부분 정답이 없다. 대부분 목표가 불분명하고 바뀌기도 한다. 불확실성이 높을수록 야생 학습이 중요하다. 당신은 몇 년 차? 경력, 그 견딜 수 없는 무거움 경력 연차라는 것으로부터 이 사람이 초급인지 아닌지 정도의 정보만 기대할 수 있다. 초급이 아닌 사람들에 대해서는 경력 연차가 오히려 혼동을 불러일으키는 발못된 정보로 작용할 수 있다....

2024-09-15 · 8 min · 1610 words

1-운영체제의 개요

운영체제 소개 운영체제의 역할 자원 관리: 컴퓨터 자원(키보드, 네트워크 카드, 사운드 카드 등)을 요청한 애플리케이션들에게 적절한 순서로 자원을 배분하고 적절한 시점에 자원을 회수한다. 자원 보호: 악의적이거나 미숙한 애플리케이션, 사용자으로부터 자원을 보호하는 역할을 한다. 다른 영역의 자원을 침범하여 데이터를 수정하거나 삭제를 막아준다. 하드웨어 인터페이스 제공: CPU, 메모리, 키보드, 마우스와 같은 하드웨어가 제조사에 신경쓸 필요없이 사용할 수 있도록 하드웨어 인터페이스를 제공한다. 하드웨어 인터페이스 지원은 드라이버를 설치해야 가능한데, 대부분의 드라이버는 운영체제를 설치할 때 자동으로 설치된다....

2024-09-15 · 6 min · 1139 words

1-안정성

가변성을 제한하라 상태를 구현하는 방법 var 프로퍼티 사용 mutable 객체 사용 (MutableList, MutableSet 등) 상태를 가질 때 문제점 상태를 추적해야되기 때문에, 프로그램을 이해하고 디버그하기 힘들어진다. 시점에 따라서 값이 달라질 수 있으므로, 코드의 실행을 추론하기 어려워진다. 멀티스레드 프로그램일 때는 적절한 동기화가 필요하다. 모든 상태를 테스트해야 하므로, 테스트하기 어렵다. 상태 변경이 일어날 때, 이러한 변경을 다른 부분에 알려야 하는 경우가 있다. 코루틴: 프로그램의 실행 흐름을 일시적으로 중단하고, 나중에 중단한 시점부터 실행을 재개할 수 있는 멀티 태스킹 기법....

2024-09-15 · 11 min · 2253 words

1-시작하기 전에

쿠버네티스 이해하기 쿠버네티스는 컨테이너를 실행하는 플랫폼 컨테이너화된 애플리케이션의 시작, 롤링 업데이트, 서비스 수준 유지, 수요에 따른 스케일링, 보안 접근 등 다양힌 기능을 제공한다. 쿠버네티스의 핵심 개념 애플리케이션 정의에 사용되는 API 애플레케이션이 실제로 동작하는 클러스터 클러스터는 도커 같은 컨테이너 런타임이 동작하는 여러 대의 서버가 모여 하나의 논리적 단위를 구성하는 것을 의미한다. YAML 파일에 애플리케이션을 기술하고 이 파일을 쿠버네티스 API에 전달하면, 쿠버네티스가 파일게 기술된 애플리케이션 구성을 이해하고 클러스터 현재 상태와 비교한다. 파일에 기술된 바람직한 상태와 현재 상태에 차이가 있따면 컨테이너를 추가 또는 제거한다....

2024-09-15 · 2 min · 320 words

1-스프링 시작하기

스프링이란? 스프링 애플리케이션 컨텍스트(Spring application context): 애플리케이션 컴포넌트들을 생성하고 관리하는 컨테이너. 빈(bean): 스프링에서 관리하는 애플리케이션 컴포넌트 빈의 상호 연결은 Depedency Injection이라고 알려진 패턴을 기반으로 수행된다. 스프링 애플리케이션 컨텍스트가 빈의 생성과 관리를 자체적으로 해주며, 모든 빈을 생성, 관리하고 빈을 필요로 하는 다른 빈을 주입한다. 지금까지의 스프링 버전에서는 XML 파일을 사용해서 빈을 상호 연결하도록 스프링 애플리케이션 컨텍스트에 알려줬다. 최신 버전에서는 자바 기반의 configuration이 더 많이 사용된다. @Configuration은 이것이 각 빈을 스프링 애플리케이션 컨텍스트에 제공하는 구성 클래스라는 것을 스프링에게 알려준다....

2024-09-15 · 4 min · 770 words

1-소프트웨어 늪지대

공룡과의 승부 오늘날에도 소프트웨어 프로젝트들을 괴롭히는 난제들은 거의 편하지 않았다. 소프트웨어 프로젝트가 실패하는 가장 큰 요인은 요구사항의 문제(시스템을 잘못 정의하거나, 요구사항이 구체적인 구현을 하기에 모호하거나 너무 자주 바뀌어서 결국 시스템 디자인을 엉망으로 만들어 버리는 일들)과 관려이 있다고 하단다. 포트란이 개발되었을 때 사람들은 이제부터 컴퓨터 프로그래밍을 할 필요가 없을 것이라고 생각했다. 그러나 컴퓨터는 문제 정의를 자동화하는 것은 불가능하다. 문제를 정의하기 위해 필요한 것이 바로 프로그래밍이고, 이런 관점에서 본다면 프로그래밍은 절대로 사라지지 않을 것이다....

2024-09-15 · 7 min · 1369 words