Spring Boot Admin Server, Client config 설정하기

이미지
 Spring Boot로 많은 프로젝트를 진행하게 됩니다. 많은 모니터링 도구가 있지만, Spring Boot 어플리케이션을 쉽게 모니터링 할 수 있는 방법을 소개하려고 합니다.   코드 중심으로 살펴보겠습니다. 1. 어드민 서버 구축 1-1. 디펜던시 추가 dependencies { // https://mvnrepository.com/artifact/de.codecentric/spring-boot-admin-starter-server implementation 'de.codecentric:spring-boot-admin-starter-server:2.5.4' } 1-2. 어드민 서버 설정 활성화 @SpringBootApplication @EnableAdminServer public class ServerApplication { public static void main (String[] args) { SpringApplication. run (ServerApplication. class, args) ; } } EnableAdminServer를 하면 됩니다. 2. 클라이언트 서버 설정  예제는 book-client, member-client 2가지 클라이언트, member-client가 2개의 인스턴스 실행으로 작성했습니다.  2-1 디펜던시 추가 dependencies { // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web implementation 'org.springframework.boot:spring-boot-starter-web:2.5.4' // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-actuator implementation 'org.spring...

Spring boot redis cache config

이미지
   안녕하세요. RedisTemplate 에 이어 redis cache를 알아보겠습니다.   전편 : Spring boot redis RedisTemplate에 대하여   전편에서 한 Redis 설정이 되어 있다고 가정하겠습니다. 1. 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' 앞에서 의존성 추가를 이미 했으면 추가할 필요가 없습니다. 2. 캐시키 정의하기 import lombok. Getter ; import lombok. RequiredArgsConstructor ; import java.time.Duration ; @RequiredArgsConstructor @Getter public enum RedisCacheKey { BOOK (CacheNames. BOOK , Duration. ofMinutes ( 2 )) , STORE (CacheNames. STORE , Duration. ofHours ( 1 )) , ; private final String cacheName ; private final Duration expired ; public static class CacheNames { public static final String BOOK = "book" ; public static final String STORE = "store" ; } } Book과 Store 2가지 종류를 정의했습니다. 캐시키를 생성할 때 prefix로 사용될 cacheName과 만료시간(expired)를 선언했어요. 3. 캐시키 생성기 정의하기 import org.springframework.cache.interceptor.KeyGenerator ; import org.springframework.util.StringUtils ; import j...

Spring boot redis RedisTemplate

이미지
 안녕하세요. 스프링부트 프로젝트의 RedisTemplate 에 대해 알아 보겠습니다. Redis는 구동 되고 있다는 가정하에 작성하였습니다. 1. 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' 2. RedisTemplate 설정 추가 2-1 yaml 파일에 설정 정의만 추가 스프링 부트에 yaml 파일에 정의만 해주면 자동으로 생성됩니다. spring : redis : host : localhost port : 6379 이외에도 옵션이 많은데 참고 사이트 링크로  대체하겠습니다. 위와 같이 설정이 추가된 상태이면 RedisTemplate 빈을 주입받을 수 있습니다, @Autowired private RedisTemplate redisTemplate ; 이 상태에서 레디스에 저장된 내용을 살펴보겠습니다. 제가 redisTemplate을 사용하여 key가 3으로 저장하였는데, 3으로 값을 조회하면 값이 나오지 않습니다. key를 조회해보면 이상한 문자값으로 저장된 것을 볼 수 있습니다.  해당 키로 조회하는경우 결과도 마찬가지 입니다. 이것은 redis에 저장할때 직렬화(serialize)/역직렬화시 JDK 방식으로 진행되기 때문입니다. 2-2 RedisConfig 설정 추가하기 앞의 문제를 해결하기 위해서 직접 설정 커스텀하여 추가할 수 있습니다. import lombok.extern.slf4j. Slf4j ; import org.springframework.beans.factory.annotation. Autowired ; import org.springframework.boot.autoconfigure.data.redis.RedisProperties ; import org.springframework.context.annotation. Bean ; import org.springframework.context....

vi 붙여넣기 주석 및 자주 사용하는 명령어 set paste

  리눅스 환경에서 서버 관리를 하다 보면 vi(vim)를 사용해야될 때가 있습니다. 자주 만나게 되는 고민/문제 해결 방법을 확인해 보겠습니다. 들어가기 전에 vi는 다양한 모드(mode)를 가지고 있습니다.  1. 처음 실행하면 Normal 모드 2. :를 입력하면 명령어 모드 3. v를 입력한 경우 블록을 선택할 수 있는 비주얼 모드 4. io등등 글자를 입력할 수 있는 끼워넣기(Insert) 모드 그리고 대소문자별로 명령어가 다릅니다.  1. 붙여넣기 했을때 주석이후 계단 현상 :set paste 붙여넣기 설정을 추가한 후에 붙여 넣기 하면 해결됩니다. 외부에서 ctrl+C한 내용 붙여넣기 안될때 Normal모드에서 "+p 순서대로 입력하면 됩니다. 2. 라인 표시 :set number 3. 단어 검색 명령어 모드에서 /검색단어 엔터 n다음, N이전 4. 해당 라인으로 이동 :123 원하는 라인 입력 제일 마지막 라인으로 이동  G 첫 라인으로 이동 gg 5. 삭제, 복사, 실행취소 dd 한줄 삭제 yy 한줄 복사 v로 원하는 블록만큼 선택 후 y 하면 복사가 됨 p 붙여넣기 (대문자 P는 앞라인에 붙여넣기) u 실행 취소(undo) Ctrl+r redo

crontab 시간 설정 방법

이미지
 crontab나 jenkins에서 주기적으로 실행해야 할 때가 많이 있습니다. 예를 들어 매일 랭킹을 추출하는 경우가 있습니다.  시간 설정 방법을 예제를 통해 알아보겠습니다.  기본 명령어 crontab -l # 등록된 목록 출력 crontab -e # 수정 crontab -r # 삭제 등록 예제 5 * * * * /directory/exe_file.sh 시간 요소 시간 설정은 5가지 요소로 이루어져있습니다. * * * * * 분(0-59), 시간(0-24), 날(1-31), 월(1-12), 요일(0-6) 0은 일요일 위의 예제는 1분 마다 실행 시간 예제 0 * * * * 0분에 1시간마다 실행 -> 00시00분, 01시00분, 02시00분... */5 * * * * /로 나눠서 실행 주기를 설정할 수 있습니다. 5분마다 실행 -> 00시00분, 00시05분, 00시10분...   0 3 * * * 매일 3시에 실행  -> 5월10일 03시00분, 5월11일 03시00분, 5월12일 03시00분... * 9-18 * * * -를 사용하여 범위를 지정할 수 있습니다. 매일 9-18시 사이에 1분마다 실행 -> 09시00분, 09시01분, 09시00분, ... 18시58분, 18시59분, ... 다음날 09시00분,... 30 9-18/2 * * * 매일 9-18시 사이에 30분에 2시간마다 실행 -> 09시30분, 11시30분, 13시30분... 30 9,18 * * * ,를 사용하여 필요한 숫자를 지정할 수 있습니다. 매일 9시30분, 18시30분에 실행 0 1 1 * * 매달 1일 1시00분 마다 실행 -> 9월1일 01시0분, 10월1일1시01분, 11월1일1시01분... 10 3 * * 6 매주 토요일 3시10분에 실행 -> 2022년9월10일 03시10분, 2022년9월17일 03시10분, 2022년9월24일 03시10분... 참고로 젠킨스에서는 분설정 부분에...

자바 리스트 정렬 방법 java list sorting

  리스트 정렬 방법에 대해 간단히 알아 보겠습니다.  예제에서 사용할 Book 클래스 import lombok. AllArgsConstructor ; import lombok. Builder ; import lombok. Getter ; import lombok. ToString ; import java.time.LocalDateTime ; @AllArgsConstructor @Getter @Builder @ToString public class Book { private Integer id ; private String title ; private LocalDateTime createdDate ; } Book 객체 생성하는 함수입니다. private Book makeBook ( int id , int day) { return Book. builder () .id(id) .createdDate(LocalDateTime. of ( 2022 , 5 , day , 10 , 0 )) .build() ; } id와 day를 파라미터로 받아 Book 객체를 생성합니다. 리스트 정렬을 하기 위해 stream을 생성하고, sorted 함수를 사용했습니다. 조건1개를 오름차순으로 정렬하는 예제 @Test public void 조건 1 개 _ 오름차순 _ 정렬 () { // given List<Book> books = new ArrayList<>() ; books.add(makeBook( 1 , 7 )) ; books.add(makeBook( 2 , 5 )) ; books.add(makeBook( 3 , 9 )) ; books.add(makeBook( 4 , 10 )) ; books.add(makeBook( 5 , 4 )) ; // when List<Book> result ...

자바 JUnit Mock 테스트

 복잡한 로직의 코드를 작성할때, 리팩토링을 해야할때 잘 짜여진(경우의 수를 반영한) 테스트 코드가 있으면 코드의 결과에 대한 확신이 생깁니다.  이때 Mocking을 활용하면 테스트 코드를 더 원활하게 작성할 수 있습니다. Mocking이란 단위 테스트를 작성할때 데이터베이스와 같이 외부에 의존하지 않고, 실행될 함수를 테스트에 직접 정의하여 대체하는 기법입니다. 1. 의존성 주입 dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' testCompile group : 'junit' , name : 'junit' , version : '4.12' testImplementation 'org.mockito:mockito-core:3.6.0' testImplementation 'org.easytesting:fest-assert:1.4' } mockito를 사용했습니다. fest-assert는 테스트 검증을 쉽게 할 수 있도록 도와줍니다. (필수 아님). lombok나 string-boot는 편의를 위해 사용했습니다. 2. Book관련 클래스 정의 import lombok. AllArgsConstructor ; import lombok. Builder ; import lombok. Getter ; import lombok. ToString ; @AllArgsConstructor @Getter @Builder @ToString public class Book { private Integer id ; private String title ; } 데이터 클래스 입니다. import lombok.extern.slf4j. Slf4j ; import org.springf...