전체 글

전체 글

    클린코드 7장(경계), 8장 (단위 테스트)

    경계 Map과 같은 공개된 인터페이스를 사용할 때 2가지 문제가 있다 1. 전달되는 map에 clear와 같은 삭제 명령어가 있어서 전달해주는 쪽에서 알지 못하고 지워지는 이슈가 있을 수 있다. 2. 전달된 Map 형태가 generic 하게 전해 졌어도 받는 쪽에서 Map map 등으로 받아 버린다면 캐스팅을 해서 사용하는 등의 문제나 변경의 소지가 크다. 또한 Map의 사용 방식이 변경된다면 이를 해결하기 위해 모든 부분에서 수정되어야 하는 문제가 있다. 그래서 이를 해결하기 위해서 Map에 사용 되는 Value 값의 객체에서 Map을 품어서 쓰는 방식으로 캡슐화하여 사용하기도 한다. public classs Sensors { private Map = new HashMap(); public Sensor..

    클린코드 5장(객체와 자료구조), 6장 (오류처리)

    객체와 자료구조 객체에서 자료를 세세하게 공개하는 것 보다 추상화를 통해 표현하는 것이 더 좋다. 객체는 동작을 공개하고 자료를 숨긴다. 복잡한 시스템을 짜다보면 새로운 함수가 아니라 새로운 자료타입이 필요한 경우가 발생하는데 이 때는 클래스와 객체 지향 기법이 적합하다. 하지만 새로운 함수가 필요하다면 절차지향 코드와 자료구조 형태가 더 적합한 코드이다. 오류처리 오류를 일일히 처리하는 것보다 차라리 예외를 던저버리는게 더 깔끔하다. 확인된 예외를 처리하기 위해서 하위 메소드에서 throws를 하게되면 상위 메소드에서 이 예외에 대한 명시가 되어야 하기 때문에 하위의 예외 때문에 상위 메소드가 수정되어야 하는 불상사가 발생하기 때문에 수정에 닫혀 있어야 하다는 OCP규칙을 위반한 것이다. 예외에 의미있..

    클린코드 3장 (함수), 4장 (주석)

    함수 - 함수를 만드는 기본 규칙은 작게 만드는 것! - 함수 내부에 if 문 등의 1단이나 2단 그 이상의 중첩 구조가 발생되면 안된다. - 함수의 활동은 한가지 그 이상을 하지마라. - switch문에 다음과 같이 한가지 작업만 해야한다는 SRP 이론과 코드의 변경이 있으면 안된다는 OCP 규칙을 위반한다. 이를 해결하기 위해서는 다형성을 이용해서 해결해야 한다. // 문제 코드 public int calEmployeePay(Employee e) { switch (e.type) { case SALARIED: return calculateSalariedPay(); case HOURLY: return calculateHourlyPay(); case ..... } } // 변경 내용 public inter..

    클린코드 1장(깨끗한 코드), 2장 (의미있는 이름)

    깨끗한 코드 태도 나쁜 코드는 생산성을 떨어트리고 갈수록 생산성 0로 수렴하게 만든다. 일정에 쫓겨서 만든 나쁜 코드를 나중에 고치려는 습관은 버려라. 르블랑의 법칙 대로 나중은 결코 오지 않는다. 핑계될 것 없다 모두 개발자 탓이다. 시간이 없어서 만든 잘못된 코드는 결국 일정을 빠르게 앞당기는 것이 아니라 결국 그 잘못된 코드로 일정을 지연시킨다. 깨끗한 코드란? 논리가 간단해야 한다. 의존성이 줄어 유지보수가 쉬워야 한다. 성능이 최적화 되어 있어야 한다. 오류는 확힐 하게 처리해야 한다. 많은 일을 하지말고 한가지 잘하는 일을 잘하는 코드를 만들어라. 테스트 케이스가 없는 코드는 깨끗한 코드가 아니다. 중복이 없다. 코드를 최대한 줄인다. 지속적으로 나빠지는 코드를 개선한다. 결론 백날 좋은 코드..

    [토이프로젝트] TimeLine 개선

    한동안 잠시 멈췄다가 다시 열면서 내용을 추가 하고 싶었다. 타임라인의 목적은 개발에 관련 블로그 내용들과 채용 뉴스등을 한번에 보기 위해서 만든 서비스이다. 사실 내가 한번에 보고 싶은 욕구가 있어서 만들게 되었다. 그런데 채용이나 회사 블로그 뉴스등은 넣었는데 개인 블로그를 볼 수 있는 기능이 없어서 불편했는데 추가했다. 개인블로그 추가 그리고 메인 화면이 없어서 첫 화면을 설정하기가 애매했다. 그래서 메인화면도 summary해서 볼 수 있도록 추가했다. 메인화면 추가하면서 잘못된 @Transaction 어노테이션 사용으로 문제가 많았었다. 에러내용은 아래와 같다. org.hibernate.AssertionFailure: null id in entry (don't flush the Session af..

    자바 성능 튜닝 이야기 책 리뷰

    자바 성능 튜닝 이야기 국내도서 저자 : 이상민 출판 : 인사이트 2013.10.26 상세보기 요새 개발을 하면서 Java GC 튜닝이나 옵션 설정을 효율적으로 하지 못하는거 같아서 책 제목만 보고 자바 튜닝에 대해 공부해보고자 구매하였다. 흠... 근데 앞에 있는 대부분의 자료구조 선택 기준이나 String과 같은 자료형 주의사항등에 대한 이야기 대부분들이 대학교 2학년 때 봤었던 남궁성님의 자바의 정석이나 Effective java 책에 비해 많이 부족하고 블로그 글을 읽는다는 느낌을 많이 받았다. GC에 대한 내용도 2011년도에 나온 네이버 D2에 글이 더 자세하게 기록되어 있는 거 같다. https://d2.naver.com/helloworld/1329 책 구매 후 이렇게 단 기간에 넘기면서 2..

    Mysql 인덱스 사용법 및 실행 계획 정리

    mysql 인덱스에 대한 정확한 이해도 없이 사용을 하다보니 조금 개념적으로 헷갈리는게 많이 있었다. 이 부분에 대해 한번 정리하고 넘어가고자 기록해본다. 인덱스 인덱스는 빠르게 특별한 컬럼과 함께 값을 찾는데 사용된다. 인덱스가 없으면 Mysql은 처음 행부터 전체 테이블을 읽어 들여서 데이터를 찾는다. 거대한 테이블에서 이런 행동은 비용이 상당히 많이 들어가게 된다. 만약에 테이블이 인덱스를 가지고 있으면 빠르게 접근할 수 있게 된다. 대부분의 Mysql 인덱스 (PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT)는 B-tree안에 저장된다. 예외적으로 spatial 데이터 타입은 R-tree를 사용, 메모리 테이블은 또한 hash index를 지원, InnoDB는 FULLTE..

    Elasticsearch 7.7 feature와 heap 메모리 사용량의 두드러진 감소량

    줄어든 heap 사용량Elasticsearch 사용자들은 Elasticsearch 노드에 저장이 가능한 만큼 데이터를 집어 넣지만, 가끔 disk에 저장되기 전에 heap memory 사용량이 초과되는 것을 경험한다. 이는 비용을 줄이기 위해 가능한 노드당 많은 양의 데이터를 넣고 싶은 사용자들에게 문제를 일으킨다. (실제로 현재 운영중인 es에서도 대량의 데이터 삽입 시 가끔 발생함) 왜 Elasticsearch에는 데이터를 저장하기 위해 heap memory 영역이 필요한걸까? 왜 디스크 공간만으로 충분하지 않은걸까?? 거기에는 여러 이유가 존재하지만 가장 중요한 이유는 루씬은 디스크 상에 데이터를 찾을 수 있는 위치를 찾아내기 위해서 일부 정보를 메모리에 저장해야 한다. 예를 들어 루씬의 inver..

    모던 자바 인 액션 내용 정리

    포킹 자바 8에서 추가된 스트림 api에서 데이터를 필터링, 추출, 그룹화 등의 기능을 진행할 수 있다. 이러한 동작들을 병렬화 할 수 있어 여러 cpu에서 작업을 분산해서 처리할 수 있다. 이런 작업을 포킹 단계라고 한다. 함수형 인터페이스 - 하나의 추상메서드를 가지고 있는 함수형 인터페이스지만 상속을 받은 인터페이스는 추상메서드를 하나만 가지고 있다고 하여도 함수형 인터페이스가 아니다. - 디폴트 메소드가 아무리 많아도 추상 메소드가 하나이면 함수형 인터페이스이다. - @FunctionalInterfeace 애노테이션을 붙이면 함수형 인터페이스가 아닌 경우 컴파일 에러를 발생 시킬 수 있다. 람다에서 지역변수를 final로 제약하는 이유 람다에서 지역변수가 final로 사용되는지 궁금한데 이는 인터..

    Too many dynamic script compilations 에러

    elasticsearch를 사용하여 개발을 하다보면 스크립트를 사용하는 경우가 굉장히 많이 발생한다. 나는 아무생각없이 스크립트를 만들어서 사용했는데 어느날 운영에 반영을 하는데 본적이 없던 에러를 발견했다. java.lang.AssertionError: Expecting code not to raise a throwable but caught

    Spring boot2 resilience4j를 이용한 circuit breaker 사용

    fault tolerance library (장애 허용 시스템) fault tolerance library는 무엇인가? 간단하게 이야기해보자. MSA 환경에서 한 개의 서비스에서 다른 api를 호출 할 때 일시적으로 에러가 발생하고 있다고 가정해보자. 만약 이 시기에 요청이 계속 들어오면 계속 500에러를 내보내게 된다. 그럼 사용자들은 이 서비스에 대해서 신뢰를 잃어 버리게 되고 안좋은 인식을 만들 수 있다. 그래서 특정 api 호출과 같은 작업에 에러가 발생했을 때, 그 횟수를 정해놓고 그 횟수 이상 에러를 초과하면 기존에 설정해 놓은 fallback에 맞게 동작하게 하고 일정 시간 후에 다시 시도하여 진행하는 등에 작업이 필요하다. 이게 바로 fault tolerance library (장애 허용 ..

    spring cloud resilience4j 사용시 CircuitBreakerConfiguration 에러

    CircuitBreaker 테스트를 위해서 Resilience4j를 사용했다. 버전은 1.3.0을 사용하려고 했다. //Resilience4J compile("io.github.resilience4j:resilience4j-spring-boot2:1.3.0") compile("io.github.resilience4j:resilience4j-reactor:1.3.0") compile("io.github.resilience4j:resilience4j-timelimiter:1.3.0") 그런데 분명 1.3.0을 사용한다고 명시하였고 gradle도 clean하고 사용하는 denpendency도 확인하였는데 계속해서 다음과 같이 1.1.0 라이브러리를 사용하려고 해서 문제가 발행했다. Cannot resolve ..

    [토이프로젝트] TimeLine 2.0 개선 오픈

    설계, 운영 모든면에서 실패토이프로젝트 TimeLine을 만들어서 오픈했었다. 개발의 목표는 단순하게 개발 블로그, 채용등에 대해 한번에 볼 수 있는 개발자를 위한 통합 페이지를 만드는 것이었다.https://wedul.site/626[토이 프로젝트 소개] 개발자 채용, 기술 블로그 정보를 모아주는 TimeLine혼자 공부를 집에서 어떻게 하면 효율적일까 고민을 많이했다. 집에서 주구장창 책을 읽고 해보면 스킬이 늘까? 그렇게 해봤지만 그게 정답은 아니었다. 남들에게는 모르겠으나 나에게는 아니었다. 회사에서 하는..wedul.site하지만 사용하는데 생각보다 불편한 부분이 많았고 설계부분에도 현재 시스템을 고려하지 않고 만들었던게 운영에 걸림돌이 되어버렸다. 그래서 서비스를 잠정적 중단하고 2.0을 만들..

    Junit5 Test Container사용하여 테스트 환경 구축하기 (인프런 백기선님 강의 정리)

    도커와 테스트 (TestContainers) 테스트를 위해서는 운영과 동일한 형태의 개발 환경에서 테스트 하는 것이 중요하다. 하지만 매번 동일하게 환경을 구축할 수 없고 모든 개발 자들과 같은 환경을 맞추기도 쉽지 않다. 그래서 Docker를 이용해서 테스트마다 테스트를 위한 컨테이너를 실행시켜서 테스트하고 컨테이너를 제거해주면 좋은데 그런 기능을 TestContainer를 이용해서 가능하다. 실제로 이번에 이직한 회사에서 동일하게 테스트 환경을 사용하는 것을 봤다. 막연하게 그 기능을 사용할 수 있었지만 이번 Junit5 백기선님 강의를 들어서 확실하게 정리할 수 있어서 좋았다. 역시 듣길 잘했다. 꼭 들어보길 강추한다. 그럼 그 내용을 정리해보자. 테스트 컨테이너(Test Container) 라이브..

    Spring Junit5 test Mockito (백기선님 인프런 강의)

    mockito는 실제 객체와 비슷하게 동작하도록 하여 검증할 수 있는 방법을 제공해주는 라이브러리 이다. spring-boot-starter-test 모듈에 기본적으로 포함되어 있으며, 이 모듈을 사용하지 않을 경우 mockito-core, mockito-junit-jupiter 모듈을 추가하면 된다. Mock 객체 만들기 Mock 객체를 만들어서 테스트를 진행할 수 있다. Mock객체로 만들고 싶은 객체에 @Mock 어노테이션을 달기만 하면 되는데 이때 만들어진 Mock 객체는 Null이기 때문에 그렇게 하지 않기 위해서 @ExtendWith(MockitoExtension.class)를 추가한다. @ExtendWith(MockitoExtension.class) class MockWedulTest { @..

    Spring BootJunit5 테스트 (백기선님 인프런 강의)

    Junit 5 테스트 Junit4를 잘 알고 있던건 아니지만 새로 입사한 회사에서 Junit5를 사용하여 테스트 코드를 짜기때문에 더 잘 알고 싶어 공부하게 되었다. 그 중 백기선님의 Junit5 테스트 코드 관련 인강을 인프런에서 듣게 되었다. 내용이 너무 좋았고 그동안 몰랐고 정리가 되지 않았던 부분을 많이 알게 되었다. 이를 아주 간략하게만 정리해봤다. 가격이 그리 비싸지 않기 때문에 한번쯤은 꼭 보는걸 추천한다. https://www.inflearn.com/course/the-java-application-test/# 소개 Junit5는 Junit3, 4에서 사용하던 Junit Platform 구현체 Vintage대신 Jupiter를 사용해서 TestEngine Api를 사용하는 test 프레임워..

    Fast Forword와 merge 그리고 rebase 정리

    5년차가 될정도로 개발을 어느정도 진행했지만 아직까지도 git에 대한 정리가 잘 되지 않는다. 공부도 하고 정리도 했었지만 실상 회사에서 주구장창 브랜치 만들고 머지만 해서 진행했기 때문에 fast forword를 하고 merge, rebase하는 것과 안하고 하는것의 방법을 잘 알지 못했다. 개념은 알아도 직접 많이 해보지 않으면 그게 와닿지 않는 것 같다. 그럼 현재 이직한 회사에서는 이 방법을 많이 사용하기에 정리를 해서 까먹지 않도록 해보자. Merge Merge는 이미 우리가 익히 알고 있듯이 두 개의 브랜치를 합치는 걸 의미한다. 그럼 fast forword를 하고 merge를 하면 어떻게 되는지 보자. 현재 이렇게 되어있는 상황에서 feature/si를 fast forword 포함해서 mer..

    RestHighLevelClient를 사용하여 search after 기능 구현하기

    https://wedul.site/541에서 search after 기능을 사용해서 검색을 하는 이유를 알아봤었다. 그럼 spring boot에서 RestHighLevelClient를 이용해서 search after를 구현을 해보자. 1. Mapping 우선 index가 필요한데 간단하게 상품명과 지역 가격정보들을 가지고 있는 wedul_product 인덱스를 만들어 사용한다. { "settings": { "index": { "analysis": { "tokenizer": { "nori_user_dict": { "type": "nori_tokenizer", "decompound_mode": "mixed", "user_dictionary": "analysis/userdict_ko.txt" } }, "ana..

    객체지향의 사실과 오해 3 ~ 4장

    객체지향의 사실과 오해 국내도서 저자 : 조영호 출판 : 위키북스 2015.06.17 상세보기 3. 타입과 추상화 추상화는 어떤 내용을 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 그 방법으로 사물간의 차이점을 빼고 공통점을 일반화하여 단순하게 만들고 불필요한 세부사항을 제거하여 단순화 하는 것이다. 즉 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이다. 이런 추상화 개념을 이용해서 객체지향에 대입해서 생각해보자. 그룹화 각 객체는 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 말한다. 여러 객체에서 공통적인 요소를 뽑아서 그룹화 하면 복잡성을 효과적으로 감소 시킬 수 있다. 예를 들어 토끼, 강아지 등을 동물이라는 공통의 ..

    JPA 다양한 Join 방법 정리 (N+1, queryDSL, fetch join)

    JPA를 사용하다 보면 join을 할 때가 많아진다. join을 어떠한 방법으로 하느냐에 따라서 수행되는 쿼리가 달라지고 성능에 문제가 발생하는 경우도 종종있다. 그래서 다양한 방식의 join 방식을 알아보고 방식에 따라 작업을 진행해 보자. 우선 사용될 entity 두 개를 설명하면 다음과 같다. @Getter @Entity @Table(name = "wedul_classes") @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor @Builder public class WedulClasses extends CommonEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY..

    객체지향의 사실과 오해 1 ~ 2장

    객체지향의 사실과 오해 국내도서 저자 : 조영호 출판 : 위키북스 2015.06.17 상세보기 객체지향의 사실과 오해를 읽고 핵심적으로 생각되는 부분만 정리해봤다. 1. 협력하는 객체들의 공동체 현실세계의 객체 객체지향을 실세계와 대입하는 경우가 많다. (완벽하게 동일 시 할 수는 없지만 이해하기에는 편리함) 그럼 객체 지향을 현실세계에 대입했을 때 커피집을 생각해보면 손님, 캐리어, 바리스타는 개개인의 객체를 의미하고 각 객체는 서로간의 협력관계가 있고 그 속에서 자신의 책임을 다한다. 예를 들어보면 손님은 주문을 하고 캐리어는 계산을 받고 바리스타는 커피를 만드는 역할을 한다. 그리고 서로간의 협력 관계를 통해 주문을 하고 받고 커피를 만드는 작업을 진행한다. 이렇듯 객체지향에서 가장 중요한 개념은 ..

    nginx 서버에 filebeat를 이용하여 ELK에 로그 기록하기

    git clone https://github.com/deviantony/docker-elk nginx를 설치하고 docker 기반으로 ELK (elasticsearch, logstash, kibana)를 설치하고 nginx 로그를 filebeat를 설치하여 acces.log, error.log, syslog등을 전송해보자. 설치 ELK를 도커에 설치하는 스크립트를 아래 github에 잘 정리되어 제공해주고 있다. https://github.com/deviantony/docker-elk ELK는 이걸로 설치하면 되는데 docker-compose로 nginx와 filebeat까지 함께 설치하기 위해서 아래 저장소에서 제공하는 nginx-filebeat 스크립트를 혼합해서 사용해보자. https://githu..

    우아한 객체지향 후기 및 정리

    https://www.youtube.com/watch?v=dJ5C4qRqAgA 우아한 형제들에서 진행한 우아한 객체지향 세미나에 가고 싶었는데 아쉽게도 가지 못했다. 발표해주시는분이 객체지향의 사실과 오해를 쓰신 조영호분이라서 더 가보고 싶었는데 아쉽다. 책에 내용이 좋아서 동영상으로라도 보고 싶었는데 유튜브에 동영상이 올라와서 보고 정리해본다. 개념 - 설계는 코드에 어디에 놓을건지를 정하는 것. - 의존성 문제의 핵심은 코드 변경시 영향을 주는지이다. - 의존성 문제는 디커플링이 되어야 한다. 관계설명 연관관계 (Association) A 클래스에 B클래스로 갈수 있는 영구적인 방법이 있는 경우 A → B class A { private B b; } 의존관계 (Dependency) A ---> B (..

    데이터 베이스 버전 컨트롤 Flyway

    Spring에서 초기 테이블과 데이터 관리를 위해서 data.sql과 schema.sql을 사용하였다. 하지만 테이블 스키마가 변경되거나 필수로 초기에 들어가야하는 데이터들이 추가되거나 수정되었을 때 히스토리 관리가 잘 되지 않았다. 특히 서로 교류가 잘 되지 않은 경우에서는 컬럼이 추가되거나 무엇이 변경되었는지 알지 못해서 문제를 유발할 수 있기에 이를 관리 할 수 있는 무언가가 필요했다. 그래서 Redgate에서 제공하는 Flyway를 사용해보기로 했다. 우선 내 개인 프로젝트인 timeline에 적용시켜봤다. 데이터베이스 버전관리 Flyway https://flywaydb.org/ 동작 방식 Flyway가 버전관리를 하기위해서 테이블이 생성된다. Flyway가 버전관리는 이 테이블에 데이터베이스의 ..

    Java 메모리 구조 및 GC 알고리즘 정리

    자바 메모리 구조는 1.8 이후로 일부분 바뀌었다. 이 부분에 대한 정리를 다시 하고 싶었고 GC 알고리즘에 대한 종류와 상세 내용을 정리하고 싶었다. 그럼 이 두 가지 사항에 대해 가볍게 정리해보자. Java 메모리 구조 Method Area 프로그램이 실행되는 도중에 아직 사용되지 않은 클래스들의 코드는 new를 통해 클래스의 인스턴스가 생성되면 JVM Method Area에 인스턴스 변수, 메스드 코드, 클래스 변수등을 저장한다. 해당영역은 모든 쓰레드 사이에서 공유되고 static 키워드로 생성된 변수 또한 저장을 Runtime Constant Pool 영역에 저장한다. 실 데이터를 저장하는 것이 아니라 레퍼런스만 저장하며 실제 데이터는 Heap 영역에 저장한다. JVM Language stack..

    Typescript 헷갈리는 부분 정리

    Any vs Object vs Unknown - typescript에서 모든 타입은 any type의 서브 타입들이다. 그래서 어떠한 제약도 없는 모든 타입을 받아서 사용할 수 있다. - object non privitive type으로 undefined, string, boolean, symbol같은 primitive type을 허용하지 않는다. 대신 null은 허용된다. (null은 태생이 object) - unknown 타입은 any 타입처럼 어떤값도 넣을 수 있다. 하지만 ts compiler는 unknown 타입에 대한 어떤 오퍼레이션도 허용하지 않는다. 게다가 unknown 타입은 오직 any 타입만 할당 할 수있다. 자료형 캐스팅 방법 - let strLength: number = (some..

    spring boot api를 쿠버네티스로 deployment 해보기

    저번 글에서 기본적인 쿠버네티스 관련 개념과 자원에 대해 공부했다. 이제 실질적으로 api애플리케이션을 하나 만들어보고 배포까지 진행해보자. 로컬 이미지를 담을 registry 생성 쿠버네티스의 노드들은 외부와 연결되는 경우도 있지만 그렇지 못하는 환경도 많이 존재한다. 그럴 경우 이미지를 내려받을 수 없고 로컬에서만 만들어서 사용할 이미지를 등록할 registry가 필요하다. # registry 이미지 가져오기 docker pull registry:latest # 레지스트리 실행 docker run --name MyPrivateRegistry -d -p 5000:5000 registry 애플리케이션 생성 우선 spring boot gradle 프로젝트로 아무것도 만들지 않고 바로 빌드해서 사용해보자. ..

    kubernetes 기본 개념정리와 구성 알아보기 (설치 포함)

    docker를 사용하면서 그 편리함을 느끼고 있었다. 그리고 요 근래 it회사에서 docker와 kubernets를 이용하여 인프라를 운영을 하는 것을 많이 들었다. 나는 그런 환경을 접해보지는 못했기 때문에 정확하게 kuberntes가 무엇인지 잘 모른다. 그래서 이번 기회에 kubernets(이하 쿠버네티스)에 대한 기본 개념을 정리하고 설치해서 공부를 위한 초석을 닦아보자. 쿠버네티스 (kubernetes) 쿠버네티스는 도커 컨테이너 운영을 자동화 하기위한 오케스트레이션 도구이다. 구글에서 만들었으며 컨테이너를 운영하고 다루기 위한 api와 cli등을 제공한다. 컨테이너 배포 이외에도 효율적인 컨테이너 배치 및 스케일링, 로드밸런싱, 헬스 체크, secure등의 기능을 제공한다. AWS ECS 와 ..

    [공유] 우분투 설치 시 boot efi 관련 오류 수정 방법

    와이프가 결혼전에 집에서 사용하던 노트북 lenovo 제품이 있어서 이걸 간단하게 사용할 서버로 쓰고 싶었다. 그래서 우분투를 설치하려고 하는데 계속 the 'grub-efi-amd64-signed' package failed to install into /target/. Without the GRUB boot loader, the installed system will not boot. 라는 오류만 발생했다. 구글링을 하면서 efl boot 영역을 설정해주고 별짓 을 다해도 안되었는데 오늘 아침에 이 유튜브를 보고 해결했다. 나중을 위해서 공유해논다. https://www.youtube.com/watch?v=DWlB0_f3GAY

    개발용 맥북 외장 모니터4K 삼성 모니터 U28E590 개봉

    모니터가 10년정도 된 걸 사용하다보니 눈이 너무 아프고 해상도가 부족해서 코드볼때도 너무 힘들었다. 그래서 큰맘 먹고 그동안 고대하던 4k모니터를 구매했다. 다른 벤큐나 엘지꺼는 더 좋아보이는데 가격이 너무 비싸서 저렴한 삼성 모델로 주문했다. 쿠팡 로켓배송으로 시키니 바로 다음날 새벽에 왔다. 일요일날 시켰는데 월요일 새벽에 와서 출근전에 이렇게 써보고 갈 수 있는게 정말 신세계인거 같다. 박스도 어마어마했다. 28인치 모니터다 보니 보호 박스는 거의 30인치는 되어보였다. 조심히 박스를 뜯고 부속품을 하나 씩 열어봤다. 전체적으로 구성품은 모니터 화면과 목 받침대 그리고 모니터 목, 어댑터 dp to dp, hdmi to hdmi 케이블이 존재 했다. 조립은 도라이버가 없어도 될 수 있게 잘 만들어..