728x90

전체 글 288

homebrew 간단정리

mac 용 패키지 관리자이다. 설치는 여기 에서 하라고 하면 된다.(매우간단) 가장 먼저 해야할 일은 update와 cask 패키지를 설치하는 것이다. cask는 Safari, Chrome, Word 등과 같이 그래픽을 통해 작업하는 프로그램을 설치할 수 있게 해주는 패키지이다. brew update brew install [cask] 패키지명 참고로 아래와 같이 패키지명을 지정하지 않으면 cask 명령어가 사용되는 것이 아니라 Emacs dependency management 가 설치된다고 한다. brew install cask brew install cask 추가로 예전에는 cask 명령어를 사용하는 방법이 brew cask install 패키지명 이었는데 지금은 brew install cask 패키..

ETC 2021.04.15

Redis 커넥션 풀

SpringBoot 기반 Redis 예제를 서칭하다보면 application.yml 에 아래와 같이 구성정보를 설정하는 경우를 볼 수 있다. spring: redis: host: localhost port: 6379 lettuce: pool: max-active: 10 max-idle: 10 min-idle: 2 그런데 lettuce.pool 설정은 사실 의미없는 설정이다. Redis 자체는 싱글스레드 기반이기 때문에 여러 커넥션을 사용한다고 해도 성능이 좋아지지 않기 때문이다. 공식 문서를 보면 Redis 커넥션 풀링은 트랜잭션을 사용할때만 제한적으로 사용된다고 되어 있다. 참고 lettuce.io/core/release/reference/index.html#connection-pooling.is-co..

Backend/Redis 2021.04.15

Redis null 값 캐싱하지 않기

value 가 null 일 경우 굳이 캐싱할 필요가 없기 때문에 RedisCacheManager 선언시 아래와 같이 disableCachingNullValues() 를 포함하곤 한다. 그런데 실제로 @Cacheable 를 선언한 메소드에서 null을 리턴하는 순간 아래와 같은 에러를 마주할 수 있었다. Avoid storing null via '@Cacheable(unless="#result == null")' or configure RedisCache to allow 'null' via RedisCacheConfiguration. 결국 @Cacheable 어노테이션에 unless = "#result == null" 속성을 추가하라는 말인데 나는 분명 전역적으로 null 을 캐싱하지 않겠다고 했는데 왜 ..

Backend/Redis 2021.04.15

jackson 역직렬화 시 주의할 점

자바 진영에서는 json 직렬화/역직렬화시 거의 대부분 jackson 라이브러리를 사용한다. jackson은 json을 역직렬화시 생성자를 활용하고 모든 인자를 받는 생성자에 @ConstructorProperties 어노테이션이 달려있으면 해당 생성자를 역직렬화에 사용하지만 없을 경우 기본 생성자를 사용하게 된다. @ConstructorProperties 는 lombok을 이용해서 모든 인자를 받는 생성자를 생성하면 컴파일시 자동으로 붙여주던 것인데 @AllArgsConstructor, @Builder 를 사용하는 경우를 예로 들 수 있다. 그런데 lombok 1.16.20 이상부터는 이게 자동으로 붙지 않기 때문에 명시적으로 기본생성자를 생성해줘야 한다. 물론 기존처럼 자동으로 @ConstructorP..

Backend/Java 2021.04.14

intellij 로 프로젝트 생성할 때 명칭 선택

intellij 로 SpringBoot 프로젝트를 생성할 때 위와 같은 화면을 마주할 수 있다. 이때 Artifact를 입력하면 Name, Package 항목이 그에 맞춰 자동으로 입력된다. 위와 같이 - 을 포함해서 prefix, subfix 등을 포함하는 프로젝트의 경우 Package 항목이 불필요하게 길어질 수 있고 패키지명에 -는 권장되지 않기 때문에 - 이 누락되어 의미가 불분명해질 수 있다. 프로젝트 명은 명시적으로 만든다고 해도 Package 항목은 짧을수록 좋기 때문에 일반적으로 약어를 사용한다. Name 항목은 Gradle 에서 인식하는 프로젝트 명으로 build 패키지 생성시 해당 이름으로 생성한다. 되도록 Artifact와 맞춰주는 것이 좋다.

ETC 2021.04.08

Gradle 의존성 버전 관리

Gradle 에도 Maven 과 동일하게 dependencyManagement 를 사용할 수 있다. Maven과 동일하게 dependencyManagement 를 통해 의존성 버전을 명시하면 실제 의존성 정의시 버전을 명시하지 않아도 dependencyManagement에 명시된 버전이 자동으로 지정된다. 아래와 같이 사용하면 된다. dependencyManagement { dependencies{ dependency "com.google.guava:guava:17.0" } } dependencies { implementation 'com.google.guava:guava' } 이를 통해 모듈간 의존성 버전을 관리할 수 있게 되는데 프로젝트 단위로 의존성 버전을 관리하려면 어떻게 해야 할까? Maven ..

Base/CI, CD 2021.04.07

git 컨플릭 해소 방법

내가 커맨드로 merge 를 하는 과정에서 발생하는 컨플릭은 그냥 IDE에서 제공하는 기능을 통해 쉽게 비교해서 컨플릭 해소해서 머지하면 된다. 그런데 문제가 되는 것은 풀리퀘 단계에서 컨플릭이 발생했을때이다. feature브랜치를 cbt브랜치로 머지하기 위해 풀리퀘를 요청했다고 해보자. 검토자가 승인을 하고 머지를 하려고 보니 컨플릭이 발생했다. github 에서 설명하는 커맨드를 통한 컨플릭 해소 방법은 아래와 같다. 로컬에서 feature

ETC 2021.04.07

반응형 슬라이더 Swiper

가로로 슬라이딩 되는 화면을 만들고 싶을 때 사용하면 된다. 자동으로 슬라이딩되게 하거나 수동으로 슬라이딩 되게 만들 수 있다. 구현 방법은 아래와 같다. 자동 슬라이드 말고 수동으로 슬라이드 하고 싶다면 autoplay 옵션 자체를 주지 않으면 된다. Slide 1 Slide 2 Slide 3 위 코드를 .html 파일로 만들어서 브라우저로 실행하면 Slide1, Slide2, Slide3 이 2초에 한번씩 자동으로 슬라이드 되는 것을 확인할 수 있다. 한가지 주의할 점은 new Swiper('.swiper-container' ... 와 같이 실제 슬라이드 설정할 때 타겟에 해당하는 .swiper-container 가 반드시 display:block 상태여야 한다. 난 이것 때문에 반나절을 허비함.. ..

Frontend/JavaScript 2021.04.07

k8s Logging 시스템 구축

해당 포스팅은 사내 k8s 클러스터에 EFK 로깅시스템을 구축한 기록으로 기본적으로 k8s 클러스터가 구축되어 있고 kubectl 연결이 되어 있다는 가정하에 작성되었습니다. 1. 구축 방법에 대한 고민 나만 구축하고 끝날게 아니라 클라우드 환경에 누구나 쉽게 구축이 가능해야 하기 때문에 적극적으로 관리되는 Helm Chart 를 활용하는게 좋겠다고 생각했습니다. 하지만 후보군으로 뒀던 Chart들이 모두 문제가 있어 결국 이곳을 참고해서 yaml 파일을 직접 작성해서 구성하는 방법으로 진행했습니다. 후보군으로 뒀던 Helm Chart 들은 아래와 같습니다. 1. https://github.com/komljen/helm-charts/tree/master/efk github 외에 개인블로그도 운영중인 사람..

Base/Logging 2021.04.02
728x90