Java 개발 팁 모음 - 유틸리티와 디버깅
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:
- Run -> Edit Configurations
- Remote JVM Debug 추가
- Host와 Port 설정
- 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> -> <script>
// HTML 언이스케이프
String unescaped = StringEscapeUtils.unescapeHtml(text);
// <script> -> <script>
Java 자체 기능 사용 (제한적)
// 기본적인 이스케이프만 가능
String escaped = text
.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
.replace("\"", """)
.replace("'", "'");
임시 파일 생성
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) |
Comments