반응형

spring kill 시키기

SIGTERM 과 SIGKILL

주의해야할 것은 "정상(?) 종료" 되었을 때에 호출된다는 것이다.
무슨 말이냐면 애플리케이션이 종료될 때 일반적인 인터럽트는 SIGTERM 이라는 인터럽트다.
이 인터럽트(SIGTERM)가 발생하면 이벤트로 감지하고 수행하는 작업이라는 것이다.
SIGTERM을 정상적인 종료라고 봤을 때, 비정상 종료는 SIGKILL 이다.
리눅스에서 kill -9 옵션과 같이 강제적으로 꺼버리는 것과 윈도우에서 작업관리자가 작업을 끝내버리는 등의 인터럽트가 SIGKILL이다.
위의 예제를 따라했는데 종료 이벤트에 대한 메서드가 호출되지 않았다면 SIGKILL을 이용해서 종료했을 가능성이 높다.
혹시나하고 윈도우 환경에서 커맨드창에 ctrl + c 로 종료해보았는데 이 단축키는 SIGTERM을 발생하는 이벤트라서 온전히 종료되는 것을 아래 그림에서 볼 수 있다.

kill 시킬시

kill -9 는 급 종료
kill -15 는 현재 프로세스 다 실행시키고 종료 

 

권장 종료 방법

$kill -term 프로세스ID

kill -term 이 -15 와 동일하다

 

$ kill -l

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR

 

 

참고문헌

https://jeong-pro.tistory.com/179 [SIGTERM 과 SIGKILL 및 스프링종료시 생명주기]
https://heowc.dev/2018/12/27/spring-boot-graceful-shutdown/ [스프링boot 안전하게 종료하기]
https://www.baeldung.com/spring-boot-shutdown [스프링 boot 종료 공식 문서]
www.lesstif.com/system-admin/unix-linux-kill-12943674.html [kill 종료 명령어 코드 및 방법]

 

반응형
반응형

어플리케이션 내에서 스케쥴링 해야하는 일이 생긴다.

 

스프링부트에서 사용하려명 Main 클래스에 @EnableScheduling 을 추가해주면 된다.

 

@Component
public class Scheduler {

	@Scheduled(fixedDelay = 3000)
	public void excute() {
    	System.out.println("스케쥴러");
	}
}    

위의 코드는 3초마다 실행이 된다.

fixedDelay 는 스케쥴러가 끝나고 3초이고, fixedRate 는 3초마다 주기적으로 실행을 한다는 의미이다.

끝나는 시점이 중요하면 fixedDelay 를 사용해야 한다.

 

그리고 크론탭과 같은 문법 사용이 가능하다. 

ex)

@Scheduled(cron="*/30 * * * * *")

시간 설정 @scheduled(cron=" ") * 리눅스 crontab 과 같은 설정방법

ex> @Scheduled(cron="0 0 02 * * ?") = 매일 새벽2시에 실행

ex> @Scheduled(cron="0 0 02 2,20 * ?") = 매월 2일,20일 새벽2시에 실행


시간 설정 @scheduled(cron=" ")  * 리눅스 crontab 과 같은 설정방법

ex> @Scheduled(cron="0 0 02 * * ?") = 매일 새벽2시에 실행

ex> @Scheduled(cron="0 0 02 2,20 * ?") = 매월 2일,20일 새벽2시에 실행

 

스케쥴러 cron 양식

초 0-59 , - * / 

분 0-59 , - * / 

시 0-23 , - * / 

일 1-31 , - * ? / L W

월 1-12 or JAN-DEC , - * / 

요일 1-7 or SUN-SAT , - * ? / L # 

년(옵션) 1970-2099 , - * /

* : 모든 값

? : 특정 값 없음

- : 범위 지정에 사용

, : 여러 값 지정 구분에 사용

/ : 초기값과 증가치 설정에 사용

L : 지정할 수 있는 범위의 마지막 값

W : 월~금요일 또는 가장 가까운 월/금요일

# : 몇 번째 무슨 요일 2#1 => 첫 번째 월요일

 

예제) Expression Meaning 

초 분 시 일 월 주(년)

 "0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00

 "0 15 10 ? * *" : 모든 요일, 매월, 아무 날이나 10:15:00 

 "0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00 

 "0 15 10 * * ? *" : 모든 연도, 아무 요일, 매월, 매일 10:15 

 "0 15 10 * * ? : 2005" 2005년 아무 요일이나 매월, 매일 10:15 

 "0 * 14 * * ?" : 아무 요일, 매월, 매일, 14시 매분 0초 

 "0 0/5 14 * * ?" : 아무 요일, 매월, 매일, 14시 매 5분마다 0초 

 "0 0/5 14,18 * * ?" : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초 

 "0 0-5 14 * * ?" : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초 

 "0 10,44 14 ? 3 WED" : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00 

 "0 15 10 ? * MON-FRI" : 월~금, 매월, 아무 날이나 10:15:00 

 "0 15 10 15 * ?" : 아무 요일, 매월 15일 10:15:00 

 "0 15 10 L * ?" : 아무 요일, 매월 마지막 날 10:15:00 

 "0 15 10 ? * 6L" : 매월 마지막 금요일 아무 날이나 10:15:00 

 "0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00 

 "0 15 10 ? * 6#3" : 매월 3번째 금요일 아무 날이나 10:15:00

 

반응형
반응형

엔티티 클래스로 등록한 클래스지만, DB 테이블과는 별도로 기능이(추가 필드나 메소드) 필요한 경우가 있다.

 

예를 들어 DB 테이블에는 존재하지 않지만, 엔티티 클래스에는 등록되어 같이 운용하는 경우가 있다.

vo(엔티티) 에는 사용하지만 jpa 로 디비와 관련 없이 사용하고 싶을때!!

 

이럴 경우, DB 테이블에 간섭하지 않고, 엔티티 클래스 내부에서만 동작하게 하는 어노테이션을 사용한다.

 

@Transient 어노테이션을 사용하는데, 이 어노테이션은 하이버네이트의 jpa 패키지에 위치하고 있다.

@Transient 어노테이션을 사용한 필드나 메소드는 DB 테이블에 적용되지 않는다.

 

@Entity
public class Member {
    private Long memberId;
    private String password;
    @Transient
    private String confirmPassword;
    …
}

 

반응형
반응형

도커의 경우 여러가지 도커를 한번해 실행하기때문에 하나의 도커 컴포즈 파일로 관리를 한다.

 

도커 및 도커 컴포즈를 설치한다.

docker-compose.yml

version: "3.3" # 파일 규격 버전
  mongo:
    image: mongo
    restart: always
    ports:
      - 9017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: user
      MONGO_INITDB_ROOT_PASSWORD: password  

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 9018:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: user
      ME_CONFIG_MONGODB_ADMINPASSWORD: password

다음과 같이 compose 파일 작성 뒤 docker-compose.yml 파일 작성한 경로에서

docker-compose up -d

로 docker 실행해주면 끝이난다.

 

MongoDB

 

몽고디비를 툴로 접속해서 보기 위해 robo 3T 툴로 접속해본다.

다음과 같이 9017 포트로 도커포트 27017 을 연결해줬다.

     

다음과 같이 비번 계정을 적어주면 접속이 된다.

 

Mongo Express

mongo db 만 띄워도 되지만 몽고 익스프로세도 올려서 모니터링도 해준다.

localhost:9018 로 외부에서 도커포트 8081 로 연결해준다.

 

굳이 mongo express 를 설치할 필요는 없다. 몽고 db 툴 로도 충분히 관리가 가능하고, 기능도 더 많다.

 

반응형

'인프라 > docker' 카테고리의 다른 글

[docker] 도커 jenkins 시작하기  (0) 2020.12.18
[docker] kafka docker 시작하기  (0) 2020.11.15
[docker] mysql 을 docker 로 시작하기  (0) 2020.07.05
[docker] 도커 기본 명령어  (0) 2020.07.04
[docker] mac 도커 설치하기  (0) 2020.07.04
반응형

vscode 확장툴들이 너무나도 많이 생겨서 이전에는 인텔리제이 및 이클립스에서만 가능했던 자바 IDE 기능이 이제는 vscode 에서도 가능해졌습니다.

 

여러패키지가 있지만 스프링부트를 vscode 에서 사용하기 위해서는 2가지가 필요합니다.

1. Java Extension Pack(Micosoft)

  - java언어 지원 기능, 디버거, 테스트 실행, maven 프로젝트 관리 등의 확장을 패키징 한 패키지

2. Spring Boot Extension Pack(Pivotal)

  - spring 프레임워크에 적용할 수 있는 유용한 기능이 들어있는 패키지, 말그대로 팩이여서 여러가지 스프링부트 관련 확장 패키지가 포함되어 있습니다.

 

 

이클립스 기반 sts 를 만든 회사에서 Spring boot 패키지를 만든것 같습니다, (Pivotal)

 

여기서 주의 할 설정은 스프링부트가 구동되려면 설치한 자바 경로를 잡아줘야 합니다.

이거만 잘 진행된다면 바로 스프링구동이 됩니다.

 

java 확장도구 까지 설치했다면, 위와같이 settings 에서 

jdk 로 검색 후 setting.json 에서 자바 경로를 설정해 줍니다.

java home 만 설정해 주면 됩니다.

mac 의 경우 jdk 설치시

/Library/Java/JavaVirtualMachines/ 에 설치 되고 jdk 버젼 폴더 하위에

/Contents/Home 경로로 세팅해주면 모든 준비가 끝납니다.

 

 

그러면 vscode 패키지 명령어를 실행하면 됩니다.

spring initializr 를 실행하면 되는데, 이클립스 sts 로 스프링부트를 해보신분들이라면 이부분부터는 거의 UI 만 다르지 내용은 똑같습니다.

 

프로젝트가 생성되면 오른쪽 상단에 실행버튼이 생깁니다.

그 외에도 프로젝트 화면에 스프링부트 대쉬보드 및 메이븐 플로그인도 같이 사용가능하도록 UI 가 구성되어 있습니다.

다음은 스프링부트를 실행한 화면입니다.

반응형
반응형

맥에서 npm 패키지를 설치하다가 오류가 난적이 있습니다.

 

해당오류는 gyp: No Xcode or CLT version detected! 과 같이 나옵니다.

 

저의 경우에는 nuxt 신규 프로젝트 하려고 명령어를 치다 다음과 같은 오류를 발견했습니다.

npx create-nuxt-app frontend 

이 명령어를 치니 패키지를 가져오는 부분에서 오류가 생겼습니다.

No receipt for 'com.apple.pkg.CLTools_Executables' found at '/'.

No receipt for 'com.apple.pkg.DeveloperToolsCLILeo' found at '/'.

No receipt for 'com.apple.pkg.DeveloperToolsCLI' found at '/'.

gyp: No Xcode or CLT version detected!
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:351:16)
gyp ERR! stack     at ChildProcess.emit (events.js:315:20)
npm WARN deprecated core-js@2.6.11: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated request-promise-native@1.0.9: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated chokidar@2.1.8: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
No receipt for 'com.apple.pkg.CLTools_Executables' found at '/'.

No receipt for 'com.apple.pkg.DeveloperToolsCLILeo' found at '/'.

No receipt for 'com.apple.pkg.DeveloperToolsCLI' found at '/'.

gyp: No Xcode or CLT version detected!
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:351:16)
gyp ERR! stack     at ChildProcess.emit (events.js:315:20)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:276:12)

이런경우 xcode 가 문제인 경우라 다시 재설치를 해주면 되겠습니다.

 

1. Xcode 설치 경로 확인

xcode-select --print-path

변경하지 않았다면 경로는 /Library/Developer/CommandLineTools으로 나타날 것입니다.

2. Xcode 제거

sudo rm -r -f /Library/Developer/CommandLineTools

위에 명령어를 실행하면 제거가 됩니다.

3. Xcode 재설치

xcode-select --install

위에 명령어로 Xcode를 다시 설치해주시면 됩니다.

 

저 같은 경우에는 명령어로 xcode 재설치가 안되서, 애플 앱스토어에서 설치를 했습니다.

 

참고문헌

https://medium.com/flawless-app-stories/gyp-no-xcode-or-clt-version-detected-macos-catalina-anansewaa-38b536389e8d
반응형
반응형

맥에서 작업을 하다보면 화면을 나눠서 작업을 하고 싶은 순간이 있을 겁니다.

윈도우에서는 기본적으로 있는 기능이라 당연히 맥에 있을 줄 알았는데, 앱을 설치해야지 할 수 있는 기능이더군요....

 

무료로 화면분할 기능을 사용하시려면 Spectacle 이라는 앱이 있습니다.

Spectacle

가운데부터 왼쪽 및 오른쪽 화면이동, 또는 2/3 로 윈도우사이즈를 변경하면서 좌 우측으로 이동 가능합니다.

가장 좋은 점으로는 무료라는 점입니다.

 

마그넷

다음으로는 마그넷이라는 앱입니다.

3달러 정도 하는 유로앱으로 유료라는 단점이 있지만 매우 저렴해서 앱 하나정도는 구매하셔도 좋을 것 같습니다.

 

스펙타클에 비해 장점은 마우스로도 화면 분할이 가능하다는 점입니다.

스펙타클은 단축키로만 윈도우를 움직여야 하는 반면 마그넷은 추가기능으로  마우스로도 화면분할이 가능합니다.

 

윈도우에서 기본적으로 되는 기능을 앱을 설치해야한다는게 조금 번거롭지만 마그넷 앱은 맥 사용자들에게는 필수 같습니다.

 

반응형
반응형

spring boot mongodb connection 및 자동 _class 컬럼 insert 삭제 설정

몽고디비를 연결해주려면 스프링부트에서는 yml 설정에서 추가만 해도 되지만,

object 클래스를 넣어줄떄 자동으로 _class 라는 필드가 추가되게 된다.

_class 를 없애주려면 @Configuraion 으로 mongodb 세팅을 자바 코드로 설정을 해주어야 한다.

 

 

해당 내용은 스프링부트 spring-boot-stater-data-mongodb:2.3.3 RELEASE 버젼,

spring-data-mongodb:3.0.3 RELEASE 이다.

차이점은

spring-data-mongodb 2 버젼은 MongoDatabaseFactory 가 아니라 MongoDbFactory 이다.

3 버젼에서는 MongoDbFactory 가 deprecated 가 되어서 MongoDatabaseFactory 를 사용하자.

@Configuration
public class MongoDBConfig {

    @Value("${spring.data.mongodb.uri}")
    private String mongodb_uri;

    @Bean(name = "mongoTemplate1")
    public MongoTemplate mongoTemplate1()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection1");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

    @Bean(name = "mongoTemplate2")
    public MongoTemplate mongoTemplate2()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection2");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

    @Bean(name = "mongoTemplate3")
    public MongoTemplate mongoTemplate3()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection3");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

}

다음과 같이 document 가 여러개이면 document 마다 template 을 나누어서 빈을 등록해준다.

 _class 삭제방법

여기서 _class 를 없애는 방법은 위의 코드와 같이

converter.setTypeMapper(new DefaultMongoTypeMapper(null));

컨버터에 null 을 세팅을 기본으로 해주어야 한다.

 

방법은 여러가지가 있겟지만, 해당 방법이 코드량 적고 각각 document 마다 설정 가능하다는 점이 장점이다.

 

auto localhost 몽고 연결 수정

이대로만 하면 아마 spring boot 가 시작시 자동으로 localhost 27017 로 몽고디비가 연결을 시도한다.

이 점을 수정하려면 시작시에 자동으로 시작되는 class 를 제외시켜주면 된다.

@SpringBootApplication 에 exclude 에 MongoDataAutoConfiguration.class 를 추가해주자.

@SpringBootApplication(exclude = { MongoDataAutoConfiguration.class})
public class MongoApplication {

	public static void main(String[] args) {
		SpringApplication.run(MongoApplication.class, args);
	}

}

yml 파일도 설정해주자

spring:
  data:
    mongodb:
      uri: mongodb://아이디:비번@몽고디비url:27017

 

 

yml 로만 설정을 하게되면 스프링몽고디비 3 버젼에서는 로컬로만 연결이 됐다.

 

해결방법을 찾지 못해도 다음처럼 mongotemplate 을 구성한 이유도 있다.

@Value 로 설정값을 가져와서 연결하는 방법이다.

그래서 실질적으로 어플리케이션이 올라가면서 몽고디비 커넥션을 맺는방식은 아니고 빈을 생성시에 yml 에서 값을 가져와서 mongoTemplate 에 사용을 한다.

yml 에 굳이 계정정보를 넣지 않아도 되지만, 자바코드보다는 yml 에 설정값을 넣는 편이 낫다.

 

 

반응형

+ Recent posts