[Java] Reflection
·
java
개요Reflection은 런타임 환경에서 클래스, 생성자, 필드, 메서드, Annotation 등을 동적으로 조회하고 조작할 수 있게 도와주는 기술입니다. 이를 통해 컴파일 시점이 아닌 런타임 시점에 객체를 생성하거나 필드에 접근하고 메서드를 호출하는 것이 가능하며, Spring에서는 Dependency Injection, Bean 생성, Anntation 처리 등을 위해 Reflection을 적극적으로 활용합니다. 해당 글에서는 Reflection을 사용하는 이유와 주요 기능들을 예제와 함께 다뤄보도록 하겠습니다. Reflection이란앞서 말한 것처럼, Reflection은 런타임 환경에서 클래스, 생성자, 필드, 메서드, Annotation 등을 동적으로 조회하고 조작할 수 있게 도와주는 Java..
[Spring] IoC와 DI
·
spring, jpa
개요IoC(Inversion of Control)과 DI(Dependency Injection)은 Spring에서 핵심이 되는 개념입니다. IoC는 객체의 생성과 생명주기 관리의 제어권을 개발자가 아닌 외부에 일임하는 것이고, DI는 객체가 포함하는 의존 객체를 직접 생성하지 않고 외부로부터 주입받는 방식을 의미합니다. 따라서 DI는 IoC를 구현하는 대표적인 방법이며 이에 대한 내용을 해당 글에서 정리해보겠습니다. DI(Dependency Injection)A라는 클래스가 B라는 클래스를 사용할 때, A는 B에 의존한다고 표현합니다. DI는 이때 A가 B를 직접 생성하는 것이 아니라, 외부에서 생성된 B를 주입받아 사용하는 것을 의미합니다. DI가 적용된 코드와 그렇지 않은 코드의 예시는 아래와 같습..
[Algorithm] TokenBucket vs LeakyBucket
·
algorithm
개요업무 중 외부 API를 연동하는 작업을 진행하면서 Rate Limit(초당 요청 제한)을 제어해야하는 상황을 마주했습니다. 작업 흐름은 다음과 같았습니다.1. 외부 API로 목록 조회 요청을 보낸다.2. 목록에 포함된 각 요소에 대해 개별 상세 조회 요청을 보낸다. 이러한 경우 목록 조회 결과가 외부 API 서버에서 제한하는 n건을 초과하는 경우, "429, Too Many Requests" 에러가 발생할 가능성이 존재했습니다. 따라서 요청을 버리지 않으면서도, 초당 n건 이하로 요청을 안정적으로 처리하는 제어 방식이 필요했고, 이 과정에서 Token Bucket과 Leaky Bucket 알고리즘을 비교하게 되었습니다. Token Bucket AlgorithmToken Bucket 알고리즘은 토큰을..
[Network] IP Address
·
network
개요인터넷에 연결된 모든 장치는 서로 통신하기 위해 고유한 주소를 가지고 있습니다. 우리가 일상에서 웹사이트에 접속하거나, 서버와 데이터를 주고받을 수 있는 이유가 바로 IP(Internet Protocol) 주소 덕분입니다. IP 주소는 네트워크 상에서 각 장치를 식별하고, 데이터가 어디로 가야하는지를 알려주는 역할을 합니다. 쉽게 말해, 인터넷 기반의 "집주소"라고 생각하면 됩니다. IP 주소는 크게 IPv4와 IPv6 두 가지 형식으로 나뉘며, 각각의 형식과 특징은 뒤에서 자세히 살펴보겠습니다. 또한, IP 주소의 중요 개념인 클래스, 서브넷, 공인 IP와 사설 IP, NAT 등을 함께 다뤄보도록 하겠습니다. IPv4 주소 체계IPv4(Internet Protocol version 4)는 현재 인..
[Java] Servlet
·
java
개요Servlet은 자바로 개발된 웹 애플리케이션에서 클라이언트의 HTTP 요청에 대해 적절한 동작을 수행하고 응답을 작성하도록 설계된 자바 인터페이스입니다. 검색해보면 Servlet에 대해 대부분 이와 같이 정의합니다. 하지만, 요청에 대해 적절한 동작을 수행하고 응답한다라는 정의는 어딜가도 흔히 볼 수 있는 정의입니다. 실제로 오라클에서도 아래와 같이 Servlet을 정의합니다.What Is a Servlet?A servlet is a Java programming language class that is used to extend the capabilities of servers that host applications accessed by means of a request-response prog..
[Git] 특정 Commit 기준 Branch 생성
·
git
Commit 해시값 확인Commit을 기준으로 Branch를 생성하기 위해서 먼저 Commit의 해시값을 알아야 합니다. 아래 명령어를 통해 Commit 내역을 확인하고 해시값을 확인할 수 있습니다.$ git log Branch 생성아래 명령어를 사용해 특정 Commit을 기준으로 Branch를 생성할 수 있습니다. 생성한 Branch는 로컬 환경에만 반영되기 때문에, 원격 Branch에도 같이 반영해줘야 합니다.$ git checkout -b $ git push --set-upstream origin
[Array] 배열 회전하기
·
algorithm
1차원 배열 회전하기/** * Rotate 1-dimensional Array * Time complexity: O(n) * Space complexity: O(1) * */public class Rotate { private static final Logger logger = Logger.getLogger(Rotate.class.getName()); public static void main(String[] args) { int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int len = nums.length; int k = 12 % len; /* rotate right */ rotate(nums, 0,..
[Spring] 엑셀파일 다운로드 기능 구현
·
spring, jpa
개요최근 새로 개발하는 서비스에서 사용자별 정산내역을 엑셀파일로 다운로드할 수 있는 기능을 담당해 개발하게 되었다. 서치를 좀 해보니 "POI" 이라는 아파치 라이브러리를 이용해 엑셀파일을 Java에서 구성할 수 있다는 것을 알 수 있었다. 처음에는 정산내역에서 제공해야하는 데이터 양식에 맞춰 하드코딩한 메서드를 구현하려 했으나, 정산내역 이외의 도메인에서도 엑셀파일을 다운로드 해야하는 이슈가 있었고 유틸리티 클래스를 만들어 전달받는 리스트에 동적으로 대응할 수 있는 메서드를 만들고자 하는 욕심이 생겼다. 본 글에서 그 과정과 배운 내용들을 기록해두고자 한다. 아파치 POI 라이브러리Apache POI는 Apache에서 만든 라이브러리로 MS오피스(엑셀, 워드 등) 파일을 자바 언어로 읽고 쓰는 기..
[Sort] 합병 정렬
·
algorithm
합병 정렬 - MergeSort합병(병합) 정렬은 문제를 분할하고 분할한 문제를 다시 합치는 과정에서 정렬을 수행하는 알고리즘이며 분할 정복(Divide and Conquer) 알고리즘을 기반으로 두고 있다. 시간복잡도는 모든 상황에서 O(nlog(n))의 시간복잡도를 가진다. 합병 정렬은 문제 분할 후 데이터를 비교하면서 찾기 때문에 비교 정렬이며, 정렬의 대상이 되는 데이터 외에 추가적인 공간을 필요로 하기 때문에 제자리 정렬이 아니다.  예제코드public class MergeSort { private static final Logger logger = Logger.getLogger(MergeSort.class.getName()); private static int[] arr; p..