전체 글

필요 정보:  docker-compose fileversion: '3.1'services: nifi: container_name: nifi image: apache/nifi:latest restart: always environment: NIFI_WEB_HTTP_PORT: 9095 NIFI_JVM_HEAP_MAX: 8196m NIFI_WEB_PROXY_HOST: 192.168.0.5:9095 TZ: Asia/Seoul NIFI_REMOTE_INPUT_SECURE: false TNS_ADMIN: /opt/nifi/nifi-current/lib/wallet JAVA_OPTS: -Doracle.net.tns_admin=/op..
· 개발/Java
Input/outputStream, java.sql.Connection과 같이 Java에서는 사용 이후 close 메서드를 통해 직접 닫아줘야 하는 자원이 많다. 이와 관련해서 하금티 자바 과제 도중에 진짜 귀찮았던 경험이 있다. Singleon으로 DB connection을 계속 열어둔 채로 프로그램을 짜게 되면 성능 상의 이슈가 생기지 않을까? 라는 생각에 쿼리마다 커넥션 열고 statment 생성하고 ResultSet 생성하고 다 닫고... 이걸 수 차례 반복했던 경험이 있다. 물론 메서드화 하여 서비스 로직이 끝나면 열린 자원들을 전부 닫도록 하였지만, 놓치는 부분이 있을까 여러 차례 코드 확인을 했었다. 이번 아이템은 위에서 했던 내 고민을 조금 줄여주는 아이템이었다. Try-finally의 문..
· 개발/Java
Finalizer와 Cleaner 개념 우선 본인은 자바를 사용하면서 finalizer와 cleaner를 사용한 경험이 없고 개념조차 알지 못한다. 따라서 내가 해당 개념을 사용한 적이 있는지 없는지 조차 모호하기 때문에 두 개념에 대해 대략적으로 정리하고 넘어가고자 한다. Finalizer 최상의 객체인 Object에 정의되어있으며 객체가 Garbage Collection에 의해 제거될 때 실행된다. 역할은 객체가 소멸될 때 마지막으로 수행할 수 있는 작업을 정의하는 데 사용되며 주로 파일 핸들링, 네트워크 연결, 데이터 베이스 연결과 같은 시스템 리소스를 정리하는 용도로 사용된다고 한다. Cleaner Java 9에 도입된 클래스로 참조그룹에 대한 정리 작업을 정의할 수 있다고 한다. Finalize..
· 개발/Java
자기 메모리를 직접 관리하는 클래스의 메모리 누수 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) throw new EmptyStackException(); return elements[--size]; } private ..
· 개발/Java
이번 아이템에서 말하고자 하는 것은 너무나도 명료하다. 때문에 이번 포스트에서는 예제 코드를 통해 불필요한 객체 생성을 피하는 방법에 대해 알아볼 예정이다. 불필요한 객체생성 예시와 파훼 - String 참조 객체 아래 코드와 같이 비정상적으로 코드를 작성한다고 하자. 이 경우, String 인스턴스는 몇 번 만들어질까? String tmp = new String("vincent"); `tmp`라는 이름의 인스턴스 하나, "vincent"라는 데이터를 담기 위한 인스턴스 하나. 총 두 개의 인스턴스가 생성된다. 이는 당연하게도 아래와 같이 쓰는 것이 파훼...라고 하기에도 민망하지만 파훼법이다. String tmp = "vincent"; 추가로 String의 경우 같은 문자열 리터러를 사용한다면 해당 인..
· 개발/Java
사용하는 자원에 따라 동작이 달라지는 클래스 - static utility, singleton 맞춤범 검사기가 있다고 가정해보자. 그리고 해당 맞춤범 검사기는 사전에 `의존`한다. 이를 구현한 코드는 아래와 같다 // 정적 유틸리티 사용 public class SpellChecker { private static final Lexicon dictionary = ... ; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } // 싱글턴 사용 public class SpellChecker { private ..
· 개발/Java
Static method와 Static field만을 담은 클래스 이러한 방법은 사실 객체지향적이지는 않다고 한다. 어떨 때 사용할까? 기본 타입 값이나 배열 관련 method들을 모아놓는 경우 java.lang.Math와 같이 기본 타입 값을 정의하는 경우에 사용한다고 한다. 아래는 실제 Math의 코드이다. /** * java.lang.Math */ public final class Math { /** * Don't let anyone instantiate this class. */ private Math() {} /** * The {@code double} value that is closer than any other to * e, the base of the natural logarithms. ..
· 개발/Java
용어 정리 `제네릭 싱글 팩터리`: 제네릭 타입으로 설정 가능한 인스턴스를 만들어두고, 반환 시에 제네릭으로 받은 타입을 이용하여 타입을 결정 이를 통해 객체 생성 시 큰 유연성을 제공한다. 아래 예제가 이를 잘 나타내준다. public class GenericSingletonFactory{ public static final Set EMPTY_SET = new HashSet(); public static final Set emptySet(){ return (Set) Empty_SET } public static void main(String[] args){ // String 타입의 set 반환 Set set1 = GenericSingletonFactory.emptySet(); // String 타입의 ..
· 개발/Java
빌더를 제외한 객체 생성 점층적 생성자 패턴 (Telescoping constructor pattern) 객체 생성 시 생성자를 사용하여 만들 때 사용한다. 생성자마다 필요한 매개변수의 값을 점진적으로 늘려가면서 방법이며, 대략적인 코드는 아래와 같다. public Person{ private final String name; private final int age; private final String gender; public Persion(String name){ this(name) } public Persion(String name, int age){ this(name, age) } } 대신 위와 같은 코드는 큰 단점이 있다. 매개변수의 개수가 많아지면 해당 객체를 사용하는 클라이언트 입장에서의 ..
· 개발/Java
용어 정리 `static fatory method`: 생성자가 아닌, static method로 인스턴스를 생성하는 방식 // 생성자를 활용한 인스턴스 생성 public class Person{ private String name; Person(Stirng name){ this.name = name; } } public static void main (String[] args){ Person person = new Person("vincent") } // static facory method를 활용한 인스턴스 생성 public class Person{ private String name; Person(Stirng name){ } // static factory method public static Per..
minjae_cent
삽질하지 말고 정리를 하자