전체 글 194

[Spring Cloud] Hystrix 파헤치기

Hystrix Hystrix란? MSA 분산 시스템인 Spring Cloud에서는 개발자가 분산 시스템에서 사용하는 공통 패턴을 제공한다. 예를 들면 Routing, Circuit Breakers, Routing, Configuration Management 등이 있는데 이 중 Hystrix는 Circuit Breaker 역할을 한다. 물론 Hystrix는 현재 Spring Cloud에서 fade out 되어 Resilience4j 사용을 권고하고 있지만 현재 회사에서는 Hystrix를 사용하고 있기 때문에 Hystrix 부터 정리해본다. Resilience4j도 비슷하겠지..? 예를 들어, 쇼핑몰을 MSA와 같이 분산 환경을 구성하다가 다음과 같은 도메인이 있다고 생각해보자. 어떤 회원이 주문내역을 확..

개발 2021.11.07

[Golang] Go 언어 빠르게 훑어보기

Go 언어 빠르게 훑어보기 기본 문법 기본 구조 package main import "fmt" func main() { fmt.Println("Hello Go") } $ go run hello.go선언 var foo int // 초기화 없는 선언 var foo int = 42 // 초기화 있는 선언 var foo, bar int = 42, 1302 // 한 번에 여러 var 선언 및 초기화 var foo = 42 // 생략된 type, 유추되어 들어간다. foo := 42 // 축약형, func 본문에서만 var 키워드 생략, 암시적 type const constant = "This is a constant" // 상수 선언 함수 // 간단한 함수 func functionName() {} // 매개변수가..

개발 2021.10.26

gradle

Gradle 1. Gradle 이란? groovy를 기반으로 한 오픈소스 빌드 도구 ant의 자유도와 maven과 같은 구조화된 build 프레임워크를 바탕으로 이전 빌드툴의 단점을 보완하여 개선된 서비스를 제공한다. Gradle 종속성 관리 2. Gradle vs Maven 왜 사람들은 Maven에서 Gradle로 옮겨갔을까? Gradle이 Maven에 비해 좋은 점은 어떤 것이 있을까? 2.1 Maven pom.xml에 프로젝트에 필요한 모든 dependency를 설정해주면 직접 다운로드 받을 필요 없이 maven이 repository에서 필요한 모든 파일들을 해당 프로젝트로 불러와준다. 특징 Dependency를 관리하고, 표준화된 프로젝트를 제공한다. XML, remote repository를 가..

개발 2021.08.16

[클린코드] 15장. Junit

15장. Junit 들여다보기 Junit 프레임워크 Junit은 저자가 많다. 하지만 시작은 켄트 벡과 에릭 감마 두사람이 비행기를 타고 가다 3시간 동안 Junit 기초를 구현했다. 우리가 살펴볼 모듈은 문자열 비교 오류를 파악할 때 유용한 코드다. ComparisonCompactor라는 모듈로, 영리하게 짜인 코드다. ComparisonCompactor는 두 문자열을 받아 차이를 반환한다. 예를 들어, ABCDE와 ABXDE를 받아 를 반환한다. ComparisonCompactorTest.java package junit.tests.framework; import junit.framework.ComparisonCompactor; import junit.framework.TestCase; public ..

개발/Clean Code 2021.08.11

[클린코드] 14장. 점진적인 개선

14장. 점진적인 개선 Intro 확장성이 부족했던 모듈을 소개하고, 모듈을 개선하고 정리하는 단계를 살펴볼 것. 14-1 간단한 Args 사용법 public static void main(String[] args) { try { Args arg = new Args("l, p$, d*", args); boolean logging = arg.getBoolean('l'); int port = arg.getInt('p'); String directory = arg.getString('d'); ececuteApplication(logging, port, directory); } catch (ArgsException e) { System.out.println("Argum..

개발/Clean Code 2021.08.10

[클린코드] 13장. 동시성

13장. 동시성 동시성과 깔끔한 코드는 양립하게 어렵다. 스레드를 하나만 실행하는 코드는 짜기가 쉽다. 겉으로 보기에는 멀쩡하나 깊숙한 곳에 문제가 있는 다중 스레드 코드도 짜기 쉽다. 이런 코드는 시스템이 부하를 받기 전까지 멀쩡하게 돌아간다. 이 장에서 다룰 내용 여러 스레드를 동시에 돌리는 이유 여러 스레드를 동시에 돌리는 어려움 동시성을 테스트하는 방법과 문제점 동시성이 필요한 이유? 동시성은 결합(coupling)을 없애는 전략이다. 즉, 무엇(what)과 언제(when)을 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다. 그래서 호출 스택을 살펴보면 프로그램 상태가 곧바로 드러난다. 흔히 단일 스레드 프로그램을 디버깅하는 프로그래머는 정지점(breakpoint)을 정..

개발/Clean Code 2021.07.28

[클린 코드] 12장. 창발성

12장. 창발성 창발적 설계로 깔끔한 코드를 구현하자 켄트 백이 제시한 단순한 설계 규칙 네 가지 모든 테스트를 실행한다 중복을 없앤다. 프로그래머 의도를 표현하라 클래스와 메서드 수를 최소로 줄여라 단순한 설계 규칙 1: 모든 테스트를 실행하라 설계는 의도한 대로 돌아가는 시스템을 내놓아야 한다. 테스트를 철저히 거쳐 모든 테스트 케이스를 항상 통과하는 시스템, 즉 테스트가 가능한 시스템을 만들려고 애쓰면 설계 품질이 높아진다. 크기가 작고 목적 하나만 수행하는 클래스가 나온다. SRP를 준수하는 클래스는 테스트가 훨씬 더 쉽다. 테스트 케이스가 많을 수록 개발자는 테스트가 쉽게 코드를 작성한다. 결합도가 높으면 테스트 케이스를 작성하기 어렵다. 그러므로 DIP와 같은 원칙을 적용하려 애써서 DI, 인..

개발/Clean Code 2021.07.20

[클린코드] 11장. 시스템

11장. 시스템 도시를 세운다면? 도시를 구상한다면? 도시에는 수도 관리팀, 전력 관리팀, 교통 관리 팀, 치안 관리팀, 건축물 관리팀과 같이 각 분야를 관리하는 팀이 있듯, 큰 그림을 그리는 사람도 있으며, 작은 사항에 집중하는 사람들도 있다. 이를 통해 도시가 잘 돌아갈 수 있다. 도시는 적절한 추상화와 모듈화 덕에 큰 그림을 이해하지 못할지라도 개인과 개인이 관리하는 '구성요소'는 효율적으로 돌아간다. 소프트웨어 팀도 도시처럼 구상한다. 깨끗한 코드를 구현하면 낮은 추상화 수준에서 관심사를 분리하기 쉬워진다. 이 장에서는 높은 추상화 수준, 즉 시스템 수준에서 깨끗함을 유지하는 방법을 알아보자. 시스템 제작과 시스템 사용을 분리하라 소프트웨어 시스템은 (애플리케이션 객체를 제작하고 의..

개발/Clean Code 2021.07.17

[클린 코드] 10장. 클래스

10장. 클래스 1. 클래스 체계 클래스를 정의하는 표준 자바 관례 (순서) 변수 목록 정적 공개 상수 (public static final) 정적 비공개 (private static final) 비공개 인스턴스 변수 공개 변수 (공개 변수가 필요한 경우는 거의 없다) 공개 함수 비공개 함수는 자신을 호출하는 공개 함수 직후에 넣는다. (추상화 단계가 순차적으로 내려간다.) 캡슐화 변수와 유틸리티 함수는 가능한 공개하지 않는 편이 낫지만 반드시 숨겨야 한다는 법칙은 없다. 때로는 변수나 유틸리티 함수를 protected로 선언해 테스트 코드에 접근을 허용하기도 한다. 같은 패키지 안에서 테스트 코드가 함수를 호출하거나 변수를 사용해야 한다면 그 함수나 변수를 protected로 선언하거나 패키지 전체로 ..

개발/Clean Code 2021.07.11

[MongoDB]MongoDB 인덱스 설계하기

MongoDB 인덱스 설계하기 1. Index란? 도서관의 책들이 정리되어 있을 때 700번대에는 어떤 책들이 있고, 어떤 순서로 정렬되어 있는지를 알고 책의 번호만을 가지고 빠르게 해당 책에 접근할 수 있는 것과 같이 인덱스는 어떤 정보가 어디에 있는지 빠르게 접근할 수 있는 색인과 같은 역할을 한다. 만약 책에 번호가 없다면 우리는 도서관의 모든 책들을 전부 찾아봐야 하듯, MongoDB에 index가 없다면 우리는 데이터베이스 내의 모든 Document를 하나하나 찾아야 한다. 즉, 이와 같이 MongoDB의 인덱스를 작성하기 위해서는 내가 가진 데이터들을 효과적으로 검색하기 위해 어떤 키들을 어떤 순서로 정렬해두어야 할지를 생각해야 한다. 2. Index 설계 전략 2.1 실행할 쿼리 종류를 고려..

개발/MongoDB 2021.07.11