25 Aug 2017
|
springboot
deploy
gradle
troubleshooting
로컬환경에서 gradle bootRun을 통해 멀쩡하게 돌아가던 서버가 Tomcat WAS에 올렸더니 별다른 ERROR Log도 없이 모든 페이지가 404로 떴습니다.
혹시나 싶어 deploy path에 html파일 하나 만들어놓고 접근해보니 멀쩡하게 페이지가 나오더군요.
멘붕에 빠져 이것저것 건드리다가 신규 Tomcat버전의 문제인가, 신규 SpringBoot버전의 문제인가까지 찾던 도중 catalina log에서 아래와 같은 특이한 메시지를 찾았습니다.
Info : No Spring WebApplicationInitializer types detected on classpath
(이런 중요한 정보가 INFO라니…)
WAS가 SpringBoot의 WAR파일을 인식하긴 했지만 WebApplicationInitializer를 찾지 못한 것이였는데
원인을 찾으려 또 별의 별 삽질을 하며 직접 main-class도 지정하고 구글링하니 Java Version 체크해보라고도 하고
거의 반나절을 헤메다가 원인을 찾았습니다.
SpringBoot Devtools을 사용하기 위해 dependencies에 걸어 두었는데 외부 WAS에 배포할때는 해당 설정을 다 빼고 배포하면 참조 안하겠다 싶어 providedCompile로 설정하고 application.yml에서 관련 설정을 빼고 배포했으나 이게 WAR로 배포되면서 오류를 발생시켰던 모양입니다.
해당 설정만 compile로 변경하였더니 잘 동작합니다.
// build.gradle
dependencies {
providedCompile("org.springframework.boot:spring-boot-devtools") // ( X )
compile("org.springframework.boot:spring-boot-devtools") // ( O )
}
외부 WAS에서 오류 없이 SpringBoot Container가 올라오지 않는다면 provided로 설정한 값 중 문제가 있는건 없는지 확인부터 해 보면 좋습니다.
22 Aug 2017
|
instanceof
class
간단하게 instanceof는 특정 Object가 어떤 클래스/인터페이스를 상속/구현했는지를 체크하며
Class.isAssignableFrom()은 특정 Class가 어떤 클래스/인터페이스를 상속/구현했는지 체크합니다.
// instanceof
MacPro obj = new MacPro();
if (obj instanceof Computer) {
...
}
// Class.isAssignableFrom()
if (Computer.class.isAssignableFrom(MacPro.class)) {
...
}
참고
instanceof랑 Class.isAssignableFrom(…)의 차이가 뭐죠?
18 Aug 2017
|
windows
HP 윈탭을 하나 구입했는데 테블릿이다 보니 OS가 먹는 자원을 빼면 CPU/RAM이 얼마 없습니다.
근데 그 와중에 CPU와 RAM을 쓸데없이 많이 잡아먹고 있는 녀석이 있었으니 그것은 MS에서 심어놓은 Windows Defender.
탭을 켜고 아무것도 안하고 있는데도 항상 CPU와 RAM이 거의 100%를 먹고 있어 브라우저 켜는것만으로도 버벅이고 있었습니다.
그래서 제거 하려 했더니 일반 노트북에서는 있는 Windows Defender 끄기 설정이 없어 레지스트리에서 직접 내려보기로 했습니다.
(아마 HP에서 OS심을때 설정화면을 없애버린게 아닌가 싶습니다.)
제거방법
실행창(윈도우+R)을 열어 “regedit”를 입력합니다.
레지스트리 편집창이 나오는데 아래와 같이 경로를 찾습니다.
- HKEY_LOCAL_MACHINE > SOFTWARE > Policies > Microsoft > Windows Defender

폴더를 우클릭하여 “새로만들기”를 누르고 DWORD형식의 레지스트리를 만듭니다.
이름 : DisableAntiSpyware
값 : 1
위와 같이 설정하고 재부팅하면 작업관리자 프로세스에서 Antimalware Service Executable이 사라진걸 볼 수 있습니다.
참고
Antimalware Service Executable 삭제 끄기
01 Aug 2017
|
docker
kafka
메시지큐 플랫폼중 Kafka를 Docker에 올려 사용하려고 가장 간단하고 쉬운 방법으로 할 수 있는 설치방법을 찾다가 정리합니다.
물론 Kafka 자체가 설치하고 실행하는게 간단하긴 하지만 개발하면서 Desktop을 어지르기 싫은 마음에 Docker에 올립니다.
정확한 설명은 wurstmeister/kafka-docker를 참고하세요 :)
위 이미지는 Docker kafka 이미지중 가장 많은 사람들이 쓰고 있습니다.
$ docker search kafka
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
wurstmeister/kafkva Multi-Broker Apache Kafka Image 383 [OK]
spotify/kafka A simple docker image with both Kafka and ... 217 [OK]
ches/kafka Apache Kafka. Tagged versions. JMX. Cluste... 81 [OK]
sheepkiller/kafka-manager kafka-manager 73 [OK]
confluent/kafka 26 [OK]
기본 설치
1. docker, docker-compose
Windows나 Mac에서 Docker, Docker Toolbox를 설치했을 경우 기본적으로 docker-compose도 같이 설치 됩니다.
특정 버전에서는 docker-compose가 설치되어 있지 않을수 있으니 Install Docker Compose를 참고하세요.
$ docker --version // docker version check
$ docker-compose --version // docker-compose version check
2. git
git저장소에 쓰기 쉽게 만들어놓은 compose 설정파일을 다운로드 받기 위해 설치합니다. Git download
설정 다운로드
docker-compose 설정을 사용하기 위해 다음과 같이 Git Repository에서 clone해 옵니다.
$ git clone "https://github.com/wurstmeister/kafka-docker.git"
docker-compose.yml 수정
docker-compose를 실행하기 전에 설치할 HOST 주소를 바꿔주어야 하는데 설정은 아래와 같습니다.
// docker-compose.yml
KAFKA_ADVERTISED_HOST_NAME: [[HOST주소]]
windows / docker-toolbox를 사용할 경우 docker-machine을 사용하기 때문에 아래 명령어를 통해 machine의 IP를 적어주어야 합니다.
$ docker-machine ip [machine name]
mac의 경우 그냥 로컬IP를 적어주면 됩니다.
docker-compose 실행
아래 명령어를 통해 docker-compose를 실행합니다.
위 명령어의 경우 kafka cluster를 구성하는 케이스로 단일 Broker를 사용할 경우에는 아래와 같이 사용 할 수 있습니다.
$ docker-compose -f docker-compose-single-broker.yml up -d
실행하면 자동으로 이미지를 다운받고 컨테이너를 만들어 kafka와 zookeeper를 실행해줍니다.
$ docker-compose up -d
.
.
.
Creating kafkadockergit_zookeeper_1 ...
Creating kafkadockergit_kafka_1 ...
Creating kafkadockergit_zookeeper_1
Creating kafkadockergit_zookeeper_1 ... done
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
380d9569c130 kafkadockergit_kafka "start-kafka.sh" 3 minutes ago Up 3 minutes 0.0.0.0:32769->9092/tcp kafkadockergit_kafka_1
b573f7d7c39b wurstmeister/zookeeper "/bin/sh -c '/usr/..." 3 minutes ago Up 3 minutes 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp kafkadockergit_zookeeper_1
제가 테스트 했을 때는 위 docker-compose명령어로 올릴 경우 가끔 zookeeper나 kafka모듈이 하나 죽거나 잘못 뜰떄가 있었습니다.
원인은 알지 모르겠고 각 모듈을 재시작 할 경우 정상작동함을 확인했습니다. 원인 아시는분은 댓글 부탁드려요 :)
참고
wurstmeister/kafka-docker
21 Jul 2017
|
java
lombok
log
클래스를 생성할 때마다 항상 로그를 남기기 위해 Logger 변수를 선언해야 했는데 Lombok의 @Slf4j 어노테이션을 사용하면 편하게 사용할 수 있습니다.
(lombok은 쓰면 쓸 수록 편해서 헤어나올수가 없는거 같습니다.)
@Slf4j어노테이션 사용시 변환되는 코드는 아래와 같습니다.
// source
@Slf4j
public class LogExample {
}
// generate
public class LogExample {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
}
참고
Annotation Type Slf4j