☕ Java

    [Java] Apache Commons Library에서의 올바른 압축 해제 방법

    최근 사내 프로젝트에서 압축 파일 해제 코드가 올바르게 처리 되고 있지 않아 컨플루언스에 올린 내용을 블로그에도 올려보겠다. 개요 특정 압축 파일을 업로드하여 자바 코드 내에서 압축 해제하는 경우 코드 동작이 정상적으로 진행되지 않는 현상 압축 대상 파일 zip, tar, tar.gz 압축 파일의 실제 포맷은? file resource.tar.gz 리눅스 계열에서 file 명령어를 통해 파일이 어떤 포맷인지 확인할 수 있다. file에 대한 포맷을 확인하는 이유는 가령 사용자가 zip으로 압축 한 뒤에 임의로 확장자를 .tar.gz로 바꾸는 경우가 있기 때문이다. 물론 이 경우에도 압축 파일로서의 동작은 잘 된다. 하지만 문제는 이 파일의 실체는 zip이다! 압축된 zip 파일을 .tar.gz로 강제로 ..

    [Kotlin] Companion Object

    클래스 없이 정의 할 수 있는 객체다. 싱글톤 역할을 한다. 클래스 내부에 정의하지만 클래스 인스턴스와 별개로 존재한다. 정적으로 접근이 가능하다.(상속 불가능) 공통 메서드인 Util Class를 대체할 수 있다. 공통 상수인 Enum 혹은 static을 관리할 수 있다. class MyClass { companion object { fun createInstance(name: String): MyClass { // 인스턴스 생성 로직 return MyClass(name) } const val VERSION = "1.0.0" } private val name: String constructor(name: String) { this.name = name } fun getName(): String { re..

    Java Stream 사용법 ( 당신의 Stream은 안녕하십니까? )

    Java 8의 Stream은 2014년에 공식적으로 등장해서 2023년인 현재 10년 째를 맞이하고 있다. 이전에도 Stream에 관한 글을 작성했었지만 이번엔 좀 더 실무적인 관점에서 설명을 해보려고 한다. 대다수 놓치고 있는 사실 Stream을 한번이라도 써본 사람은 코드가 간결해진다는 장점은 알고 있을 것이다. 하지만 Stream을 간결하게만 사용할 뿐 쉽게 놓치고 있는 부분이 하나가 있다. 그건 바로 함수형 프로그래밍의 원칙이다. 이 원칙이 무엇인지 알기 위해 일단 Stream 공식 문서를 확인해보자. Stream 공식 가이드 문서 java.util.stream (Java Platform SE 8 ) Interface Summary Interface Description BaseStream > B..

    커스텀 어노테이션과 리플렉션

    커스텀 어노테이션 Retention은 '보유'라는 뜻이다. Retention Policy(보유 정책)은 크게 Compile과 Runtime 두개로 나뉜다. Retention은 어느 영역까지 어노테이션을 유지시킬 것인지에 대한 기능이다. Retention Policy를 Compile로 설정하면 Runtime 진입 시에 해당 어노테이션이 사용되지 못하도록 클래스 파일에는 해당 어노테이션이 삭제된다. 사용자가 만드는 기능은 대부분 Runtime 에 속한다. Compile 단계에만 머무는 경우는 @Getter와 @Setter가 대표적이다. 컴파일 단계에 get, set 메소드를 만들어주고 클래스 파일에 해당 @Getter @Setter 어노테이션을 없애버리기 때문이다. @Target(ElementType.TYP..