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...

RestTemplate Config 설정 responseType Map 으로 응답 받기

  http 요청을 사용하여 외부의 자원을 호출하여 사용할 때가 많이 있습니다. 이와 관련된 기본 예제를 살펴 보겠습니다. Spring boot 프로젝트라고 가정하겠습니다. 라이브러리 추가 implementation 'org.apache.httpcomponents:httpclient:4.5.13' 기본 설정 추가 import org.springframework.context.annotation. Bean ; import org.springframework.context.annotation. Configuration ; import org.springframework.http.client. HttpComponentsClientHttpRequestFactory ; import org.springframework.web.client.RestTemplate ; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate () { HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory() ; requestFactory.setConnectTimeout( 1000 ) ; // 소켓 연결 타임아웃 requestFactory.setReadTimeout( 3000 ) ; // 소켓 연결 이후 응답 타임아웃 RestTemplate restTemplate = new RestTemplate(requestFactory) ; return restTemplate ; } } 클래스 객체 응답 받기 import lombok.extern.slf4j. Slf4j ; import org.springframework.b...

nginx API Error JSON Response

이미지
  서버나 정적응답없이 nginx 즉시 오류를 응답하고 싶을 수 있습니다. 기본설정에는 root의 html 파일로 되어 있습니다. API의 웹서버로 사용하고 있는경우 Content-Type: application/json 의 json은 형식을 많이 사용합니다. 설정하기 nginx.conf server { listen 80 ; server_name localhost ; proxy_pass_header Server; location /api { if ($host = 'api.mylocalhost') { return 404; } proxy_pass http: //127.0.0.1:8080; } error_page 404 /404.json; location /404.json { return 404 '{"code": 404,"message": "Not Found"}'; } } 404.json에서 json으로 확장자를 하는 이유는 response header에 Content-Type: application/json 가 자동으로 세팅되게 됩니다. 호출하면 위와 같이 볼 수 있습니다. 그리고 if문 조건을 넣고 싶은경우 location 안에 추가해야합니다. if문 안에 location 을 추가하면 오류가 발생합니다. 이전 nginx 문서 설치 및 실행  https://withccm.blogspot.com/2020/12/macos-nginx.html Response Header Server 정보 제거 https://withccm.blogspot.com/2022/07/nginx-response-header-server.html

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 ...