본문 바로가기

Old Posts/Java108

[Java] finalize() 메소드 자바의 특징 중 하나는 Garbage Collector를 이용한 메모리 공간 관리의 자동화다. 객체의 사용 여부를 JVM에서 추적하여 더 이상 사용되지 않는 객체라면 백그라운드에서 공간을 회수한다. 흥미로운 점은 GC 스레드가 객체의 공간을 회수 할 때, 객체의 finalize() 메서드를 호출해준다는 점이다. 다음 코드를 실행해보자. public class FinalizeTest { @Override protected void finalize() throws Throwable { System.out.println("finalize method is invoked"); super.finalize(); } public static void main(String[] args) throws Interrupte.. 2022. 2. 16.
[Java] 데몬 스레드(Daemon Thread) 의미와 예제 자바에서 스레드는 일반 스레드와 데몬(Daemon) 스레드로 구분할 수 있다. 일반 스레드는 보통 우리가 아는 스레드의 개념이다. 그렇다면 데몬 스레드는 어떤 스레드이며, 일반 스레드와 어떤 점이 다른지 알아보자. 데몬 스레드(Daemon Thread) 데몬 스레드(Daemon Thread)는 우선 순위가 낮은 스레드로 백그라운드에서 사용자의 애플리케이션을 보조하는 역할을 수행하는 스레드다. 대표적인 데몬 스레드로는 JVM에 생성된 객체들의 메모리 공간을 회수하는 GarbageCollection을 수행하는 스레드가 있다. 데몬 스레드가 일반 스레드와 비교해서 가장 크게 다른 점은 프로그램이 종료할 경우에 발생한다. 사용자의 애플리케이션이 종료될 때, 사용자가 생성한 모든 일반 스레드의 수행이 모두 종료되.. 2022. 2. 14.
[Java] InterruptedException이란? 자바로 코드를 작성할 때 가장 많이 고려되어야 하는 예외 중 하나가 InterruptedException이다. 스레드의 실행을 잠깐 동안 멈추기 위해 사용하는 sleep 코드를 살펴보자 try { Thread.sleep(1000); } catch (InterruptedException e) { /* Do something */ } 코드에서 단순하게 Thread.sleep() 코드만 사용하면 InterruptedException을 처리하지 않았다고 컴파일러가 에러를 발생시킨다. Thread.sleep() 같은 코드뿐만 아니라 자바 프로그램의 다양한 곳에서 InterruptedException이 발생할 수 있다. Java에서의 Interrupt 자바에서 '인터럽트(Interrupt)'는 스레드를 종료하기 위.. 2021. 12. 19.
[Java] Log4Shell 취약점 - log4j의 CVE-2021-44228 취약점 및 조치방법 지난 주말 전세계 개발자들에게서 주말 휴식을 빼앗아간 취약점이 화제다. 자바 개발자라면 누구나 이름을 들어봤을 log4j의 취약점인 'CVE-2021-44228'에 대한 이야기다. 줄여서 Log4Shell 취약점이라고도 부르는 log4j 취약점과 조치할 수 있는 대응 방법에 대해 알아보자. log4j란 log4j는 자바, 스칼라, 코틀린, 그루비 등으로 작성하는 프로그램에서 로그를 남기기 위해 사용하는 오픈소스 라이브러리다. 간편한 사용법과 편리한 기능, 빠른 성능으로 굉장히 광범위하게 쓰이고 있는 로깅 유틸리티다. 이번에 보고된 log4j 취약점이 심각하다는 이유가 바로 너무나도 광범위하게 사용되고 있기 때문이다. 문제가 되는 기능은 log4j 2.0-beta9 버전에 적용되었고, 약 8년 동안 방치되.. 2021. 12. 13.
[Maven] 메이븐 오프라인 모드 메이븐에는 '오프라인 모드(Offline mode)'라는 것이 있다. 금융망 같이 보안이 철저해야하는 곳은 오픈되어 있는 인터넷을 사용할 수 없는 경우가 많다. 프로젝트를 진행하면서 필요한 라이브러리를 빌드하는 그때그때 인터넷을 통해 다운로드하는게 제일 편하지만 인터넷을 사용할 수 없는 환경에서는 불가능하다. 이럴 때를 위해서 메이븐은 오프라인 모드라는 것을 제공한다. 필요한 라이브러리들을 미리 로컬에 다운로드해뒀다가 빌드할 때 오프라인 모드를 켜면 인터넷이 아닌 로컬에 있는 저장소에서 라이브러리들을 찾아쓰게 된다. 메이븐 오프라인 모드 준비 메이븐의 오프라인 모드를 사용하기 전에 필요한 라이브러리들을 미리 다운로드해야한다. $ mvn dependency:go-offline 메이븐의 'go-offline.. 2021. 11. 16.
[Java] Optional 사용법 및 예제 자바 8부터 Optional이라는 클래스가 지원되기 시작했다. Optional 클래스란 어떤 목적으로 사용되는지 알아보자. Java NPE 예방 자바 프로그램 코드를 작성하다보면 null 값에 대해 고려해야하는 경우가 많다. null 값을 제대로 처리하지 않으면 NPE(NullPointerException)을 만나게된다. 안정적인 실행을 위해 NPE가 발생하지 않도록 중간중간 null 체크를 해줘야하는데, 이게 코드를 여간 더럽히는게 아니다. 예를 들어보자. List items = getItems(); System.out.println(items.size()); getItems() 메소드를 통해 문자열 리스트 객체를 얻어온 다음 엘리먼트 개수를 출력하는 간단한 코드다. getItems() 메소드가 nul.. 2021. 8. 19.
[Java] 자바 가비지 컬렉션 기초(Garbage Collection Basic) 자바 개발자라면 '가비지 컬렉션(Garbage Collection)'에 대해서 고민하게 되는 순간이 온다. 토이 프로젝트나 작은 프로젝트에서는 가비지 컬렉션에 대한 관심이 적다. 가비지 컬렉터의 선택이 성능에 미치는 영향보다는 어떤 알고리즘을 사용했는지, 어떤 라이브러리를 사용하는지, 어떤 설정으로 구동하는지가 더 중요하다. 하지만 일정 규모 이상의 프로젝트를 진행하다보면 결국 가비지 컬렉터의 선택까지 고민하게 된다. 실력있는 자바 개발자라면 가비지 컬렉션의 동작에 대한 이해를 하고 자신이 구현하는 애플리케이션에 맞는 적당한 가비지 컬렉터를 선택, 설정들을 튜닝할 줄 알아야한다. 가비지 컬렉션(Garbage Collection) C언어나 C++ 같은 언어에서 메모리 관리는 프로그래머의 책임이다. 필요한 .. 2021. 8. 10.
[Java(자바)] ThreadLocal 사용법 설명과 예제 자바를 이용해 멀티 스레드 프로그래밍을 하면 성능향상을 얻을 수 있다. 하나의 스레드에서 해야할 작업들을 여러스레드로 나누어 동시에 처리하면 훨씬 빠른 시간안에 작업을 마무리할 수 있다. 하지만 멀티 스레드 프로그래밍에서 가장 고민해야할 부분은 공유 리소스에 대한 동시성 제어다. 여러 스레드가 공통으로 접근하는 변수 값을 저장하고 읽는 과정을 동기화해야 문제가 생기지 않는다. 자바는 synchronized 키워드를 이용해서 특정 메소드 혹은 코드 블럭을 동기화 시키는 방법을 제공한다. synchronized 키워드와 더불어 자바에서 제공하는 도구로 ThreadLocal이 있다. ThreadLocal은 각 스레드가 자신만 접근할 수 있는 변수로 여러 스레드가 동시에 접근할 수 있지만 각자 자기만의 공간을 .. 2021. 7. 30.
[Java] SAXParser Exception - "[Fatal Error] :1:1: Premature end of file" 예외 해결방법 자바 애플리케이션에서 SAX 파서를 이용해 XML 문서를 파싱하다가 다양한 예외를 만나게된다. 이번 포스트에서 설명할 예외는 "[Fatal Error] :1:1: Premature end of file." 혹은 "[Fatal Error] :1:1: 예기치 않은 파일의 끝입니다."라는 Exception이다. 말 그대로 SAX 파서의 입력 스트림이 예상하지 갑작스레 끝났을 경우에 발생한다. 가장 흔한 예외 케이스는 SAX 파서에 빈 문자열이 입력되면 발생한다. 다음 예제 코드르 보자. import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import.. 2021. 7. 29.