분류 전체보기 55

자바의 Garbage Collection 이해와 성능 최적화 방법

1. Garbage Collection이란?Garbage Collection(GC)는 동적으로 할당된 메모리 중 필요하지 않은 부분을 해제하는 JVM의 기능입니다.더 이상 사용하지 않는 객체의 메모리 자원을 해제하여 메모리의 여유 공간을 만들게 됩니다.객체는 메모리 중 힙 영역에 할당되고, 할당된 객체 즉, 인스턴스가 더 이상 참조되지 않는다면 garbage로 간주되며, 이를 수집하여 메모리를 해제하는 역할이 바로 GC의 역할입니다.이와 같은 자동 메모리 관리는 프로그래머의 부담을 줄이고, 메모리 누수나 불필요한 메모리 사용 등의 문제를 방지하는데 큰 도움이 됩니다.2. GC의 동작 원리GC의 기본적인 동작 원리는 'Mark and Sweep' 알고리즘에 기반합니다. Mark 단계에서는 Root로부터 시..

Java & Kotlin 2023.07.30

Spring Boot AutoConfiguration: 작동 원리와 성능 최적화 방법

AutoConfiguration을 사용하는 Class는 다음과 같은 것들이 있습니다.DataSource, TransactionManager, jdbcTemplate 등우리가 흔이 사용하는 것들이죠? 이 글에서는 AutoConfiguration의 작동 원리에 대해 배우고, 이를 사용해 개발 과정을 어떻게 최적화할 수 있는지에 대해 다루겠습니다. 글 순서AutoConfiguration 등록 순서AutoConfiguration 작동 원리AutoConfiguration 활용하기(라이브러리 제작)AutoConfiguration 성능 최적화AutoConfiguration 사용 시 주의사항1. AutoConfiguration 등록 순서우선, Spring Boot는 애플리케이션 시작 시 @ComponentScan이 실..

Spring 2023.07.30

Offline 개발을 위한 .jar 파일 변환 및 활용 방법

offline 개발을 할 때 사용하기 좋은 기능입니다.현재 사용중인 라이브러리들을 모두 .jar 파일로 변환하는 기능이에요. build.gradle 파일에서 아래 코드를 넣어놓고 실행해주시면 task copyDependencies(type: Copy) { from configurations.runtimeClasspath into 'offline-libs'} {project root}/offline-libs안에 사용중인 library들이 다운로드 됩니다. 사용하시려면 원하는 저장소에 넣어놓고 사용하시거나, {project root}/libs/ 라는 디렉토리를 생성해서 그 안에 .jar파일을 넣고build.gradle에 libs dir에 있는 .jar파일을 implementation한다고 적어주시..

Maven & Gradle 2023.07.26

자바 빌더 패턴: 객체 생성

빌더 패턴은 객체 생성을 단순화하고 유연성을 높여주는 디자인 패턴입니다. Builder 패턴 장점가독성과 유지보수성 향상: 빌더를 사용하면 객체를 생성하는 코드가 명확해지고 가독성이 향상됩니다. 또한, 새로운 속성을 추가하거나 수정할 때에도 해당 빌더만 수정하면 되므로 유지보수성이 더 높아집니다.선택적 매개변수 처리: 객체에 선택적으로 값을 설정해야 하는 경우 빌더 패턴은 편리합니다. 모든 매개변수를 단일 생성자에 전달하는 것보다 빌더를 통해 원하는 속성만 설정할 수 있기 때문입니다.불변성과 불변 객체 생성: 빌더를 사용하면 불변 객체(Immutable Object)를 쉽게 생성할 수 있습니다. 불변 객체는 여러 스레드에서 안전하며, 객체의 상태가 변경되는 것을 방지하는데 도움을 줍니다.Builder 패..

Architecture 2023.07.22

자바 데코레이터 패턴과 람다 예외 처리: 코드 가독성을 높이는 방법

우선 간단한 예제로 시작하겠습니다. 람다속 예외처리는 다음과 같이 처리합니다.User라는 객체 리스트를 json String으로 변환하는 로직으로 try-catch문 때문에 코드가 복잡해졌습니다. private static final ObjectMapper objectMapper = new ObjectMapper(); public static void main(String[] args) { List users = findUsers(); // JsonProcessingException List jsonList = users.stream().map(user -> { try { return objectMapper.w..

Architecture 2023.07.14

스프링 MVC에서 커스텀 ArgumentResolver로 코드 중복 줄이기: @UserCache 구현 예제

소스코드: GitHub - youseonghyeon/argument-resolverContribute to youseonghyeon/argument-resolver development by creating an account on GitHub.github.com ArgumentResolver를 이용해서 Controller 파라미터 어노테이션을 만들어보겠습니다 !! 1. 사용 목적컨트롤러(Controller)에서 인증 정보나 헤더 정보를 활용해야 할 때가 종종 있습니다. 예를 들어, 쿠키(cookie)에 저장된 세션 ID를 이용하여 사용자 정보를 가져오는 경우를 생각해보겠습니다.기존 방식으로는 다음과 같이 세션 ID를 이용하여 사용자 정보를 가져오는 코드를 작성할 수 있습니다. @GetMapping..

Spring 2023.07.13

Lock과 Double Check Lock: 동시성 문제 해결을 위한 효율적 패턴

Lock을 사용하는 이유는 여러 Thread가 하나의 메서드에 동시 접근했을 때 발생할 수 있는 동시성 문제를 해결하기 위해 사용합니다. 예를 들어 private int count = 0; public void addCount() { count = count + 1; }이러한 로직이 있으며 아래 순서대로 쓰레드 2개가 해당 메서드를 호출합니다.[Thread-1] A 쓰레드가 addCount()에 접근하여 count:0 에 1을 더합니다.[Thread-2] B 쓰레드가 addCount()에 접근하여 count:0 에 1을 더합니다.[Thread-1] A 쓰레드가 0+1 의 결과값인 1을 count에 입력합니다.[Thread-2] B 쓰레드가 0+1 의 결과값인 1을 count에..

Java & Kotlin 2023.07.11

Java Functional Interface로 API 테스트 모듈 간결하게 만들기: 적용 사례와 코드 개선

회사 API 테스트 모듈을 개발하다가 Functional Interface의 좋은 예가 있어서, 이를 통해 개발된 모듈이 어떻게 더욱 간결하고 효과적이게 작성될 수 있었는지를 공유하고자 합니다. 먼저, Functional Interface는 Java8에 도입된 인터페이스로 단 하나의 메서드만을 가지는 인터페이스를 의미합니다.쉽게말해 인터페이스에 메서드가 하나만 있으면 Functional Interface 이죠. test() 메서드를 만들어서 점진적으로 기능을 추가해보겠습니다. 우선 응답 결과가 성공인지 실패인지 확인하는 모듈을 보시죠.protected static boolean test(Call call) { try (Response response = call.execute()) { ..

Java & Kotlin 2023.07.11

Stack Overflow Error 발생 원인과 해결 방법: 재귀 호출 피하기

Stack overflow error는 함수를 재귀 호출하거나 순환 참조하거나, 너무 많은 메소드가 실행되어 제한된 스택 메모리 용량을 초과할 경우 발생합니다. 아래는 에러 발생 예시입니다.public class StackOverflowDemo { public static void recursiveMethod() { recursiveMethod(); } public static void main(String[] args) { recursiveMethod(); }}하나의 메서드를 호출하면 하나의 스택이 쌓입니다.이게 반복되어 쌓이면 StackOverflowError가 발생합니다. 에러를 해결하기 위해 '재귀', '순환 참조'로직은 가급적 피하고, 불가피하게 사..

Java & Kotlin 2023.05.15

Java에서 제공해주는 Functional Interface

목차FunctionSupplierConsumerPredicateCustom Functional Interface자바에서 제공해주는 Functional 인터페이스중 가장 많이 사용되는 4가지 인터페이스를 알아보겠습니다.1. FunctionI : input typeO : output typeI 라는 입력을 받아서 O라는 출력을 낸다. 라는 인터페이스입니다.사용법은 아래와 같습니다. Function function = (i) -> "[" + i + "]"; String result = function.apply(3); System.out.println("result = " + result);결과 : result = [3] 2. SupplierO : output typeFunction과는 다르게..

Java & Kotlin 2023.04.30