AtomicInteger를 활용한 파일 저장 순서 동기화 문제 해결 📌 서론 멀티스레드 환경에서 동기화 문제는 개발자에게 항상 도전적인 문제 중 하나다. 특히, 파일 업로드 기능을 구현할 때 여러 파일을 순차적으로 저장하려고 할 때, 동일한 순서 값이 중복되어 발생하는 문제는 더욱 복잡하다. 이 글에서는 Java의 AtomicInteger 클래스를 사용하여 이러한 동기화 문제를 어떻게 해결했는지 공유하고자 한다. 문제 상황 Spring Boot와 AWS S3를 사용하여 파일을 업로드하고 관리하는 레시피 관리 시스템을 개발 중이었다. 각 레시피에 여러 이미지 파일을 첨부할 수 있으며, 각 파일은 순서대로 저장되어야 했다. 그러나 여러 파일을 동시에 업로드할 때, 모든 파일의 순서(fileOrder)가 동일..
코드 최적화를 위한 매직 상수 사용법: 이점과 대안적 관리 방법 📌 서론 프로젝트를 개발하면서 매직 상수를 사용하는 일이 많이 있었다. 많은 경우에 final 키워드의 사용은 이해가 가지만, static 키워드까지 함께 사용하는 이유에 대해서는 궁금증이 생겼다. 이에 따라, 매직 상수를 활용하는 실제 사례와 final 그리고 static의 사용 목적을 탐구하고 정리해 보기로 했다. 이 글은 그러한 고민과 탐색의 결과를 담은 것으로, 매직 상수의 사용 이유와 그것이 개발에 미치는 영향을 분석해 봤다. 1. 매직 상수(Magic Constant)란? 매직 상수는 소스 코드 내에서 고정된 값을 가진 상수로, 이 값은 프로그램의 실행 동안 변경되지 않는다. 이러한 상수들은 주로 숫자나 문자열 형태로 나타나며, ..
JAVA Interface에서 접근 제한자 public과 private 활용하기 이전 회사에서 개발하면서 인터페이스를 사용할 때, 어떤 메소드는 public 접근 제한자를 명시하고, 어떤 메소드는 접근 제한자를 사용하지 않은 추상 메소드가 있었다. 인터페이스를 사용하면서 그 차이를 잘 알지 못했기 때문에 이 글에서 접근 제한자가 인터페이스 내에서 어떻게 사용되며, 이러한 사용이 어떤 의미를 가지는지 정리해봤다. 자바 인터페이스의 메소드 유형자바 인터페이스는 코드의 유연성과 재사용성을 높이는 핵심적인 요소이다. 자바 8 이전과 이후의 버전에서 인터페이스의 역할과 구조는 중요한 변화를 겪었다. 자바 인터페이스는 소프트웨어 설계에서 중요한 역할을 수행한다. 특히, 접근 제한자의 사용은 인터페이스의 구..
람다 표현식에서 final 변수나 effectively final 변수를 사용해야 하는 이유 Java에서 람다 함수를 사용할 때 final 변수 또는 effectively final 변수를 사용해야 하는 이유에 대해서 알아보자. 자바에서 람다 함수를 사용할 때 'final' 변수 또는 effectively final 변수를 사용하는 이유는 자바의 클로저(closure) 구현과 관련이 있다. 클로저란 함수가 정의될 때의 스코프에 있는 변수들을 기억하고, 함수가 실행될 때 이러한 변수들에 접근할 수 있는 기능을 말한다. 일단 final 변수와 effectively final 변수의 개념부터 이해하자. final 변수와 effectively final 변수가 무엇인가 자바에서 'effectively final..
자바 리플렉션의 기초 리플렉션의 정의 자바 리플렉션은 컴파일 시점에 알 수 없는 클래스나 메서드, 필드 등에 대한 정보를 얻거나, 그 정보를 사용하여 객체를 생성하거나, 메서드를 호출하거나, 필드에 값을 설정하거나 하는 등의 작업을 할 수 있는 기능이다. 마치 거울을 통해 자신의 모습을 비추어 보는 것처럼, 객체의 내부 구조를 살펴볼 수 있다는 의미에서 "리플렉션(reflection)"이라는 이름이 붙여졌다. 리플렉션을 사용하면 다음과 같은 작업을 수행할 수 있다. 클래스 이름, 상위 클래스, 인터페이스, 생성자, 메소드, 필드 등의 정보를 얻을 수 있다. 객체를 생성하거나, 변수의 값을 변경하거나, 메소드를 호출할 수 있다. 리플렉션의 사용 예: 리플렉션은 다양한 용도로 사용될 수 있다. 다음은 몇 가..
자바와 스프링, 그리고 JPA에서의 프록시 객체 이해하기 1. 프록시의 소개 프록시 객체는 자바 프로그래밍 패러다임 내에서 매우 중요한 개념이다. 여러분이 객체 지향 프로그래밍을 배우면서 '대리인' 또는 '중개자'와 같은 역할을 하는 구조를 만났을 것이다. 프록시 객체는 바로 이 역할을 수행한다. 이 글에서는 프록시 객체가 무엇이고, 자바와 스프링, 그리고 JPA에서 어떻게 사용되는지를 한번 설명하겠다. 2. 자바에서의 프록시 객체 자바에서 프록시 객체는 실제 객체를 대신하여 클라이언트의 요청을 처리한다. 이는 주로 원격 객체나 비용이 많이 드는 객체 생성을 대신하거나, 보안상의 이유로 직접적인 객체 접근을 제한할 때 사용된다. 아래는 예시 코드들이다. Image 인터페이스 public interface..