전체 글 67

린 소프트웨어 개발, 개발의 7대 낭비와 예방

린 소프트웨어 개발 방법론은 소프트웨어 개발 과정에서 불필요한 낭비 과정을 제거하고 신속하게 고객에게 가치를 전달하는 것을 목표로 한다. 이를 위해 개발, 통합, 테스트, 문서화, 배포까지 하나의 흐름을 빠르게 진행한다. 이는 한 번에 처리하는 작업량을 작게 구성해 반복적으로 개발함을 의미한다. 린 개발 방법론은 1940년대 제조 업체에서 등장하여, 생산 비용은 대량 생산에서와 같이 낮게 유지시키면서 생산량은 줄여 품질을 향상시키는 역할을 하였다. 신고 시게오는 제조 7대 낭비를 정의했고, 이를 소프트웨어 개발에도 적용해볼 수 있다. 1. 미완성 작업 Partially Done Work 설계 및 요구사항 문서는 있지만 코드로 구현되지 않은 작업 설계 및 요구사항이 오래될수록 변경될 가능성도 커진다. 고객..

Principal 2022.04.06

리액티브 프로그래밍(Reactive Programming)이 뭐냐고?

리액티브 프로그래밍 지금까지 흔히 사용했던 리스트(List)와 같은 컬렉션은 이미 데이터가 '생성'되어 있습니다. 하지만 리액티브 프로그래밍에서는 '데이터가 통지될 때마다' 프로그램이 '반응'하여 데이터를 처리합니다. 이러한 데이터의 흐름을 데이터 스트림이라고 하며, '앞으로 생성될지도 모르는 데이터'까지도 포함하는 개념입니다. 쇼핑몰을 기존의 방식대로 만들자면, (주문 발생 -> 주문쪽에서 상품 재고 변경 호출)이 수행될 것입니다. 리액티브 프로그래밍에서는 (주문 발생 -> 상품쪽으로 상품 재고 변경 데이터 전달 -> 상품쪽에서 상품 재고 변경)이 수행됩니다. 객체의 책임이 달라지는 것이죠. 주문쪽은 데이터 전달까지만 책임지고 그 데이터로 상품쪽이 무엇을 하든 상관하지 않습니다. 이런 방식의 장점은 무..

Principal 2022.03.16

분산 시스템 설계시 고려할 것 - CAP 정리

CAP 정리 (Consistency, Availavility, Partition Tolerance theorem) 분산 시스템을 설계할 때는 CAP 정리를 이해하고 있어야 한다. Consistency 데이터 일관성 분산 시스템의 어느 노드에 접속하더라도 같은 데이터를 응답받아야 한다. Availability 가용성 분산 시스템의 어느 노드에 장애가 발생하더라도 항상 응답받아야 한다. Partition Tolerance 파티션 감내 분산 시스템의 두 노드 사이에 통신 장애가 발생하더라도 시스템은 계속 동작하여야 한다. 세 가지 요구사항을 동시에 만족하는 분산 시스템을 설계하는 것은 불가능하다. 요구사항 가운데 어느 두 가지를 만족시킬 것인지 결정해야 한다. (+ 일관성과 가용성을 동시에 만족하는 시스템은 ..

Optimization 2022.03.13

TypeScript 시작하기

Why TypeScript?function fn(x) { return x.flip();}자바스크립트는 런타임에 타입을 확인하고 무엇을 할지 결정한다.위 코드에서 fn은 특정한 타입의 x를 받아야 하고, x가 반드시 callable한 flip를 가지고 있어야 한다.이로 인해 시스템의 동작을 예측하기 어려워지고, 프로그래머의 실수를 런타임에야 발견하게 된다.tscTypeScript compiler설치하기: npm install -g typescripttsc hello.ts타입을 체크한다.hello.js라는 새로운 파일이 생성된다.에러가 있더라도 hello.js 파일이 생성된다. (당신이 TypeScript보다 잘 알 것이기에)에러가 있을 때 컴파일을 하고 싶지 않다면 --noEmitOnError 옵션을..

Kotlin 2021.09.08

AWS S3, CloudFront, Route53으로 정적 웹페이지 호스팅하기

정적 웹페이지를 호스팅하려고 직접 웹서버를 설치하고 파일 올려놓기는 귀찮아... 그냥 AWS S3로 간단하게 끝낸다. 아래 방식으로 한다. client → [Route53] → [CloudFront] → S3 Route53은 DNS 서비스이고, CloudFront는 CDN 서비스이다. Route53와 CloudFront를 통해 tistory.com 같은 도메인으로 접근 HTTPS를 사용 엣지 포인트에 캐싱되어 빠른 속도로 서비스 비용 절감 (S3보다 CloudFront가 저렴) 1. S3 버킷 생성하고 리소스 업로드하기 모든 퍼블릭 액세스 차단을 설정한다. 사용자가 직접 S3에 접근하는 것을 막을 것이다. 리소스를 올릴 때도 마찬가지로 퍼블릭 읽기 액세스 권한을 부여하지 않는다. 2. ACM(Amazon..

DevOps 2021.08.28

프로토콜 버퍼 protobuf 란?

구글에서 만든 데이터 직렬화 기준 바이너리 기반 규격 메시지 크기를 줄이고, 처리 성능을 높일 수 있다. 수 많은 클라이언트가 요청할 때 사용 암호화 되어 저장되는 건 아니다. 스키마 파일 .proto → 컴파일러 protoc → 인터페이스 코드 .py → protobuf 라이브러리와 함께 프로젝트에 추가하여 사용 스키마 파일 프로토콜 버퍼에서 사용할 메시지 구조 정의 인터페이스 코드 컴파일러가 스키마를 읽어 만들어낸 결과물 모든 프로그램은 이 코드를 통해서만 데이터를 직렬화/역직렬화 할 수 있다. 사용하기 프로토콜 버퍼 컴파일러와 라이브러리를 준비한다. 스키마 파일을 정의한다. syntax = "proto3"; // 프로토콜 버퍼 문법 버전 명시 message SimpleMessage { string ..

Application 2021.08.27

Heap Dump 분석하기

OutOfMemorryError JVM의 Heap 공간이 부족하여 더이상 오브젝트를 Heap 공간에 할당할 수 없다는 의미이다. 메모리가 부족하여 가비지컬렉터가 Heap 공간을 복구하지 못한다. 프로그램에 비해 메모리가 부족하거나 메모리 릭이 발생했을 수 있다. Heap Dump 분석 프로세스 ID 확인하기 - jps ps -ef | grep java jps -v Heap 사용 정보 확인하기 - jmap jmap -heap jmap -histo:live histo: 인스턴스 개수, 메모리 사용량들을 확인할 수 있다. Heap Dump 파일 생성하기 - jmap jmap -dump:[live],format=b,file= live: 현재 active한 객체만 프린트 format=b: 덤프 파일을 binary..

Optimization 2021.07.26

AWS CloudWatch - EC2 어플리케이션 로그 저장하기

로깅 인프라 모니터링 클라이언트 요청 모니터링 : 의도한 대로 요청을 보내고 있는가, 공격 시도가 있는가, 얼마만큼의 요청이 들어오는가 애플리케이션 모니터링 : 에러가 있는가, 어떤 부분이 병목을 일으키고 있는가 데이터 모니터링 : 올바른 형태로 데이터가 저장되고 있는가, 어느 속도로 저장되고 있는가 AWS Auto Scaling을 이용하면 인스턴스는 계속해서 실행되고 종료된다. 여러개의 인스턴스에서 발생하는 로그를 한 곳에 모아 확인해야 하기도 하고, 인스턴스가 종료되면 내부에 저장된 로그 데이터는 모두 사라지기 때문에 외부에 로그를 저장해야 한다. CloudWatch AWS 자원 모니터링 및 관리 서비스 AWS 서비스의 모든 로그와 지표 정보를 수집해 한 눈에 볼 수 있도록 시각화해주며, 이 수집된 ..

DevOps 2021.07.25

Kotlin 시작하기

const 컴파일 타임에 결정됨 read-only Top-level / object의 멤버 / companion object의 멤버 No custom getter lateinit - var, non-null 프로퍼티에 사용 - 초기화 되기 전에 접근시 예외 발생 if (foo::bar.isInitialized) { println(foo.bar) } data class getters & setters in case of `var` equals() hashCode() toString() copy() componentN() read-only list val list = listOf("a", "b", "c") read-only map val map = mapOf("a" to 1, "b" to 2, "c" to ..

Kotlin 2021.05.02

AWS Secrets Manager, KMS(Key Management Service)

AWS Secrets Manager AWS의 비밀 값 관리 서비스 비밀 값들을 Secrets Manager에 저장하고, 애플리케이션에서 API를 통해 이 비밀 값들을 가져가 사용한다. 사용 절차 Secrets Manager에 '비밀'을 만들고, 그 안에 key, value 형태의 비밀 값들을 등록한다. AWS CLI나 SDK를 사용해서 Secrets Manager에 비밀 값을 요청한다. 비밀 값을 요청할 때 특정 IAM 사용자로서 요청해야 하며, 이 사용자에게 비밀 값 조회 권한이 있다고 판단되면 비밀 값을 준다. KMS (Key Management Service) 암호화 하는 데 사용되는 키를 관리하는 서비스 여기에 등록한 키를 다른 AWS 서비스가 가져다가 암호화를 진행한다. Secrets Manag..

DevOps 2021.04.20

AWS 자동 배포하기 (2) - CodeDeploy : 무중단배포

[이전 글] GitLab pipeline 빌드된 Jar를 AWS S3에 저장하기 AWS 자동 배포하기 (1) - EC2, Auto Scaling, Load Balancing 이 글에선 Code Deploy를 통해 무중단 배포 자동화 하는 방법에 대해 알아본다. 훑어보기 소스를 수정하고 배포할 때마다 서비스가 중단되면 정기 점검날을 정해두고 배포를 진행해야 할 것이다. 사용자가 서비스를 끊김 없이 사용하도록 하기 위해 무중단 배포를 진행하는 것이 좋다. (하지만 애플리케이션 코드나 데이터베이스 스키마의 구, 신 버전이 동시에 서비스되면 안 되는 경우 등에는 중단 배포를 하거나 별도의 처리가 있어야 한다.) 애플리케이션 코드를 AWS S3에 업로드 한다. CodeDeploy에게 배포를 요청한다. CodeDe..

DevOps 2021.03.18

Redis 레디스 기본 알고 쓰기

레디스란 데이터를 안정적으로 저장하고 빠르게 처리하기 위해 NoSQL, Redis, Memcache, Sharding 등 대용량 데이터 처리 관련 기술을 사용한다. 레디스는 그 중 하나로, 캐시솔루션 또는 NoSQL Key-Value 스토어로 분류된다. 레디스의 특성 Key-Value 스토어 컬렉션 자료구조 지원 디스크 저장 가능 마스터-슬레이브 구조 지원 Publish / Subscribe 모델 지원 그리고 높은 성능 (100,000QPS) 컬렉션 자료구조 List, Set, Sorted Set, Hash 등의 자료구조 지원. 분산 환경에서 컬렉션을 공유하여 사용할 수도 있다는 것. 디스크 저장 캐시는 빠른 속도를 위해 데이터를 메모리에 저장한다. = 데이터가 사라질 수 있다. 하지만 레디스는 저장소라..

Application 2021.02.17

책 <대용량 아키텍처와 성능 튜닝>

성능 엔지니어링 언제 해야 하는가? 분석 단계 성능에 대한 목표 세우기 목표 응답 시간 총 사용자 수 동시 접속자 수 성능 모델 (부하의 패턴) 서비스의 종류 (웹, 게임, 기업 시스템, 쇼핑, 뱅킹 등), 사용자층, 지역 고려 디자인 단계 목표 성능과 용량을 달성할 수 있는 규모의 시스템 설계를 진행한다. 피크 타임에 맞춰서 디자인한다. 부하가 일정하고 예측 가능할 땐 고정된 사이즈의 하드웨어, 부하가 갑자기 몰리는 시스템은 클라우드를 이용해 auto scale out 모델을 사용한다. 100,000명 정도가 사용하는 시스템은 RDBMS를 사용해도 문제 없다. 100,000,000명 정도가 사용하는 시스템은 샤딩이나 NoSQL 등을 사용해야 한다. 또한 빠른 응답시간을 요구하는 경우 Redis, Mem..

Optimization 2021.02.15