이펙티브 자바 - 다 쓴 객체 참조를 해제하라

다 쓴 객체 참조를 해제하라 JDK 8버전 Stack 코드 문제점 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 void ensureCapacity() { if (elements.length == size) elements = Arrays.copyOf(elements, 2 * size + 1); } } JDK 8버전에서는 현재 index를 변경해서 stack의 top을 관리하지만, pop()을 할 때 TOP의 값을 줄이기만 합니다. 이 부분에서 메모리 누수가 발생합니다. ...

December 20, 2023 · Lee WooJin

[SpringBoot] Spring Batch 이용권 만료

스프링 Batch 구조 Spring Batch는 Job, Step, Reader, Processor, Writer 구조로 이루어져 있습니다. Step 처리 방식 Step은 ItemReader를 사용해 각 아이템을 개별적으로 읽은 후 ItemProcessor에 전달하여 필요한 처리를 수행합니다. 청크 사이즈에 도달할 때까지 반복하고, 완성된 청크를 ItemWriter로 전달합니다. ItemReader ItemReader를 통해 스프링 배치가 아이템 리더에 리드 메소드를 호출하여 해당 메소드는 스텝 내에서 처리할 아이템 한 개를 반환합니다. 대량 데이터 처리 시 메모리 문제를 피하기 위해 두 가지 방식을 사용합니다: Cursor ItemReader: 단일 연결 유지 (장시간 작업 시 연결 끊김 위험) Paging ItemReader: 청크 크기 단위로 페이지를 가져옴 (안정성 우수) ItemWriter 아이템 Writer는 데이터를 쓰는데 사용하며, 개별 아이템이 아닌 Chunk 단위로 씁니다. ...

December 17, 2023 · Lee WooJin

[SpringBoot] 스프링 배치란?

Spring Batch란 일괄처리를 위한 오픈 소스 프레임워크입니다. SpringBatch는 로깅/추적, 트랜잭션 관리, 작업 처리 통계를 포함하여 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공합니다. Job 다시 시작, 건너뛰기, 리소스 관리 최적화 및 분할 기술을 통한 대용량 및 고성능 배치 작업 지원 Spring Batch 용어 Job 배치처리 과정을 하나의 단위로 만들어 놓은 객체이며, 배치처리 계층의 최상단에 위치합니다. JobInstance Job 실행의 단위를 나타냅니다. 예를 들어 1월 1일 실행과 1월 2일 실행은 각각의 JobInstance가 생성됩니다. ...

December 16, 2023 · Lee WooJin

Java 동적 프록시 (Dynamic Proxy) 이해하기

프록시의 문제점 프록시는 기존 코드에 영향을 주지 않으면서 타깃의 기능을 확장하거나 접근 방법을 제어할 수 있는 유용한 방법입니다. 하지만 데코레이터 패턴을 활용해서 부가적인 기능을 하는 코드를 클래스마다 매번 정의해야 하고, 클래스도 매번 넣어야 했습니다. 여기서 오는 코드의 중복과 다수의 클래스가 생겨났습니다. 이러한 문제점들을 해결해주는 것이 바로 동적 프록시입니다. 자바에서 동적 프록시를 사용하기 위한 클래스 Proxy InvocationHandler 서비스 로직 인터페이스 서비스 로직 구현체 부가 기능 구현체 (InvocationHandler를 구현한) Proxy 클래스를 기반으로 동적 프록시가 생성되고, 필드에 클래스 로더, 서비스 로직 인터페이스, 부가 기능 구현체를 넣어주면 됩니다. ...

November 28, 2023 · Lee WooJin

Java GC (Garbage Collection) 이해하기

GC란? 프로그램이 동적으로 할당했던 (heap 영역) 메모리 영역 중 필요 없게 된 영역을 여러 알고리즘을 통해 해제하는 것입니다. 장점 메모리 누수 방지 해제된 메모리에 접근 방지 해제한 메모리 또 해제 방지 단점 GC 작업은 순수 오버헤드 개발자는 언제 GC가 메모리를 해제하는지 모릅니다 GC 알고리즘 Reference Counting 객체에 접근할 수 있는 카운팅 넘버를 통해 현재 참조 중인지 확인하는 알고리즘 문제점: 힙 객체가 서로 참조하고 있으면 순환 참조로 GC 제거 대상에서 제외됨 ...

November 9, 2023 · Lee WooJin

HTTP/1.0, HTTP/1.1, HTTP/2의 특징과 차이점

HTTP(Hyper Text Transfer Protocol)는 7계층을 대표하는 프로토콜로 웹 서비스 통신에 사용됩니다. HTTP/1.0 HTTP/1.0은 기본적으로 한 연결당 하나의 요청을 처리하도록 설계되었습니다. 이는 RTT 증가를 불러옵니다. RTT(Round Trip Time)란? 패킷이 목적지에 도달하고 나서 다시 출발지로 돌아오기까지 걸리는 시간 (패킷 왕복 시간) RTT 증가 문제 해결 방법 매번 연결할 때마다 RTT가 증가하니 서버에 부담이 많이 가고 사용자 응답 시간이 길어졌습니다. 이를 해결하기 위해 아래의 기술을 사용했습니다: 이미지 스플리팅 코드 압축 이미지 Base64 인코딩 이미지 스플리팅 많은 이미지를 다운로드받게 되면 과부하가 걸리기 때문에, 많은 이미지가 합쳐 있는 하나의 이미지를 다운로드받고 이를 기반으로 background-image의 position을 이용하여 이미지를 표기하는 방법입니다. ...

November 3, 2023 · Lee WooJin

IP 프로토콜의 이해 - IPv4, 클래스, DHCP, NAT

IP(Internet Protocol)은 송신 호스트와 수신 호스트가 패킷 교환 네트워크에서 정보를 주고받는데 사용하는 정보의 규약이며, OSI 네트워크 계층에서 호스트의 주소지정과 패킷 분할 및 조립 기능을 담당합니다. IP 주소 체계 IPv4와 IPv6로 나뉩니다. IPv4는 32비트를 8비트 단위로 점을 찍어 표기하며, 123.45.67.89 같은 방식으로 IP를 나타내고 IPv6는 64비트를 16비트 단위로 점을 찍어 나타냅니다. 1001:db::ff00:42:8329 클래스 기반 할당 방식 IP 주소 체계는 A, B, C, D, E 다섯 개의 클래스로 구분하는 클래스 기반 할당 방식이며 네트워크 주소와 호스트 주소의 크기로 클래스를 나눕니다. ...

November 2, 2023 · Lee WooJin

Github Desktop으로 PR 전송하기까지 절차

깃 저장소의 전체 구조 회사 원격 저장소 Fork 하기 check 표시를 해제해 줘야 main 브랜치 뿐 아니라 다른 브랜치를 가져옵니다. Sync fork를 통한 최신상태 동기화 회사 원격저장소 → 개인 원격저장소 충돌을 방지하기 위한 작업 로컬 Git에 최신상태 동기화 본인의 원격저장소를 최신화 시켰다면 로컬 저장소도 fetch origin을 통해 동기화 해주세요. 작업을 시작할 때는 기능을 나타내는 branch로 변경해주세요 예시: feature/장바구니담기 큰 기능목록으로 이름을 지어주시면 좋습니다. ...

October 29, 2023 · Lee WooJin

주문내역을 내려줄 때 가격 멱등성에 대한 고민

🤔 Problem 기존 제육 1000원 제육 가격 2000원으로 인상 결제했을 때와 주문내역 불일치 메뉴 내역을 내려줄 때 현재 연결되어 있는 메뉴와 옵션을 참조하고 있습니다. 그렇다면 기존의 메뉴의 정보를 변경했다면 어떤 결과가 발생될까 생각이 들었습니다. 주문한 메뉴의 가격을 내려줄 때 메뉴의 가격을 변경하지 않았다면 1000원을 반환했을 겁니다. 하지만 나중에 물가가 오르고 사장님이 메뉴의 가격을 인상했을 때 2000원으로 올리고 손님이 주문내역을 확인하면 2000원으로 나온다는 문제점이 있었습니다. 😃 Solution 저는 이 문제를 해결하기 위해서 2가지 방법을 고안했습니다. ...

October 29, 2023 · Lee WooJin

백준 1430번: 공격 - BFS로 네트워크 에너지 전달 문제 풀이

문제 링크 백준 1430번 공격 문제 설명 해당 문제는 적이 존재하고 타워에서 사정거리 안에 든 적에게 에너지를 모두 담아 공격합니다. 만약 사정거리에 닿지 않는다면 근처 타워에게 에너지를 전달하고, 전달하는 과정에서 에너지가 반으로 줄어듭니다. 문제 조건 탑 갯수: 1 <= n <= 50 좌표: 0 <= x, y <= 1000 에너지 d: 1 <= d <= 100 사정거리 r: 1 <= r <= 500 재분배 가능 r보다 작다면 제한 내의 에너지 공유 가능 에너지 공유 시 절반만 전달 적과 거리는 r보다 작아야 함 공격 시 모든 에너지를 쏨 문제 해결 아이디어 해당 문제는 네트워크 문제와 비슷합니다. 적으로부터 연결된 타워를 방문할 때마다 에너지를 추가하는 방식을 떠올렸습니다. ...

September 16, 2023 · Lee WooJin