[JAVA] 배열(Array) vs ArrayList vs Vector
·
공부/JAVA
과거에는 배열(Array), ArrayList, Vector를 기본적인 연속 메모리 기반 자료구조로 많이 비교했지만,현대 Java에서 주로 사용하는 것은 배열과 ArrayList이고, Vector는 레거시로 간주된다. 이 세 가지는 모두 인덱스로 접근이 가능한 연속 메모리 기반 구조라는 공통점을 가지지만,메모리 할당 방식과 크기 관리, 동기화 여부에서 큰 차이가 있다.1. 세 가지 자료구조 한눈에 보기먼저 전체적인 특징을 간단히 정리한다. 구분배열(Array)ArrayListVector크기고정동적동적내부 구조원시 배열Object[]Object[]메모리 위치힙힙힙인덱스 접근O(1)O(1)O(1)동기화없음없음있음권장 여부제한적대부분거의 없음 2. 배열(Array)2.1 개념과 특징배열은 크기가 고정된 가장..
Redis 없이 외부 API Rate Limit 설계하기
·
개발 기록/프로젝트 - BUKAE
현재 프로젝트 BUKAE(부캐)의 서버 개발을 담당하고 있다.BUKAE는 여러 외부 API에 의존하는 구조를 가지고 있다. 그중 일부 API는 서비스의 핵심 기능과 직접적으로 연결되어 있으며, 호출 정책을 위반할 경우 단순한 오류가 아니라 서비스 전체 기능이 중단될 수 있는 리스크를 내포하고 있다. 🚨 문제 상황: 외부 API Rate Limit과 24시간 BanBUKAE에서는 상품 정보를 정확하게 조회하기 위해 외부 커머스 API를 사용하고 있다. 개발 중 API 문서를 확인하던 과정에서 다음과 같은 정책을 확인했다.분당 최대 50회 호출 가능제한 초과 시 24시간 동안 API 호출 차단이 정책은 단순히 "잠시 후 다시 시도하라"는 응답을 주는 수준이 아니었다. 한 번의 실수로 하루 동안 서비스의 핵..
[JAVA] 어노테이션과 리플렉션 원리
·
공부/JAVA
자바 개발자, 특히 스프링 부트를 사용하는 개발자라면 숨 쉬듯이 어노테이션(Annotation)을 사용한다. @Controller, @Service, @Transactional 등 골뱅이(@) 하나만 붙이면 빈(Bean)이 등록되고 트랜잭션이 관리되는 마법 같은 일들이 일어난다.하지만 많은 개발자가 어노테이션을 "그냥 붙이면 기능이 생기는 것" 정도로 이해하고 넘어간다. 도대체 이 텍스트 조각이 어떻게 코드를 변화시키는 것일까? 그리고 public @interface라는 선언은 인터페이스와 무슨 관계일까?이번 글에서는 어노테이션의 본질인 메타데이터와 인터페이스로서의 정체, 그리고 이를 작동시키는 리플렉션(Reflection)의 원리를 파헤쳐본다. 1. 어노테이션의 정체: 메타데이터사전적 의미로 어노테이션..
[Java] Record는 무엇인가?
·
공부/JAVA
Java 14에서 Preview로 등장해 Java 16에서 정식 기능으로 채택된 record는 오랜 골칫거리였던 "지저분한 보일러플레이트 코드"를 획기적으로 줄여주었다.이번 글에서는 record의 정확한 정의와 내부 동작 방식을 자세히 정리해 본다. 1. Record란 무엇인가?Record는 "데이터를 운반하는 불변(Immutable) 객체"를 아주 쉽게 생성할 수 있도록 만든 새로운 유형의 "클래스"이다.기존에 데이터 전송 객체(DTO)를 만들 때 우리는 단순히 필드 몇 개를 정의하기 위해 수십 줄의 코드를 작성해야 했다. Record는 이 문제를 해결하기 위해 탄생했다.2. 코드 비교이름과 나이를 가진 간단한 Person 객체를 만든다고 가정해 보자.기존 Class 방식필드, 생성자, Getter, ..
[Spring] STOMP, JWT 그리고 동작하지 않는 @AuthenticationPrincipal
·
개발 기록/프로젝트 - GULON
The given id must not be null 오류부터 최종 해결까지의 기록🚨 1. 문제의 시작: Unhandled exception from message handler method, The given id must not be null채팅 기능 구현 중, 클라이언트에서 메시지를 보내면 STOMP를 통해 실시간으로 통신은 되었지만, 해당 메시지를 DB에 저장하는 과정에서 오류가 발생했다. 처음 마주한 오류 로그는 다음과 같았다.최초 오류 로그:[boundChannel-13] .WebSocketAnnotationMethodMessageHandler : Unhandled exception from message handler method...org.springframework.dao.Invalid..