분류 전체보기
3장 - 패러다임 개요
3가지 패러다임에 대해서 배운다 구조적 프로그래밍 객체지향 프로그래밍 함수형 프로그래밍 구조적 프로그래밍 최초로 적용된 패러다임이다. 구조적 프로그래밍은 제어 흐름의 직접적인 전환에 대해 규칙을 부과한다. 객체지향 프로그래밍 함수 호출 스택 프레임을 heap으로 옮김으로써 함수 호출이 반환된 이후에도 함수에서 선언된 지역 변수가 오래 유지 됨을 발견 객체지향 프로그래밍은 제어흐름의 간접적인 전환에 대해 규칙을 부과함 힘수형 프로그래밍 알론조 처치라는 사람이 수학적 문제를 발견하는 과정에서 람다 계산법을 발명함 람다 계산법의 기초가 되는 개념은 ‘불변성’으로 심볼 값이 변경되지 않는다는 개념 함수형 프로그래밍은 할당문에 대해 규칙을 부과한다. 결론 패러다임의 역사로부터 얻는 교훈은 아키텍처와 모두 관련이 ..
2장 - 두 가지 가치에 대한 이야기
개발자가 가지는 책임 행위와 구조를 높게 유지하여야함 소프트웨어라는 단어는 개발자가 프로그램을 요구사항에 맞춰 변경을 쉽게 할 수 있도록 하는 것을 말함. 프로그램이 변경에 취약하면 변경하는데 비용이 많이 든다. 변경을 하면 할수록 변경이 어려워지는데 이는 시스템 아키텍처에 문제가 있을 확률이 높다. (시스템의 형태와 요구사항이 맞지 않음) 더 높은 가치 기능 vs 아키텍처 (나는 아키텍처가 더 높다고 생각) 업무관리자들은 소프트웨어 시스템이 동작하는 것이 중요하다고 하다. 그렇지만 이는 잘못된 태도다 완벽하게 동작하지만 수정이 불가능한 프로그램은 지금 당장은 쓸모가 있어도 요구사항이 생기면 쓸모가 없어지게 된다. 반면에 동작은 되지 않지만 변경이 쉬운 프로그램을 준다면 프로그램이 돌아가게만 만들면 되고..
1장 - 설계와 아키텍처란?
설계와 아키텍처 차이 아무런 차이가 없다 좋은 설계와 나쁜 설계 좋은 설계 : 수명이 다할 때 까지 낮게 유지 나쁜 설계 : 기능을 만들 때마다 비용이 증가 좋은 설계가 되지 못한다면 아무리 많은 개발자들이 투입이 되어도 스파게티 코드들만 양산될 뿐이고, 나쁜 설계 이기 때문에 기능의 수정에 많은 시간과 인력을 소모하게 되고 가면 갈수록 되돌아 갈 수 없을 만큼 되어서 차세대를 통해서 문제를 해결하고자 한다. 이러한 것을 없애고자 한다면 처음부터 많은 시간을 투자해서 최대한 타협해서 좋은 설계를 만들고 개발을 시작해야 한다.
로그 레벨 (Log Level)
이 글을 쓰게된 이유는 어느 순간 log 레벨을 무분별하게 사용하고 있는 나 자신에 대해서 보게 되었다. 그래서 공부도 할겸 찾아보고 정리하면서 내 머리 속에 넣기로 하였음 주요 목적은 시스템에서 반복되는 오류가 감지되는 경우와 같이 문제나 잠재적인 문제를 설명하는 메시지와 단순히 정보 제공하는 메시지를 분리 로그 수준은 필요한 정보만 기록되도록하고 생성된 로그의 양을 규제하는 방법이 있어야 한다. (스토리지 최소화) Fetal 애플리케이션에서 가장 심각한 문제를 기록하기 위해 예약되어 있는 로그 수준이다. 일반적으로 데이터 손상이나 애플리케이션을 종료하기 직전에 기록됨 예시) 중요한 구성 정보가 누락 되었을 경우 핵심 애플리케이션 작업에 필요한 필수 외부 종속성 또는 서비스가 손실 됐을 경우 서버의 디..
'실력있는 개발자로 살아남는 방법'을 읽고
첫 번째, 기술적 상상을 하자 IT 서비스를 이용하면서 궁금한 점을 많이 가지고 살자. 예를 들면 배달음식을 시키면 어떻게 기사가 배정이 되고 우리에게 배달이 되는지, 토스 주식 알림은 어떤식으로 많은 사용자에게 알림을 주는지 와 같은 것들을 간접적으로 생각해보는 것, 그리고 직접 구현을 해본다면 더 좋다! 올해 읽은 책 중에 ‘가상 면접 사례로 배우는 대규모 시스템 설계 기초’라는 책이 있다. 대규모 아키텍처를 공부하기 위해서 필수라고 생각되는 책인 것 같다. 아직 전체 부분을 보지는 않았고 내 업무와 밀접하게 연관 되어 있거나 내가 관심 있을 만한 부분만 읽었다. 두 번째, 나를 위해 기록하자. 일을 하면서나 공부를 하면서 얻은 기억을 까먹기 쉽다. 나 또한 그런 것 같다. 직면한 문제를 구글링을 해..
단위 테스트
단위 테스트의 목표 단위 테스트에 시간을 투자할 때는 항상 최대이익을 얻도록 노력해야 하고, 테스트에 드는 노력을 가능한 줄이고 그에 따르는 이득을 최대화 해야 한다. 단위 테스트의 목표 : SW 프로젝트의 지속 가능한 가능하게 하는 것 지속 가능한 프로젝트 성장을 위해서는 고품질 테스트에만 집중해야함 (고품질이란 뭘까) 테스트 스위트란? 테스트 케이스들을 하나로 묶은 것이다. 스위트는 자신의 테스트들을 실행함 코드 커버리지 코드 커버리지가 너무 적을 때는 테스트가 충분하지 않다는 좋은 증거이다. 그러나 반대의 경우는 그렇지 못함. 커버리지 100%라고 해도 양질의 테스트라고는 하지 못한다. (높은 품질을 위해서 커버리지를 높여야 하지만, 커버리지가 높다고 해도 고품질의 테스트는 아니다?) 테스트 스위트..
SAGA 분산 트랜잭션 패턴
saga 디자인 패턴은 분산 트랜잭션 시나리오에서 마이크로 서비스 간의 데이터 일관성을 관리하는 방법 saga는 각 서비스를 업데이트하고 메시지 또는 이벤트를 게시하여 다음 트랜잭션 단계를 트리거하는 일련의 트랜잭션이다. 단계가 실패하면 sags는 이전 트랜잭션을 상쇄하는 보상 트랜잭션을 실행 컨텍스트 및 문제점 트랜젹션 내에서 발생한 이벤트는 엔티티에 발생하는 상태변경이며 작업을 수행하거나 이후 이벤트를 트리거하는데 필요한 정보를 캡슐화 한다. 트랜잭션은 ACID 특성을 가진다. 하지만 이건 단일 서비스에서의 문제이고 여러 서비스가 얽혀있다면 복잡해진다. 다중 서비스 아키텍처에선?! 원자성은 모두 발생하거나 모두 발생하지 않아야 하는 돌이킬 수 없는 작업 세트 일관성은 트랜잭션이 유효한 상태의 데이터만..
JIT Compiler
JIT(Just In Time) 컴파일러는 런타임 시 byte code → machine code로 컴파일하여 java 애플리케이션의 성능을 향상 시키는 컴파일러다. java는 알다시피 다양한 운영체제에서 실행 될 수 있느도록 플랫폼 중립적 바이트 코드를 포함된 클래스로 구성되어 있다. 런타임에서 jvm은 class 파일을 로드하고 각 바이트 코드의 시맨틱을 판별하여 해당 계산을 수행한다. 이때 JIT 컴파일러는 런타임에서 byte 코드를 원시 시스템 코드로 컴파일하여 java 애플리케이션의 성능을 향상 시킨다. JIT 컴파일러의 기본 설정은 사용으로 되어 있다. 또한 컴파일을 할 때는 cpu와 메모리가 사용되어 JVM이 처음 시작될 때 수천 개의 메서드가 호출된다. 이러한 메서드를 모두 호출하는 것은 ..