본문 바로가기

전체 글

(103)
Java의 SPI(Service Provider Interface)와 응용 Java 6에 추가된 기능인 SPI는 정말 유용한 기능임에도 불구하고 많은 사람들이 이 기능 자체를 모르고 있다.이 글에서는 SPI에 대해 간단하게 소개하고, SPI의 개념을 어떻게 스프링에 응용할 수 있는지 살펴볼 것이다. 아래 코드는 자바에서 기본적으로 읽고 쓸 수 있는 이미지 포맷이다.public class Main { public static void main(String[] args) { System.out.println("Readers:"); for (String s : ImageIO.getReaderFormatNames()) { System.out.print(s + ","); } System.out.println();..
프로세스 간 스트림 연결 개발을 하다보면 프로그램 내의 스레드가 아닌 외부 프로세스를 호출해야하는 경우가 간혹가다 존재한다. 이 때 입출력을 어떻게 받고 에러디버깅은 어떻게 하는지 간단하게 소개하고자 한다. 컴퓨터 프로그램에서 프로세스(process)는 실행 중인 프로그램을 의미하며, 프로세스는 보통 표준 입력(Standard Input), 표준 출력(Standard Output), 표준 오류(Standard Error)라는 세 가지 기본적인 스트림을 사용한다.  • 표준 입력 (stdin): 프로그램이 외부에서 데이터를 입력받는 통로다. 보통 키보드 입력이나 다른 프로그램의 출력이 표준 입력으로 들어올 수 있다. • 표준 출력 (stdout): 프로그램이 실행 결과를 내보내는 통로입니다. 보통 콘솔 창에 출력되는 정보가 여기에..
코드 짜다가 알게된 것들(SortedSet, Spring Security, Logback) 최근 코딩을 하다 알게된 예상과 다르게 동작하는것들이 있어 기록 하고자 글을 쓴다. SortedSet아래와 같은 코드가 있다. 아래 코드의 출력값은 무엇일까??public class Main { public static void main(String[] args) { SortedSet cars = new TreeSet(); cars.add(new Car("Ford", 2018)); cars.add(new Car("Toyota", 2018)); System.out.println(cars.size()); } static class Car implements Comparator { private String name; ..
Postgresql에서의 MVCC와 VACUUM 지난 글에서 tid라는 것에 대해 간단하게 소개를 했다. tid는 튜플(레코드)의 물리적인 위치라고 알고있는데, 값이 종종 변경되는 것을 보며 어째서 변경이 되는 것인지 궁금하여 찾아보게 됐다. 찾아본 결과 MVCC와 VACUUM이라는 기능 때문이라는 것을 알게되며 알게된 점을 기록하게 됐다. MVCCMVCC란 Multi Version Concurrency Control의 줄임말로 여러 버전을 동시에 관리한다는 의미이다.예를 들어 다음의 쿼리를 보자begin;update employee e set e.name = 'john';select * from employee e where e.name = 'john';rollback; 위 쿼리에 select 를 하는 시점에는 분명 조회가 됐지만, 트랜잭션이 종료되..
Postgresql에서 실행계획을 볼 때 알면 도움이 되는 것들 최근 백오피스에서 특정 쿼리의 성능이 너무 낮아 해당 쿼리의 실행계획을 보게 됐다. 이 과정속에서 알게된 내용을 기록하고자 한다.보통 우리는 데이터를 영구적으로 저장하기 위해서 db를 사용한다. (파일 시스템을 써도 되기는 하지만.. dbms가 제공해주는 기능들을 생각하면 파일 시스템을 쓸 생각은 하지 못할 것이다)이 때 데이터는 컴퓨터의 디스크에 저장이 된다. 아래는 제프딘의 컴퓨터 자원 레이턴시 표를 기반한 그림인데, 디스크 작업이 느린 것을 확인할 수 있다.그래서 이 느린 작업을 조금이라도 더 빠르게 하기 위해 dbms에 있는 옵티마이저는 적절한 실행 계획을 세운다. 여기서 개발자는 옵티마이저가 더 빠른 실행계획을 세울 수 있게 쿼리를 더 적절한 방향으로 수정하거나 적절한 인덱스를 태운다.인덱스를 ..
Apache HttpAsyncClient 살펴보기(IOReactor, Selector) 지난 글에서 HttpClient에 대해서 살펴봤다. 이번 글에서는 HttpAsyncClient에 대해서 살펴보도록 하겠다. 먼저 기본적인 설정은 아래와 같이 할 수 있다. httpClient와 유사하며 IOReactor 설정이 추가됐다.HttpAsyncClient httpAsyncClient() { // 전체 커넥션 풀 int maxPool = 200; // 호스트 당 커넥션 풀에서 쓸 수 있는 커넥션 개수 int maxPerRoute = maxPool; // 연결을 설정한 후 데이터를 기다리는 시간(패..
Apache HttpClient5 살펴보기 최근 HttpClient5 클래스를 튜닝(?) 하면서 알게 된 HttpClient의 다양한 옵션에 대해 이야기해 보려 한다. Apache HttpClient는 아파치에서 개발한 라이브러리로 자바에서 http 통신을 쉽게 할 수 있도록 도와주는 라이브러리이다.  현시간 기준으로 5.2.1이 가장 많이 사용된다. 아래와 같이 상세한 설정이 가능하다. public HttpClient httpClient() { int maxPool = 200; // 전체 커넥션 풀 int maxPerRoute = 200; // 호스트 당 커넥션 풀에서 쓸 수 있는 커넥션 개수 int idleConnectionTimeoutSec = 30; // 유휴 커넥션이 이 시간이 지나면 커넥션 반납 long requestConnection..
사설 maven repository에 라이브러리 업로드하고 사용하기 최근 사내에서 라이브러리를 개발하여 이를 이야기해 보려 한다. 현재 팀이 운영하는 api의 특성상 해당 api를 이용하는 client에게 api를 제공하는 것보다는 라이브러리를 제공하는 것이 업무에 더 효율적이라는 판단이 들어 팀은 라이브러리를 제공하기로 결정했다. 여기서 말하는 효율에는 관리(사용자에 따른 로그, 오류, 기타 데이터..), 생산성(클라이언트 측, 서버 측 모두 포함)을 의미한다. 이제 라이브러리를 만들고 업로드하는 과정을 간단하게 살펴보자.먼저, 사내에는 Nexus라는 사설 레포지토리가 존재한다. Nexus는 가장 인기있는 레포지토리 매니저 오픈소스로 jar 뿐만 아니라 다양한 포맷을 지원한다.  로컬 개발환경에서 Nexus는 도커 컨테이너로 띄웠으며 아래와 같은 도커 컴포즈로 실행했다..