앱을 만들면서 데이터를 가져오는 서버를 만들게 되었다. 처음에는 스프링의 세션을 사용하여 사용자 정보를 저장했지만 간단한 사용자 정보만 필요했기 때문에 JWT(http://bcho.tistory.com/999)를 사용하기로 했다. 스프링에서 적용방법을 찾다 보니 대부분이 OAuth와 같이 사용하는 방법이 대부분 xml 을 사용한 설명만 있었다. 그래서 annotation 을 사용한 JWT 설정하는 방법을 남긴다. (참고 사이트 : https://www.toptal.com/java/rest-security-with-jwt-spring-security-and-java)1. 요청을 가로챌 수 있는 filter 를 만든다.@Slf4j public class JwtAuthenticationFilter extend..
객체지향은 개발을 하기 위한 강력한 개념이다. 하지만 객체지향을 익히고 사용하기 까지는 많은 노력과 시간이 필요하다. 나도 그랬지만 적당히 중복을 제거하고 공통을 묶어서 개발하는 것은 객체지향를 조금 흉내내려고 하는 것에 불과하다고 생각한다. 객체지향을 구현하기 위해서는 지식과 생각의 전환이 필요하고 이 글이 조금이나마 도움이 됐으면 한다.객체지향의 중요한 개념객체란 실세계를 반영한다. 어디서나 나오는 말이지만 객체지향의 핵심이 실세계의 사물을 사용하는 방법을 개발에도 똑같이 적용하여 사람에게 더 친숙하게 하기 위함이라고 생각한다면 정말 중요한 말이다. 사실 이것만으로도 대부분의 객체지향 이론들이 설명된다. 실세계에서는 사물간의 decoupling 이 당연하게 이루어지고 있고 encapsulation 또..
이 글은 설치하는 방법은 다른 블로그에 좋은 글이 많기 때문에 다루지 않고 실제 어떻게 적용을 했는지 만을 다룬다.solr 는 apache의 enterprise search engine으로 빠른 검색 시스템을 제공해 주고 관리화면을 제공해주며 검색 쿼리를 http get을 사용하여 호출하기 때문에 기존 시스템에 적용하기 좋다. 또한 DIH(Data Import Handler) 를 사용하여 원천 데이터로 부터 검색에 필요한 데이터을 추출하여 solr에 저장할 수 있다. 나는 회사에서 제공하는 많은 디자인을 사용자에게 검색을 통해 제공할 수 있도록 DB검색을 solr 로 전환하는 작업을 했다.처음 구조를 잡을 때 가장 고민했던 것은 검색하려는 목표와 목표를 검색하는데 필요한 데이터들의 분리였다. 목표란 프론..
Single 로 사용하던 세션서버 용도의 Redis 를 노드를 늘릴 수 있는 기회가 생겨서 어떤 구성을 적용할 지 고민을 하게 되었다. 이상적인 구조는 Master 하나와 2대 이상의 Slave 그리고 3대 이상의 Sentinel 이지만 현재의 서버가 부족하여 2대로 구성을 해야 했다.처음 생각했던 것은 Master 1, Slave 1 구성하고 Replication 을 사용하고 Slave 의 read only 를 사용하지 않는 것이었다. 마스터 장애 시 slave 에 쓸 수 있고 장애가 복구되면 다시 master 를 사용하려는 목적이었다. 하지만 slave 의 데이터가 master 로 가지 않는 단점이 있어서 slave 의 사용 시간이 늘어날 수록 복구 후 손실되는 데이터가 많아지는 단점을 갖고 있었다...
작년 이직 후 얼마 지나지 않아 나에게 재미있는 프로젝트가 주어졌다. 고해상도의 이미지를 합성해야하는 것으로 합성하는 윈도우 프로그램은 다른 팀에서 제공해 주며 나는 요청을 받아 합성 프로그램으로 합성한 뒤 이미지를 반환해야 하는 것이었다.이전까지 서버에 여러 VM을 올리고 VM하나 마다 합성 프로그램 하나를 기동하는 방식을 사용하고 있었다. 나는 VM 에 들어가는 자원이 너무 아까웠기 때문에 VM을 사용하지않는 방법을 고민했다. VM을 사용했던 이유는 각 합성프로그램은 하나의 리소스 폴더만을 사용할 수 있었기 때문이었다. 이를 해결하고자 자바의 각 쓰레드가 윈도우 프로그램을 실행할 때 쓰레드이름의 폴더를 생성해서 프로그램 파일을 복사해온 뒤 실행하도록 했다. 이렇게 되면 복사된 exe 로 실행된 프로그..
결제 부분 개선 후 세달이 흘렀다. 지금와서 다시 후기를 남기는 이유는 개선직후에는 알기 힘든 장단점들이 시간이 지나면서 나타나기 때문이다. 에릭에반스의 도메인 주도 설계책을 개선이 끝난 후에 다 읽기는 했지만 객체지향만큼 아니면 그 이상으로 많은 경험이 필요한 개념임을 깨달았다. 내가했던 코드를 도메인별로 분리하고 레이어에 맞게 패키지를 정하고 각 레이어가 데이터를 어떻게 주고 받으며 Entity와 ValueObject를 정의했던것은 극히 일부분에 지나지 않았다. (책에서는 도메인을 특정분야의 전문적인 영역으로 생각하며 개발자는 도메인 전문가와 언어를 정의하고 컨텍스트를 분리해나가고 다른 영역의 컨텍스트를 어떻게 사용해야 하는지 등등 을 끈임없게 탐구하도록 도와준다.) 내가 적용한것이 잘된 것인지 잘못..
개인적으로 개발 중인 서버 프레임워크 및 기타 Github 소스들을 쉽게 제공하기 위해서(나에게 제공...;;) maven 을 사용할 수 있는 방법을 찾던 중 혹시나 Github 에 있지 않을까 해서 확인해보니 역시나 있었다!https://github.com/github/maven-plugins잘 정리가 되어 있어서 일단 따라해 봤다.maven 폴더 안에 있는 settings.xml 에 github 으로 파일을 올리기 위한 설정이 필요하기 때문에 github 의 계정 정보를 설정해 주었다. 내 settings.xml 위치 C:\Users\user\.m2\repository github github id github password 그리고 프로젝트 안의 pom.xml 에 example 에 있는 plugin..
진행이 중반 이후로 넘어갈 때 기존 코드 중 정말 말도 안되는 부분을 수정하면서 불안함이 몰려오기 시작했다. 처음 프로젝트를 시작했을 때는 머리속에 단계별 목표가 명확했지만 어느순간 목표가 보이지 않았다. 내가 리더였지만 같이 하던 동료에게 우리가 과연 이번 분기에 해낼 수 있을 까를 물어보기도 하고 다음 날 다시 한번 레거시 소스를 쳬계적으로 분석하며 차근차근 진행해 갔다 (우리가 진행했던 개선 부분이 결제관련 부분이어서 상당한 부담감을 갖고 있었다.)1차적으로 사내IP 로만 새로운 결제를 사용할 수 있도록 적용하여 가오픈을 진행했다. 여기서도 몇 번의 이슈가 발생했고 오픈 후에도 몇번 이슈가 발생했다. 나중에 든 생각이 운영 데이터를 새로 개발한 부분으로 계속해서 흘려보내는 방식으로 한달정도 모니터를..
작년(2017 4분기) 나의 최종목표는 전체중 극히 일부분에 지나지 않은 레거시 코드를 개선하는 것이었다. 아주 작은 부분이었지만 개발자 인생에서 처음으로 레거시를 마음껏 개선할 수 있는 기회이기도 했다. 물론 레거시의 괴물(?) 같은 모습을 모르는 것은 아니었지만 도전하고 싶었고 DDD(Domain Driven Design)를 사용해보고 싶은 욕심도 있었다. 이미 DDD Start 라는 책을 읽었던 터라 조금의 희망을 가지고 있었고 분기시작 전 추석동안 그 책을 한번 더 읽었다. 같이 개발을 해야할 동료들에게도 읽기를 권하고 규칙들을 정한 뒤 개발을 시작했다.읽은 책은 기본서적이라 도메인을 세부적으로 적용해 보기에는 힘들었지만 이런 부분까지 검토하면서 진행하기에는 레거시의 너무 많은 세월(신기한 분기문..
Zookeeper 설정 conf/zookeeper.properties* zookeeper 데이터 저장 위치 dataDir=D:/kafka_2.11-0.11.0.0/temp/zookeeper* kafka 가 접속할 포트 clientPort=2181* 하나의 클라이언트에 동시접속하는 개수 제한 기본 60 이며 0은 무제한 maxClientCnxns=0* 하나의 zookeeper 리더에 연결해서 동기화 하는 시간 initLimit=5* 리더가 아닌 zookeeper 노드가 리더와 동기화 하는 시간 syncLimit=2* zookeeper 서로 간의 통신을 하기 위한 포트 server.1=192.168.0.1:2888:3888 server.2=192.168.0.2:2888:3888* dataDir 밑에 myid..