본문 바로가기

개인 학습 메모장

(104)
스프링 부트로 빌드된 jar 의 구조 최근 그래들 태스크에 프로젝트의 자바 코드를 그래들 태스크에서 사용해야 하는 상황이 있었다.  아래와 같은 코드이다. 간단하게 설명하자면 프로젝트의 소스코드를 그래들 태스크에서 불러와서 main 함수를 실행하는 스크립트이다. (실제 코드는 제공할 수 없어서 대체 코드로 작성했다.)tasks.register("docGenerateTask", JavaExec) { group = "documentation" description = "대충 문서화" def outputDir = "src/main/doc" classpath = sourceSets.main.runtimeClasspath mainClass = 'org.testt.Main' args = [outputDir]} publi..
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..