Java 개발 팁 모음

Java 개발 시 유용한 다양한 팁들을 모았습니다.

원격 디버깅 (Remote Debug)

운영 서버나 원격 환경에서 실행 중인 Java 애플리케이션을 디버깅할 수 있습니다.

JVM 옵션 설정

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8080 -jar myapp.jar

옵션 설명:

  • transport=dt_socket: 소켓 통신 사용
  • server=y: 디버거 연결을 기다림
  • suspend=n: 디버거 연결 없이 바로 시작 (y면 디버거 연결까지 대기)
  • address=8080: 디버그 포트

IDE에서 연결

IntelliJ IDEA:

  1. Run -> Edit Configurations
  2. Remote JVM Debug 추가
  3. Host와 Port 설정
  4. Debug 실행

시스템 명령 실행

Java에서 외부 시스템 명령을 실행할 수 있습니다.

Process p = Runtime.getRuntime().exec("ps -ef");

명령 결과 읽기

Process process = Runtime.getRuntime().exec("ls -la");

try (BufferedReader reader = new BufferedReader(
        new InputStreamReader(process.getInputStream()))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}

int exitCode = process.waitFor();

ProcessBuilder 사용 (권장)

ProcessBuilder pb = new ProcessBuilder("ls", "-la", "/home");
pb.redirectErrorStream(true);  // stderr를 stdout으로 병합

Process process = pb.start();
// ...

시간대 (TimeZone) 처리

현재 시간대 오프셋 가져오기

TimeZone defaultTimeZone = TimeZone.getDefault();
long localTime = utc + defaultTimeZone.getRawOffset();

Java 8+ LocalDateTime 사용

ZoneId zone = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.now(zone);
ZoneOffset offset = zdt.getOffset();

// UTC로 변환
Instant instant = zdt.toInstant();

HTML 이스케이프

HTML 특수문자를 이스케이프하거나 언이스케이프할 수 있습니다.

Apache Commons Lang

// Gradle
implementation 'commons-lang:commons-lang:2.6'
// HTML 이스케이프
String escaped = StringEscapeUtils.escapeHtml(text);
// <script> -> &lt;script&gt;

// HTML 언이스케이프
String unescaped = StringEscapeUtils.unescapeHtml(text);
// &lt;script&gt; -> <script>

Java 자체 기능 사용 (제한적)

// 기본적인 이스케이프만 가능
String escaped = text
    .replace("&", "&amp;")
    .replace("<", "&lt;")
    .replace(">", "&gt;")
    .replace("\"", "&quot;")
    .replace("'", "&#x27;");

임시 파일 생성

File tempFile = File.createTempFile("prefix-", ".zip");
// 결과: prefix-12312124.zip (유니크한 숫자가 붙음)

자동 삭제

File tempFile = File.createTempFile("temp", ".txt");
tempFile.deleteOnExit();  // JVM 종료 시 자동 삭제

Java 7+ NIO 사용

Path tempFile = Files.createTempFile("prefix", ".suffix");
Path tempDir = Files.createTempDirectory("prefix");

Double과 BigDecimal

double 타입은 부동소수점 문제가 있습니다.

// 문제 있는 코드
double d = 0.1;
BigDecimal bd = new BigDecimal(d);  // 0.1000000000000000055511151231257827021181583404541015625

// 올바른 방법
BigDecimal bd = new BigDecimal("0.1");  // 정확히 0.1
BigDecimal bd = BigDecimal.valueOf(0.1);  // 문자열 변환 후 생성

참고: BigDecimal(double) JavaDoc

JavaDoc 작성

링크 태그

/**
 * {@link SomeClass} - 코드 스타일 링크
 * {@link #methodName()} - 현재 클래스의 메서드
 * {@linkplain SomeClass 일반 텍스트 링크} - 일반 텍스트 스타일
 */

팁 요약

기능 방법
원격 디버깅 jdwp 에이전트 옵션
시스템 명령 ProcessBuilder
시간대 ZonedDateTime
HTML 이스케이프 StringEscapeUtils
임시 파일 Files.createTempFile
정확한 소수 BigDecimal(String)