Today I Learned. by Rio

Custom gradle plugin

|

gradle plugin을 단독 프로젝트로 만들어 보고 사용해본 후 까먹지 않기 위해 정리한다.

우선 build.gradle에 다음과 같은 설정을 넣는다.

apply plugin: 'groovy'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

gradlePlugin {
  plugins {
    rioTask { // 사용하고자 하는 task 이름
        id = 'rio-plugin-id' // 플러그인id, 프로젝트명을 쓰면 되는듯
        implementationClass = 'com.mypackage.RioGradlePlugin'
                   // Plugin<T> 클래스를 상속받는 내가 직접 만든 클래스
    }
}

이후 프로젝트 내에 Plugin<T>를 상속받는 클래스를 생성한다. 이름과 위치는 상관없다. 예를 들어 RioPlugin이라고 가정한다.

@Override
public void apply(Project project) {
  project.getTasks().create("rioTask", RioTask.class);
}

플러그인 클래스에는 이렇게 한 메서드만 있어도 된다. Plugin<T>에서 자동으로 오버라이드 되고, 내부는 저런식으로 쓰면된다. 간단히 설명하면 이 플러그인을 쓰는 곳에서는 task를 rioTask라는 이름으로 쓰게 되고 그 구현은 RioTask라는 클래스에 만든다.

그럼 사용하는 측에서는 이 플러그인을 사용할 때 이렇게 쓰게 되겠지.

gradle rioTask

느낌이 오겠지만 RioTask라는 클래스에는 실제 task가 하는 일을 작성하는 곳이다. 이 클래스는 DefaultTask라는 클래스를 상속받고 내부에 실제 로직이 들어갈 메서드를 작성한다.

@TaskAction
public void rioTask() throws Exception {
  // 여기에 실제 로직이 들어간다.
}

실제로 만든 결과물만 보면 별로 어렵지 않게 만들 수 있다. 그런데 생각보다 리서치에도 시간이 걸렸고 삽질도 많이 했다. 안써놓으면 까먹을거 같은데 이거보면 금방 다시 만들수 있겠지.

참고한 사이트

Logback configuration in tomcat war

|

logback설정시 log file이 생기는 위치를 permission 접근 가능한 절대 경로 위치로 해주는 것이 좋다.

개발 환경에서는(특히 Windows) log file 위치를 아무곳에 떨구어도 springboot가 올라가면서 알아서 생성해 주는데 linux환경에서 경로 접근 권한이 없으면 tomcat으로 띄워진 서버에 접속해도 별다른 반응 없이 브라우저에 연결 지연만 떠서 매우 고생ㅠㅠ

이 경우 application.yml 파일 내에 local(윈도우) 환경과 서버(리눅스) 환경을 나누어 설정 해주는 것이 좋다. 우선 logback-local.xml, logback-production.xml 등 두 가지 버전으로 log file을 생성해주는 설정을 만든 후 application.yml에 들어가서 기본 설정 맨 밑에 spring.profiles 옵션을 이용하여 프로파일을 분리해준다.

tomcat 설정에서도 active profile 설정이 필요한데, 아래와 같이 파일을 만들면 tomcat이 시작할 때 지정된 옵션으로 환경변수를 넣어 실행한다.

/usr/share/tomcat8/bin/setenv.sh 파일 생성(또는 편집)
export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod"

이후 tomcat을 재시작한다.

sudo service tomcat8 restart
참고) tomcat 서비스 로그 확인
sudo tail -200f /usr/share/tomcat8/logs/catalina.out

Boot tomcat server with 80 port in linux

|

리눅스의 경우 80포트로 서버를 띄우기 위해서는 root계정(sudo) 명령을 사용해야 한다. 그래서 서비스를 단독으로 실행하지 않는 경우 띄우기가 힘들어서 tomcat에서 내부적으로 실행하는 war파일은 80포트를 이용하기 힘들다.

그래서 다음의 방법을 사용한다. 우선 tomcat에서 기본적으로 사용하는 8080포트를 서버로 띄운 후, 외부에서 들어오는 80포트를 리눅스 내부적으로 리다이렉트로 8080포트로 연결 시켜주는 것. 다시말해 실제 서버는 8080포트에 떠있고 외부에서 80포트로 접속을 하면 8080포트로 알아서 연결 해준다.

다음의 명령어를 통해 기본적인 tomcat 8080포트를 80포트에 연결할 수 있다.

sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo service iptables save