분류 전체보기
message_en_US.properties 파일을 찾지 못하는 에러 발생 회고
다국어를 못찾는 에러 자바에서 new Location("en_US") 등으로 로케일 설정을 했을 때 message_en_US.properties 파일을 정상적으로 찾지 못했다. 대신 message_en_us.properties 파일을 찾아냈다. 아래 원인을 보면 알겠지만, 대소문자 일반화에 대해서 Locale.defaultLocale() 과 new Locale("ko_KR") 의 결과가 달라서 발생했다. 원인 근본적 원인 Locale 클래스의 Locale.defaultLocale() 이라는 정적메서드의 미묘한 동작 때문에 발생했다. 운영체제에 있는 로케일 정보를 가져올 때는 ko_KR 과 같이 대소문자에 대한 일반화를 안하고 가져오고, 내가 직접 생성자로 new Locale("ko_KR") 과 같이 생성..
인텔리제이 콘솔에서 톰캣 한글 로그가 깨질 때 해결 방법
증상 체크 톰캣 서버를 띄웠는데, 콘솔에서 한글이 잘 찍히지 않는다. 초기화 과정에서 나오는 메세지가 깨져서 나온다. 기본 Intellij 콘솔 인코딩 깨짐 해결 아래의 화면처럼 깔끔한 초기화 로그가 뜨지 않고 여러 문자가 깨져보일 때 해결하는 방법이다. Intellij File Encodings 체크 상단부터 차례대로 체크해본다. 통신에는 UTF-8 이 가장 범용적으로 사용되므로 UTF-8 로 모두 고정해주는 것이 좋다. 가변길이 인코딩으로 통신 시 공간효율이 좋다. Global Encoding, Project Encoding, Default encoding for properties files 아래의 Transparent native-to-ascii conversion 도 체크하는 것이 좋다. 네이티..
프로그래밍에서 말하는 애드혹 (ad-hoc, adhoc) 이란?
프로그래밍에서 말하는 애드혹 (ad-hoc, adhoc) 이란? 라틴어로 "for this particular purpose" 이다. 특정 상황에서만 정답이 되고 일반화될 수 없는 해답을 말한다. 그러므로 재사용되는 것이 거의 불가능하다. 개발 기간이 촉박할 때 급하게 요구사항을 맞추는데 사용된다. 베스트 프랙티스가 아니며, 장기간 사용을 위해 최적화가 필요하다. 소위 '하드코딩' 이라 불리는 방법으로 코딩하여 만든 솔루션이다. ad-hoc public class AdHocExample { public static void main(String[] args) { int num1 = 5; int num2 = 10; int sum = num1 + num2; System.out.println("..
Lettuce 란? (feat. 레디스의 자바 클라이언트)
Lettuce 란? 고성능(high-performance), 확장 가능(scalable), 스레드 안전한(thread-safe) 레디스 자바 클라이언트이다. 동기, 비동기, 리액티브 프로그래밍 모델 모두 지원한다. Netty 프레임워크 위에 빌드된 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크이다. 다중 연결을 처리하기 위해 디자인되었다. 강력하고 유연한 API 를 제공한다. 핵심 기능 커넥션 핸들링 (Connection handling) standalone 연결 혹은 커넥션 풀의 일부인 커넥션 오브젝트를 통해 Redis 로의 커넥션을 관리한다. 커넥션은 논블로킹으로 동작하며, 여러 스레드들과 효율적으로 동작하게 디자인되어 있다. 동기, 비동기, 리액티브 API Lettuce 는 다양한 API 를 ..
Redis Sentinel 이란?
Redis Sentinel 이란? Redis 설정에 문제가 발생했을 때 모니터링, 알람, 자동 페일 오버를 제공하는 Redis 용 고가용성 솔루션이다. 분산 환경에서 레디스와 함께 동작하도록 설계되었다. 레디스 시스템의 전체적인 상태와 신뢰성을 유지하는데 도움을 준다. 주요 기능 모니터링 알람 자동 페일 오버 구성정보 제공자 모니터링 주기적으로 레디스 인스턴스들의 상태를 확인한다. 가용성, 지연율 그리고 인스턴스의 다른 상태 관련된 수치들에 대한 정보를 수집한다. 알람 마스터나 레플리카 노드에 장애가 발생했을 때 이를 알아챈다. 시스템 관리자나 다른 모니터링 시스템에 장애를 알린다. 자동 장애 극복 (Automatic failover) 마스터 노드에 장애가 발생했을 때 이를 발견하고 장애 극복 (fail..
레디스 (Redis) 란?
Redis 란? 오픈소스이다. in-memory 데이터 구조 저장소이다. in-memory 특성덕에 갖는 빠른 퍼포먼스 때문에 인기가 많다. memcached 랑 비슷한데 list, set, ordered sets 같은 다양한 데이터타입을 지원한다. 데이터에 대한 atomic operations 을 지원한다. 데이터베이스, 캐시, 메시지 브로커 등으로 이용한다. 레디스의 핵심 기능들 Redis 가 지원하는 데이터 타입 Strings: 레디스의 문자열은 Binary-safe 하다. 어떤 타입이든 저장할 수 있다. Hashes: 하나의 레디스 키 내부에 있는 키-밸류 쌍이다. object 나 다중 필드 저장에 적합하다. Lists: 링크드 리스트로 구성된 정렬된 문자열 컬렉션이다. head 와 tail 에 ..
publish-subscribe pattern (pub sub pattern, 발행자 구독자 패턴) 이란?
publish-subscribe pattern 이란? 메시징 패턴의 한 종류이다. 각각의 컴포넌트가 서로의 identity 를 알 필요 없이 통신하게 해준다. 컴포넌트간 느슨한 결합 (loose coupling) 이 가능하게 만들어 유지보수를 쉽게 만든다. 주 컴포넌트는 3가지이다. 발행자 (publishers) 구독자 (subscribers) 메세지 브로커 (message broker) 각 개념에 대한 세부 설명 메세지 브로커 기본 개념은 메세지 브로커란? 링크에서 확인하면 된다. pub-sub 패턴에서 중심이 되는 컴포넌트이다. pub-sub 통신을 관리하는 책임이 있다. 메세지 (혹은 이벤트) 를 잠시 받아두었다 전달한다. 각 메세지 타입이나 토픽에 대한 구독자 (sub) 리스트를 가지고 있다. 발..
AOF (Append Only File) 란?
AOF (Append Only File) 란? 영속적인 데이터 저장 매커니즘이다. DB 와 Redis 같은 저장소에서 사용된다. 쓰기(write) 연산에 대한 로그를 모두 남겨서 유지하여 시스템 장애가 발생하거나 시스템이 재시작되었을 때 데이터 재구성을 돕는다. 모든 연산을 순차적으로 저장하여 로그를 통해 상태를 복구할 수 있도록 돕는다. AOF (Append Only File) 가 동작하는 방식 초기화 (Initialization) 스토리지는 먼저 AOF 파일이 존재하는지 확인한다. 존재한다면, AOF 파일을 읽어 데이터 복원을 준비한다. 연산 데이터 쌓기 (Wirte Operation) DB 에서 다양한 연산 (SET, DEL, INCR 등) 이 일어날 때마다 AOF 파일에 연산 내역을 쌓는다. 시스..
메세지 브로커 (Message Broker) 란?
메세지 브로커 (message broker) 란? 안정적인 비동기 방식으로 메세지를 교환하여 분산된 시스템 혹은 애플리케이션 간의 통신을 돕는다. 생산자와 소비자간 중개자 역할을 하여 두 시스템이 완전히 독립적으로 작동할 수 있도록 돕는다. 컴포넌트간 느슨한 결합 (loose coupling) 을 돕는다. 이 구조는 확장성을 증대시켜주고 장애가 미치는 여파를 줄일 수 있습니다. 메세지 큐, 토픽과 같은 데이터구조를 통해 메세지를 임시로 저장해두었다가 적절한 수신자에게 보내줍니다. 핵심 기능 비동기 커뮤니케이션 디커플링 메세지 라우팅 및 필터링 영속성과 신뢰성 스케일링 로드밸런싱과 장애 내성 비동기 커뮤니케이션 (Asynchronous communication) 시스템이 비동기로 소통할 수 있도록 돕는다...
Binary Safe (바이너리 안전, 이진 안전) 문자열이란?
binary-safe 문자열이란? 데이터 손실없이 null 바이트를 포함한 모든 바이트 시퀀스를 저장, 처리, 조작할 수 있는 문자열 처리 방식이다. 인코딩에 특화된 문자열을 읽는 것이 아니라 원시 (raw) 바이트 그대로를 다룬다. 원시 바이트를 그대로 처리하기 때문에 텍스트 데이터 뿐만 아니라 이미지, 오디오, 직렬화된 객체 등의 처리도 가능하다. binary-safe 하지 않다는 것은 무엇일까? 특정 인코딩 (ASCII, UTF-8) 으로 문자열을 다루는 것을 말한다. 이 경우 특정 바이트 시퀀스가 특수 문자로 다뤄지거나 유효하지 않은 인코딩으로 다뤄져 바이너리 데이터를 저장하거나 조작하는 경우 문제가 생길 수 있다. 레디스의 관점에서 binary-safe 문자열을 다룬다는 것은? text, num..
정규표현식의 플래그란? (what is flag in regular expression?)
정규표현식의 플래그란? (Regular Expression flags) 플래그로 정규표현식의 동작방식을 변경할 수 있다. 정규표현식 전체의 동작방식에 영향을 미친다. /regex/flags regex 자리에 정규표현식 패턴이 오고, flags 에 플래그가 온다. 플래그(flags)는 modifiers 라고 불리기도 한다. 플래그의 종류 g (global) i (case-insensitive) m (multiline) s (dotall) u (unicode) y (sticky) g (global) 플래그 설명과 예제 정규표현식의 기본 동작은 입력 문자열에서 매칭된 첫번째 케이스만을 찾아낸다. g (global) 플래그는 모든 케이스를 찾아내도록 한다. g 플래그를 적용하지 않는다면 입력된 문자열: hell..
전방 탐색과 후방 탐색 (Regex Lookaround match) 이란?
정규표현식, 전방 탐색과 후방 탐색 (Regex Lookaround match) 이란? 보통 패턴에 매칭되는 문자가 아니라, 패턴에 매칭되는 문자의 앞, 뒤를 찾을 때 이용한다. 정규식은 보통 문자를 '소비'하면서 찾아가는데, 전방탐색과 후방탐색(Lookaround match)은 소비하지 않는다. '소비'란 것은 한번 패턴을 찾으면 더이상 그 전으로 돌아가지 못하는 것을 이야기한다. 종류 전방 탐색 (Positive Lookahead) (?=) 부정형 전방 탐색 (Negative Lookahead) (?!) 후방 탐색 (Positive Lookbehind) (? (?=) 전방 탐색 (Positive Lookahead) 패턴 앞의 문자만 매칭된다. 패턴 자체는 매칭시키지 않는다..