본문 바로가기

728x90

자바☕

(23)
이펙티브 자바 읽고 정리해보기 9. 아이템 9. try-finally보다는 try-with-resources를 사용하라 자바의 InputStream, OutputStream, java.sql.connection 등은 close 메서드를 통해 닫아줘야 하는 자원의 대표적인 사례로, 안전망으로 clener(finalizer)가 구현되어 있으나, 항상 기대처럼 동작하지 않는다https://cdaosldk.tistory.com/343 이펙티브 자바 읽고 정리해보기 8.아이템 8. finalizer와 cleaner(자바 8 이전 : finalizer, 8 이후 : cleaner 즉 동일) 사용을 피하라 finalizer는 오동작, 낮은 성능, 이식 문제를 야기할 수 있다. 그래서 자바 9부터는 deprecated 되었으며, cleanercdaosl..
엑셀 다운로드를 위한 엑셀 생성 로직 리팩토링 : 속도 개선 https://cdaosldk.tistory.com/344 엑셀 파일 생성 로직 구현 : Map 활용, 클래스 단위로 응용 가능1. 문제점 파악 기존 구글링을 통한 엑셀 다운로드 로직들을 살펴보면서 스터디 하던 도중, 전부 컨트롤러 단에서 구현해야하는 모든 로우를 작성한 다음, 반환하는 수고를 하는 케이스가 대부cdaosldk.tistory.com지난 구현 글에서 해당 로직을 테스트하다, 데이터 13만 개를 변환하니 속도가 진행되지 않고, 사용자의 다수 요청이 누적되어 OOM이 발생하게 되었다. 정답은 메서드 간 역할 분담! 그리고 메모리를 많이 잡아먹는 반복문 구간을 줄이고, 조건문의 실행 구간을 단순화했다public void writeExcelSheetToWorkbook(Workbook workboo..
엑셀 파일 생성 로직 구현 : Map 활용, 클래스 단위로 응용 가능 1. 문제점 파악 기존 구글링을 통한 엑셀 다운로드 로직들을 살펴보면서 스터디 하던 도중, 전부 컨트롤러 단에서 구현해야하는 모든 로우를 작성한 다음, 반환하는 수고를 하는 케이스가 대부분인 것을 알게 되었다. 2. 구현 목표 그래서 이를 서비스로 분리해 클래스의 필드 또는 맵으로 작성한 필드의 모음을 파라미터로 보내면 DB에서 해당 필드와 맞는 데이터를 매핑해 로우 단위로 작성한 로직을 개발해 봤다. 3. 코드public void writeExcelSheetToWorkbook(Workbook workbook, String sheetName, Map cellValues, int minWidth, List> dataList) { try { Sheet sheet = workbook.creat..
이펙티브 자바 읽고 정리해보기 8. 아이템 8. finalizer와 cleaner(자바 8 이전 : finalizer, 8 이후 : cleaner 즉 동일) 사용을 피하라 finalizer는 오동작, 낮은 성능, 이식 문제를 야기할 수 있다. 그래서 자바 9부터는 deprecated 되었으며, cleaner가 그 대안으로 소개된다. 하지만, cleaner도 여전히 느리고, 예측할 수 없고, 일반적으로 불필요하다C++의 destructor와는 다른 개념으로, 자바는 가비지 컬렉터가 있어 자원 회수에 프로그래머의 역할이 필요없다. 비 메모리 자원 회수를 위해서는 자바에 try-with-resources와 try-finally가 있다finalizer와 cleaner는 즉시 수행된다는 보장이 없고, 가비지 컬렉터 구현에 따라 수행속도가 가지각색이..
이펙티브 자바 읽고 정리해보기 7. 아이템 7 : 다 쓴 객체의 참조를 해제하라public class Stack { private Object[] elements; private int size = 0; private static final int DEFALUT_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 Empty..
이펙티브 자바 읽고 정리해보기 6. 아이템 6 : 불필요한 객체 생성을 피하라같은 기능의 객체를 매번 생성하는 것보다 만들어진 하나의 객체를 재사용하는 것이 더 효율적인 경우가 많다. 특히 불변 객체(아이템 17)는 언제던지 재사용이 가능하다String s = new String("bikini");이 코드를 통해 매 번 쓰이지 않는 String 인스턴스가 (극단적으로) 수백만 개 만들어질 수 있다. "bikini" 자체가 만드려는 객체와 기능이 완전히 똑같아 객체를 생성할 필요가 없지만, 생성자로 객체를 생성하게 되면 호출 시마다 새로운 객체가 만들어지는 것이다String s = "bikini";이 방식을 사용하면 String s에 새로운 String을 생성하는 것이 아니라 기존 객체를 계속 할당하므로, 같은 가상머신 안에서 똑같은 문자열..
이펙티브 자바 읽고 정리해보기 4 & 5. 아이템 4 : 인스턴스화를 막기 위해 private 생성자 활용하라java.lang.Math 클래스나 java.util.Arrays는 기본 타입 값이나 배열 관련 메서드를 모아둔 클래스로, 실무에서 이와 같이 정적 메서드와 정적 필드만 있는 클래스를 구현할 수도 있다. 또한 java.util.Collections처럼 특정 인터페이스 구현체를 생성하는 정적 메서드(팩터리)를 모아놓을 수 있다(java 8부터는 해당 메서드를 인터페이스에 넣을 수 있다). final 클래스 관련 메서드를 모아놓을 때에도 사용할 수 있다. final 클래스를 상속한 하위클래스에 메서드를 넣을 수 없다정적 멤버만 있는 유틸리티 클래스는 인스턴스로 사용하기 위한 목적이 아니지만, 생성자를 명시하지 않으면 컴파일러가 public 생..
이펙티브 자바 읽고 정리해보기 3. 아이템 3 : private 생성자나 열거 타입으로 싱글턴임을 보장하라싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 대표적인 케이스로 함수(아이템 24)같은 stateless 객체나 설계상 유일해야 하는 시스템 Component가 있다. 클래스를 싱글턴으로 만들면 클라이언트를 테스트하기 어려워질 수 있다. 타입을 인터페이스로 정의한 후 그 인터페이스를 구현해서 만든 싱글턴인 경우에만 Mock을 사용할 수 있기 때문이다싱글턴은 일반적으로 두 가지 방식으로 만든다. 모두 private 생성자를 사용하고 인스턴스 접근 수단으로는 static 멤버변수를 둔다1) public static이 final 필드인 경우public class A { public static final A Ins..

728x90