반응형
전체 글

전체 글

    [번역] 2-1. Domain 모델 (매핑 타입, 네이밍 전략, Basic Type - 1)

    2. 도메인 모델 도메인 모델이라는 단어는 데이터 모델링이라는 영역에서 비롯된다. 이것은 작업을 하고 있는 도메인의 모델로 묘사되기도 하고 때때로 이를 persistent classes라고 부른다. 궁극적으로 애플리케이션 도메인 모델은 ORM에서 중심이 되는 단어이다. 이것들은 매핑하고 싶은 클래스들로 구성된다. Hibernate는 POJO/JAVA Bean 프로그래밍 모델을 따를 때 가장 잘 동작한다. 그러나 이런 규칙은 어려운 요구사항은 아니다. 게다가 Hibernate는 persistence 객체의 특성에 대해 매우 조금만 담당하고 있다. 사실 Map 인스턴스 트리등을 사용하여 다른 방법으로도 domain 모델 구현이 가능하다. 2.1 매핑 타입 Hibernate는 Java와 JDBC 애플리케이션의..

    WebFlux에서 Mono, Flux에 Map 또는 flatMap을 사용할 때 null을 리턴하는 경우

    WebFlux로 구성되어 있는 프로젝트에서 Mono, Flux stream에서 map이나 flatMap을 사용해서 특정 데이터를 매핑하는 과정에서 특정한 경우에 대해서 null을 리턴하고 다음 파이프라인에서 filter로 Objects의 nonNull을 사용해서 컨텐츠를 필터링 하려고 했다. 작성하려고 한 코드의 일부 예시를 만들어서 작성해봤다. 만약 resultData를 통해 전달받은 데이터가 예상 대로라면 map과정에서 500보다 큰 5189값만 정상 반환하고 나머지는 null을 반환한 후 filter를 통해 정상적으로 하나의 데이터만 남을 것이라고 예상했다. @Test @DisplayName("map 과정에서 반환된 null이 정상적으로 필터링 되었는지 확인하는 테스트") void mono_null..

    [번역] Hibernate Document 서문, 시스템 요구사항, 아키텍처

    서문 객체 지향 소프트웨어와 관계형 데이터베이스를 함께 쓰는 것은 귀찮고 시간이 많이 소비된다. 데이터가 관계형 데이터베이스와 객체 사이에서 표현되는 방식의 패러다임 불일치로 인해 개발 비용이 증가하게 된다. Hibernate는 자바 환경에서 객체/릴레이션 매핑의 솔루션이다. 객체/관계형 매핑이라는 말은 객체 모델 표현 방식으로 부터 관계형 데이터를 매핑하는 기술을 의미한다. Hibernate는 자바 클래스로 데이터베이스를 매핑하는 것 뿐 아니라 데이터 쿼리 및 탐색 기능을 제공한다. 이는 SQL과 JDBC로 데이터를 핸들링하는 시간을 상당히 줄여줄 수 있다. Hibernate의 디자인 목표는 SQL과 JDBC로 데이터를 처리하는 필요성을 제거함으로써 개발다의 데이터 관련 프로그램 작업의 95% 감소 시..

    Spring Boot version 2.1.x에서 2.2.x (spring frame 5.2 이상)으로 버전업 진행 시 Spring Cloud AWS SnsAutoConfiguration 에서 TypeNotPresentExceptionProxy 가 발생하며 실행안되는 문제

    문제 발생 평소 문제가 많았던 webflux 부분 수정을 위해 spring boot 2.1.3에서 2.2.7버전으로 업그레이드를 진행하기 위해 gradle에서 spring boot version을 2.2.7로 변경하고 애플리케이션을 실행 시켰다. 그런데 평소에는 자주본적이 없던 TypeNotPresentExceptionProxy 에러가 발생했다. org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.baemin.bmart.search.BmartSearchAdminApplication]; nested exception is java..

    Spring reactor 2.1.2 (netty 0.8.4) Mono.zip readTimeoutException 문제

    Mono zip 각 Mono 처리 스레드를 병렬로 실행하고 이를 묶어서 사용할 수 있는게 Mono.zip이다. 근데 Mono zip에서 병렬로 실행되는 작업 중 하나가 empty 또는 error가 발생 되면 바로 error 또는 complete를 내뱉게 되어있다. 하지만 각 Mono 구독 작업에 error와 empty 발생 시 문제에 대해 fallback 처리를 해주면 에러가 발생하더라도 그 로직을 타게 되어있다. 하지만 2.1.2(netty 0.8.4) 버전을 사용하고 있을 때 호출 체인에서 첫 번째 요청의 실패 이후에 두 번째 요청이 정상적으로 이루어 지지 않아서 readTimeout이 발생되는 문제를 경험하였습니다. 이 문제를 해결하기 위해서 알아보던 중 2.1.2버전에 문제가 있는 것을 알게 되어..

    클린코드 9장 (클래스), 10장 (시스템), 11장(창발성), 12장(동시성)

    클래스 내부에서 동작하는 변수나 유틸리티는 protected로 선언하여 테스트에 사용하기도 한다. 클래스에 기본 규칙은 작게 만드는 것. 많을수록 클래스에 대한 책임이 너무 커진다. SPR을 지키기 위해 클래스가 너무 많아지면 사용에 더 어렵다고 우려할 수 있으나 하나의 여러 책임을 가지고 있는 클래스를 사용하는 것 보다 더 직관적 이므로 사용하기 더 편하다. 클래스 내부에 인스턴스 변수가 많아 진다는건 결국 클래스 내부에 함수와 인스턴스 변수들 사이에 응집도가 높아진다는 뜻이다. 이럴 수록 클래스를 분리해야 한다는 걸 의미한다. 긴 함수를 쪼갠다 → 작은 함수 여러 개로 만든다. → 몇몇 변수와 몇몇 함수만 사용 되는 경우가 보이면 클래스로 쪼갠다. 특정 기능이 변경 될 때 마다 코드가 변경되어야 하는..

    클린코드 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가 버전관리는 이 테이블에 데이터베이스의 ..

반응형