나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

전체 글 103

[spring] lifecycle mechanisms

spring은 bean의 생명주기를 관리하는 3가지 방법이 있다. InitializingBean, DisposableBeaninit(), destroy()@PostConstruct, @PreDestroy 하나의 bean에 대해 여러 lifecycle이 구성되어 있을 경우, 아래와 같은 순서대로 실행이 된다. 초기화 순서@PostConstrct → InitializingBean에 정의된 afterPropertiesSet() 콜백 → 사용자 정의 init() 메서드 @PostConstrct @Sevice public class LifeCycleTest { @PostConstruct public void postConstruct() { System.out.println("postConstruct"); } } ..

Framework/spring 2017.08.29

[spring] cache

캐시는 미래의 데이터 요청에 빠르게 응답하기 위한 데이터 저장의 한 방법이다. (wikipedia) 캐시의 활용은 다양한데, 동일한 데이터를 계속해서 활용할 경우 계산 작업을 중복해서 하지 않도록 하거나 계산 시간이 오래 걸리는 작업을 미리 처리하고 추후 요청이 왔을 때 응답하도록 할 수 있다. spring에서는 cache 서비스를 추상화하며 여러 데이터 저장소를 활용할 수 있도록 구성하였다. org.springframework.cache.Cache 와 org.springframework.cache.CacheManager 인터페이스로 구체화된다. 해당 추상화에 대한 여러가지 구현들이 있는데 우리는 가장 기본이 되는 JDK의 java.util.concurrent.ConcurrentMap를 활용한 구현법을 ..

Framework/spring 2017.08.29

AVL Tree (2) - 삭제

AVL Tree의 노드를 삭제한 이후에도 재배열 과정을 거쳐야 한다. 재배열 과정에서 지켜야할 규칙은 이전 블로그에서 기록한 내용과 동일하다. T1, T2, T3는 루트노드 y 또는 x의 자식트리이다. (y는 왼쪽, x는 오른쪽 트리) y x / \ Right Rotation / \ x T3 – – – – – – – > T1 y / \ < - - - - - - - / \ T1 T2 Left Rotation T2 T3 두 트리에서 지켜야 할 데이터 크기의 순서는 아래와 같다. keys(T1) < key(x) < keys(T2) < key(y) < keys(T3) 삭제의 순서 노드 w를 삭제한다고 할 때, 순서는 아래와 같다. BST의 삭제 방법과 동일하게 노드 w를 삭제한다. w 노드로부터 불균형한 첫번째..

Algorithm 2017.08.25

AVL Tree (1) - 개념, 삽입

AVL Tree는 스스로 균형을 맞추는 이진탐색트리(BST)이다. 여기서 균형을 맞춘다는 것은 왼쪽/ 오른쪽 자식트리의 깊이 차이가 1을 넘지 않는다는 의미이다. [그림1] AVL Tree [그림 2] AVL Tree가 아님 위 [그림1, 2]는 AVL Tree의 성립 조건을 비교하는 예시이다. [그림 1]의 경우는 모든 노드에서 자식노드들(왼쪽, 오른쪽)의 깊이 차이가 1을 넘지 않는다. 그런데 [그림 2]의 트리는 8과 18을 가진 노드에서 자식노드들의 깊이 차이가 1을 넘기 때문에 AVL Tree 조건을 성립하지 않는다. 왜 AVL Tree를 사용할까?이진탐색트리의 작업들(검색, 삽입, 삭제 등)을 수행할 때 O(logN)의 시간이 소요된다. 하지만 한쪽으로 노드들이 쏠린 트리의 경우 수행시간이 O..

Algorithm 2017.08.24

[Java8] 람다란 무엇인가?

Java8의 추가된 큰 기능 중 하나로 람다를 첫번째로 든다. 그러면 람다란 무엇일까? 정리해보자. 람다를 한마디로 표현하면 메서드로 전달할 수 있는 익명 클래스를 단순화한 표현식이다. 익명클래스(anonymous class)는 무엇인가? 익명클래스는 이름이 없는 로컬 클래스 입니다. 익명 클래스는 new 연산자를 사용하여 하나의 간결한 표현식으로 정의되고 인스턴스화된다. 로컬 클래스는 Java 코드 블럭이지만 익명클래스는 표현식이므로 메서드 호출과 같은 표현식의 일부로 포함될 수 있다. 아래 코드를 살펴보면 Thread를 생성할 때, 파마미터로 익명클래스를 생성해서 전달함을 볼 수 있다. public class ThreadTest { public static void main(String[] args)..

Language/Java 2017.08.09

[Java8] CompletableFuture 정리

기존 Future 인터페이스는 비동기 계산의 결과로 제공하기 위해 Java5에서 추가되었지만, 이런 계산들을 결합하거나 오류를 처리할 방법이 없었다. 그래서 Java 8에서 CompletableFuture가 추가되었다. CompletableFuture은 Future 뿐만 아니라 CompletionStage도 상속하는데, CompletionStage의 특징을 살펴보면 CompletableFuture의 장점을 알 수 있다. CompletionStage는 결국은 계산이 완료될 것이라는 의미의 약속이다.계산의 완료는 단일 단계의 완료 뿐만 아니라 다른 여러 단계 혹은 다른 여러 단계 중의 하나로 이어질 수 있음도 포함한다. 뿐만 아니라 각 단계에서 발생한 에러를 관리하고 전달할 수 있다. 지금부터 Complet..

Language/Java 2017.08.09

[algospot] 조세푸스 문제 (연결리스트)

기본 자료구조 중 하나인 연결리스트를 정리하기 위해 알고리즘 문제를 풀어보았다. algospot의 조세푸스 문제이다. (링크) 문제를 간략히 요약하면 원으로 둘러싸인 병사들이 하나씩 죽는데, k번의 간격을 두고 순차적으로 죽으며 나머지 2명을 찾아내는 문제이다. 원으로 모여있다고 가정하기 때문에 연결리스트의 마지막 다음이 첫번째 연결리스트 노드로 인식하고 풀어나가면 된다. Java에서는 연결리스트의 표준 라이브러리로 LinkedList를 구현해 놓았다. LinkedList의 iterator(링크)로 노드들을 순차적으로 탐색할 수 있다. 문제를 풀면서 LinkedList에 대해서 정리를 추가로 한 부분.iterator()로 얻은 첫 노드는 LinkedList의 첫 노드가 아니라 첫 노드를 가르키는 head..

Algorithm 2017.08.03

아날로그의 반격 - 몰스킨

아날로그의 반격국내도서저자 : 데이비드 색스(David Sax) / 박상현,이승연역출판 : 어크로스 2017.06.30상세보기 '아날로그의 반격'을 읽게 된 이유는 몰스킨 때문이었다. 디지털 메모 도구를 많이 사용하지만 한편으로는 손글씨 메모에 대한 갈증을 느끼고 있었고, 그에 따라 선택한 노트가 몰스킨 이었기 때문이었다. 몰스킨이 물론 비싸다. 돈이 많아서 궂이 몰스킨을 구매하는건 아니고 몰스킨으로 적었을 때 보관으로 계속 이어져서 계속 구매를 하게 되었다. 보관한다는 것은 분명한 장점이 있어서인데, 몰스킨 특유의 두꺼운 종이와 어떤 페이지를 피더라도 쓰기 용이하게 펼져지는 구조, 밴드와 두꺼운 커버로 인해 가방에서 손상되지 않는 이유 때문이었다. 그리고 비싸기 때문에 조심히 다루는 측면도 없지 않다...

2017.07.26

숨결이 바람될 때

숨결이 바람 될 때 - 리커버 특별판국내도서저자 : 폴 칼라니티(Paul Kalanithi) / 이종인역출판 : 흐름출판 2016.08.19상세보기 오랜만에 소설을 읽고 싶어서 고른 책이다. 베스트셀러로 등록되어 있는 걸 보고 내용을 짐작하지도 않고 읽기 시작했다.읽기 시작한 이후 빠르게 책에 집중하게 됐고, 큰 울림을 남겨주었다. 의사이자 암 환자였던 폴이 죽음 앞에 최선을 다하며 기록한 책이다.책을 마무리 하지 못했지만 죽기 직전까지 자신의 일상과 생각을 기록했고, 마무리 하지 못한 부분을 아내인 루시가 남겨 주었다. 죽음 앞에서 본인과 가족들을 위해 최선을 다한 남편에게 사랑의 말들로 기억하는 아내의 글이 먹먹하게 다가왔다. 삶의 균형을 잘 잡아야 해요.최악의 결과를 미리 생각해두지 않으면환자와 가..

2017.07.20

Generators (제너레이터)

제너레이터는 하나의 값을 결과로 리턴하는 것이 아니라 연속된 결과를 리턴하는 함수이다.아래 코드는 제너레이터의 간단한 예제 코드이다. # countdown.py # # A simple generator function def countdown(n): print("Counting down from", n) while n > 0: yield n n -= 1 print("Done counting down") # Example use if __name__ == '__main__': x = countdown(10) print(x) for i in x: print(i) 결과는 다음과 같이 나온다.Counting down from 101098...1Done counting down 제너레이터 함수를 보면은 retur..

Language/python 2017.04.12

logback & logstash 패턴 설정

ELK의 기본 구조를 나타내는 그림이다.server의 로그를 server측 Filebeat와 데이터를 저장하는 elasticsearch 서버의 Logstash 연결을 통해 데이터를 기록한다. 출처 : https://assets.digitalocean.com/articles/elk/elk-infrastructure.png 여기서 한가지 의문점이 생기는데, 어떻게 정의한 로그들을 가져가는지 이다.어떻게 구조화단 로그 데이터를 elasticsearch에 맞춰서 넣을까? 우리는 일단 App Server가 spring의 logback을 사용한다고 가정하였다.logback의 xml 설정을 통해 기록되는 로그들을 일정한 패턴을 두고 쓰게 만들 수 있다.logback의 로그 발생 패턴과 logstach가 로그를 가져가..

Framework 2017.04.04

ELK (elasticsearch + logstach + kibana) 설치

1. Java8 설치 java 설치 파일 다운로드 cd /optsudo wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz" 압축해제 및 심볼릭 링크sudo tar -xvf jdk-8u121-linux-x64.tar.gz 압축푼 폴더의 권한 변경sudo chown -R root: jdk1.8.0_121 /..

Framework 2017.04.04
반응형