서버환경 이슈 분석을위한 간단한 Java 실행파일
1) 고갱님 서버에서 어떤 기능을 사용하면 오류가 납니다.
2) 그런데 개발자 PC에서는 오류가 안납니다.
3) 우리 고갱님은 서버에 방화벽 정책 같은것도 없고
OS계정 정보도 다 공유해 주시면서 어떻게든
문제만 빨리 해결해주기를 원하십니다.
4) 이런경우 보통 설정이나 환경 문제이기 때문에
코드 분석을 통해 고갱님 서버에서만 발생할 수 있는 문제를
개발자가 유추해서 예외처리를 합니다.
5) 코드수정 후 수정한 내용이 잘 동작하는지 확인해보고 싶은데
고갱님 Live 서버에 반영하자니 서버를 내렸다 올려야 하고
추측을 통해 수정 작업을 했으니 혹시라도 추측이 틀렸다면
잘못된 부분을 다시 찾아 위에 했던짓을 반복해야 하기 때문에
부담이 될 수밖에 없습니다.
이런경우 저는 부담없이 이슈 트래킹을 하기 위해
빠르게 실행해볼 수 있는 JAVA App를 미리 만들어놓고
문제로 예상되는 부분의 코드를 넣어서 빌드한후
고갱님 서버에 파일을 올려 로그를 찍어가며 이슈를 분석 합니다.
다음은 제가 활용하는 JAVA App를 만드는 과정을 설명 합니다.
아래와 같은 조건으로 간편하게 실행할 수 있는 JAR 파일을 만드는 것이 목적 입니다.
java -jar {파일명} 명령어로 실행
main class 입력은 생략할 수 있도록 처리
jar파일 하나에 참조되는 오픈소스들을 모두 포함
Maven 프로젝트 생성
거부감 없이 친숙한 Maven quickstart 프로젝트를 하나 생성 합니다.
적당한 정보를 입력하고
pom.xml 작성
pom.xml을 정당히 수정해줍니다.
편하게 로그를 찍기위해 logback을 참조 하였습니다.
이 프로젝트에서 참조하는 모든 라이브러리를 재패키지하여 하나의 JAR 파일에 모이도록
maven-shade-plugin을 사용하였고, 프로젝트 생성시 자동생성된 App 클래스를 메인클래스로 지정하였습니다.
이렇게하면 java -jar 실행시 메인클래스 입력이 필요 없습니다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>issuetracker</artifactId>
<version>1.0.0.0</version>
<packaging>jar</packaging>
<name>issuetracker</name>
<url>http://maven.apache.org</url>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.plugin.version>3.8.0</maven.compiler.plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>${project.groupId}.${project.artifactId}.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
logback.xml 생성
로그설정을 위한 logback.xml이 들어갈 소스폴더를 생성합니다.
logback.xml 에 적당히 설정 내용을 입력 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<timestamp key="date" datePattern="yyyyMMdd" />
<timestamp key="year" datePattern="YYYY" />
<timestamp key="month" datePattern="MM" />
<timestamp key="day" datePattern="dd" />
<!-- 콘솔로 로그를 남기는 설정 -->
<appender name="console"
class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%t] [%c]%m%n</Pattern>
</encoder>
</appender>
<!-- 파일로 로그를 남기는 설정 -->
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 저장경로/파일명 -->
<file>log/${year}-${month}-${date}.log</file>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%t] [%c] %m%n</Pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<!-- 파일명을 .zip .tz로 하는경우 자동으로 압축된다 -->
<fileNamePattern>log/${year}-${month}-${date}_%i.log.zip
</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>30MB</maxFileSize>
</triggeringPolicy>
</appender>
<root level="debug">
<appender-ref ref="file" />
<appender-ref ref="console" />
</root>
</configuration>
프로젝트 패키징
준비가 다 됐습니다.
Maven install을 통해 jar파일을 생성해 봅니다.
영어영어 블라블라를 통해 플러그인도 잘 동작했고 jar파일도 잘 만들어졌다
라고 이클립스가 말해줍니다.
JAR파일 까보기
생성된 jar파일을 압축 프로그램을 통해 열어보면 (다들 아시겠지만 jar 파일은 압축파일입니다.)
이 프로젝트에서 코딩된 com.study.issuetracker 패키지 외에도
참조된 모든 패키지가 같이 들어있는것을 볼 수 있습니다.
이렇게 패키징하면 참조한 오픈소스 lib들을 같이 배포할 필요가 없습니다.
테스트 코드 작성
여기에서는 slf4j를 이용하여 로그를 찍어보는것으로 테스트코드를 대체하겠습니다.
이슈 발생시 앞으로는 이 클래스를 시작점으로 상황에 맞게 로직을 전개해 나가면 됩니다.
package com.study.issuetracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Hello world!
*
*/
public class App
{
static Logger log = LoggerFactory.getLogger(App.class);
public static void main( String[] args )
{
App app = new App();
app.testFunction("첫번째");
}
private void testFunction(String message) {
log.info("이것은 {} 테스트 입니다.", message);
}
}
실행결과
[2023-05-09 16:24:06] [INFO] [main] [com.study.issuetracker.App]이것은 첫번째 테스트 입니다.
서버 테스트
App를 제작한 환경과 상관없는 서버에 파일을 올려서
잘 동작하는지 확인 해 봅니다.
정상적으로 실행되고 log도 생성하는 것을 볼 수 있습니다.
'프로그래밍' 카테고리의 다른 글
ShellScript하나로 터미널, FTP 둘다 연결하기 + PowerShell (0) | 2023.04.11 |
---|---|
SSL 인증서 변환 (0) | 2023.04.04 |