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 webflux + mysql

스프링 부트의 webflux의 rest api 예제 입니다. 샘플 코드 https://github.com/withccm/spring-webflux-study/tree/feature/webflux-mysql-sample 북 테이블 CREATE TABLE `book` ( `id` int ( 11 ) NOT NULL AUTO_INCREMENT , `bookname` varchar ( 200 ) DEFAULT NULL , PRIMARY KEY (`id`) ) ; 1. 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc' runtimeOnly 'mysql:mysql-connector-java' implementation 'dev.miku:r2dbc-mysql' 2. spring data r2dbc bean 등록 @Configuration @EnableTransactionManagement @EnableR2dbcRepositories public class DataSourceR2DBCConfig extends AbstractR2dbcConfiguration { @Bean @Primary public ConnectionFactory connectionFactory () { ConnectionFactoryOptions options = ConnectionFactoryOptions. builder () .option(ConnectionFactoryOptions. DRIVER , "pool" ) .option(ConnectionFactoryOptions. PROTOCOL , "mysql" ) .option(ConnectionFactoryOptions. HOST , "localhost" ...

AWS Amplify 이용하여 React 프로젝트 자동 빌드 배포

이미지
 AWS Amplify 는 클라이언트 애플리케이션 개발을 하도록 지원하는 도구입니다. 자세한 내용은 링크를 참고 부탁합니다. https://aws.amazon.com/ko/amplify/ Amplify 구성 1. 새로운 앱 생성 2. 연결할 저장소 선택 3. 리포지토리, 브랜치 선택 이때 자신의 리액트 프로젝트를 선택합니다. 4. 빌드 설정 구성은 특별히 변경할 필요없음. 5. 등록이 완료되면 자동을 빌드 배포가 진행됩니다. 이후 소스코드 변경이 있을 때 자동으로 프로젝트가 배포됩니다. 환경  변수 설정하기 1. 리액트에서 환경 변수 설정하기 상위 폴더에 .env 파일 생성하고 원하는 설정 추가 사용은 process.env. 를 통하여 합니다. axios . defaults . baseURL = process . env . REACT_APP_API_URL 2. Amplify 환경 변수 추가 앱 설정 > 환경 변수 메뉴 이미지와 같이 환경 변수를 추가하면 앱이 배포될때 포함되어 배포됩니다.

스프링 부트 프로파일 환경 설정 방법

이미지
Spring boot profile 환경 설정 방법 토이 프로젝트가 아닌 사용자에게 서비스할 프로젝트인 경우 개발 환경과 서비스 환경을 분리해서 구성해야할 필요가 있습니다. 스프링 부트 프로젝트 생성 https://start.spring.io/ 스프링 부트 프로젝트를 쉽게 세팅할 수 있다. 간단히 웹 디펜던시만 추가하였습니다. (세팅하는데 없어도 상관없습니다.) 파일을 분리하는 방법과 하나의 파일에 환경별로 작성하는 방법이 있습니다. 1. 파일을 분리하는 방법 파일 생성 및 구성 위의 이미지처럼 환경별로 파일을 생성합니다. application-{환경}.properties 예시는 로컬, 개발, 실서비스 3가지로 작성되었습니다. #application-local.properties logging.level.org.springframework = DEBUG #application-dev.properties logging.level.org.springframework = INFO #application-prod.properties logging.level.org.springframework = WARN 실행할 때 환경을 세팅하는 방법 1. 설정 파일에 정의하기 #application.properties spring.profiles.active = local 2. 실행할 때 주입하기 Active profiles: 원하는 환경 3. mvn 빌드시 설정 mvn -Dspring.profiles.active=prod spring-boot:run & 2. 하나의 파일에 환경별로 작성하는 방법 #application.yml --- spring : profiles : local, dev logging : level : org.springframework : DEBUG --- spring : profiles : test logging : level : org.springframework : INFO --- spring : profiles : ...

자바 스프링 설정값 사용하기

이미지
자바에서 스프링 설정 읽는 두가지 방법을 설명하겠습니다. 자바 설정을 통하여 읽어 올 수 있습니다. @Configuration @PropertySource ( "classpath:filename.properties" ) 파일에 include를 정의하여 읽어 올 수 있습니다. 스프링부트에서 기본적으로 applicaion.*를 설정 파일을 읽어오도록 되어 있습니다. 스프링부트 > 설정 파일 예시 *.yml 파일에서 읽을 파일 목록 정의하기 spring : profiles : include : - env - datasource - redis application-env.yml 파일에 설정 정의 env : api : host : localhost.withccm 정의된 설정값 사용하기 import org.springframework.beans.factory.annotation. Autowired ; import org.springframework.beans.factory.annotation. Value ; import org.springframework.context.annotation. Configuration ; import org.springframework.core.env.Environment ; @Value ( "${env.api.host}" ) private String apiHost ; @Autowired private Environment env ; public String getApiHost () { return env .getProperty( "env.api.host" ) ; } @Value 어노테이션을 통하여 정의된 사용할 값을 할당하여 사용합니다. 읽어야할 설정이 많은 경우 일일히 정의해야 하기 때문에 선언 부분이 길어질 수 있습니다. 또는 스프링 환경인 Environment 를 주입 받아, getProperty 함수를 호출하여 사...

MySQL PK 중복 (duplicate key ) 해결 방법

데이터베이스에 데이터를 입력하다보면 pk가 중복되어 오류(duplicate key)가 발생하는 경우가 있습니다. 이런 경우를 방지하기 위해서 조회를 해보고 없으면 신규 인서트(삽입), 있으면 무시하거나 업데이트 하도록 종종 개발할 때가 있습니다. 어플리케이션에서 조회하고 다음 쿼리를 호출하게 되는 경우 동시성 문제가 발생할 수 있어요. 그리고 조회해서 쿼리를 또 사용할 경우 네트워크 비용이 발생하는 단점이 있습니다. (성능이 좋지 못함) 동시성 문제란 여러 스레드나 프로세스에서 동일한 데이터를 접근할때 발생할 수 있고, 이때 데이터가 실제 데이터와 다른현상이 발생합니다. 예를들어 a, b 스레드에서 데이터를 조회하여 빈 값을 획득한경우 신규 데이터 인서트를 a와 b에서 실행하게 될때(순사적으로 실행되었다고 가정), b의 인서트를 실행할때 이미 a가 인서트 완료했기 때문에 오류가 발생합니다.  위의 문제를 쿼리를 통해 간단히 해결할 수 있습니다. user_log : 사용자로그 테이블  - userNo : 사용자번호 (PK) - lastLogAt : 마지막활동기록 PK중복인 경우 업데이트 (단건) INSERT INTO user_log SET userNo = 123, lastLogAt = 202101201043 ON DUPLICATE KEY UPDATE lastLogAt = 202101201043 INSERT INTO user_log (userNo, lastLogAt) VALUES (123, 202101201043) ON DUPLICATE KEY UPDATE lastLogAt = 202101201043 mybatis <insert id ="insert" parameterType ="map" > INSERT INTO user_log SET userNo = #{userNo}, lastLogAt = #{lastLogAt} ON DUPLICATE ...

자바 스프링 MVC에서 LocalDateTime 타입으로 파라미터 받기

웹에서 전달한 파라미터를 서버에서 문자열(String) 타입이 아닌 자바 시간 타입을 받으면 서버에서 별도의 문자열 포맷딩을 할 필요없이 사용할 수 있습니다. 웹 클라이언트에서 전달하는 코드 const startDate = moment ( '2021-01-13' , 'YYYY-MM-DD' ). startOf ( 'day' ). format ( 'YYYY-MM-DDTHH:mm:sszz' ) console . log (startDate) // //2021-01-13T00:00:00 axios. get ( "http://localhost/search?startDate" + startDate). then ((response) => { console . log (response) }) 위의 예시는 날짜기준 조회 예시입니다. 날짜 단위로 조회하기 위해 startOf 함수를 사용하여 시간을 0으로 변경하였다. 자바 스프링 MVC import org.springframework.format.annotation. DateTimeFormat ; // 클래스정의 생략 @GetMapping ( "/search" ) public void getSearch ( @DateTimeFormat (iso = DateTimeFormat .ISO. DATE_TIME ) @RequestParam LocalDateTime startDate) { // action } LocalDateTime의 타입으로 데이터를 받으려면, DateTiemFormat을 정의해주면 됩니다.

Moment.js 자주사용하는 함수

자바스크립트에서 Date 객체를 사용하여 날짜 관련 조작하기 까다로운일입니다. Moment 라이브러리를 활용하면 개발을 쉽게 할 수 있습니다. Moment 객체 -> Date 객체로 변환 const oDate = moment (). toDate () Date 객체 -> Moment 객체로 변환 const oMoment = moment ( new Date ( 2019 , 9 , 31 )) Moment 날짜 더하고, 빼기 moment (). add ( 1 , 'days' ) //내일 moment (). subtract ( 1 , 'days' ) //어제 단위 : seconds, minutes, hours, days, months, years 문자열 -> Moment 객체로 변환 moment ( "20191031" , "YYYYMMDD" ) Moment 객체 -> 문자열로 변환 moment (). format ( 'YYYYMMDD' ) 공식 사이트 https://momentjs.com/

macOS nginx 설치, 실행, 설정 위치

macOS에서 nginx을 설치하려면 Homebrew가 먼저 설치되어야 합니다.  설치 방법은 앞선 포스팅을 참고바랍니다. https://withccm.blogspot.com/2020/12/macos-brew.html nginx 설치 Homebrew를 설치한 이후 brew 명령어를 사용하여 nginx를 설치합니다. brew install nginx m1 에서 안될때 brew install nginx Warning : No available formula with the name "nginx". ==> Searching for similarly named formulae... Error : No similarly named formulae found. ==> Searching for a previously deleted formula (in the last month)... Error : No previously deleted formula found. ==> Searching taps on GitHub... Error : No formulae found in taps. 위와 같은 오류 발생시 brew 코어 디렉토리를 삭제해 주면 해결됩니다. rm -rf $(brew --repo homebrew/core) 이후 설치하는데 시간이 좀 필요합니다. nginx 구동 명령어 nginx # 서버 시작 nginx -s stop # 서버 정지 nginx -t # 설정 테스트 nginx -s reload # 서버 재시작 nginx -t 를 사용하면 설정 수정후 에러가 있는지 미리 확인할 수 있는 유용한 명령어 입니다. nginx 설정파일 위치 /usr/local/etc/nginx or /opt/homebrew/etc/nginx 프록시 설정하기 nginx.conf server { listen 80 ; server_name localhost ; location / { ...

macOS brew 설치

맥에서 개발을 시작하려고 할때 brew 명령어를 통해 설치하는 것을 많이 보게 됩니다. 아래는 brew를 통하여 nignx 설치하는 예제입니다. brew install nginx Homebrew란? Homebrew는 macOS 용 패키지 관리자입니다. Homebrew 통해서 원하는 패키지를 설치, 업데이트, 삭제를 쉽게 할 수 있습니다. 설치는 간단합니다. Homebrew사이트 에 접속하여 터미널에서 아래 명령어를 실행하면 설치되는 것을 볼 수 있습니다. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

개발자 추천 도서 (초급)

다음 책은 초급 개발자가 중급 개발자로 성장하기 위해 읽어야할 목록입니다. 클린코드 - 로버트 C. 마틴 http://naver.me/FMVwRfsj 리팩토링 - 마틴 파울러 http://naver.me/xcKELbsq 테스트 주도개발 - 켄트 벡 http://naver.me/5HSThRNI 조엘 온 소프트웨어 - 조엘 스폴스키 http://naver.me/5Z80DFLD