이번 프로젝트에서 Transactional 을 사용하면서 우연히 알게 된 사실이 있다. 환경은 Spring + MyBatis + PostgreSQL 이고 MyBatis 설정은 아래와 같다.@Configuration @MapperScan(basePackages = "com.westudy.api.*", sqlSessionFactoryRef = "Mybatis_PostgreSQL_SqlSessionFactory", sqlSessionTemplateRef = "Mybatis_PostgreSQL_SqlSessionTemplate") @ConfigurationProperties("spring.datasource") @EnableTransactionManagement public class MyBatisConfig ..
TextInput 을 사용할 때 상위 View 에서 가운데 정렬을 적용해도 하위의 TextInput의 텍스트가 중앙으로 오지 않는다. TextInput 의 backgroundColor 를 red 로 주고 확인해 보면 View 의 높이 만큼 TextInput이 가득차 있는 것을 볼 수 있다. 이는 TextInput 의 default padding 때문이라고 하는데 TextInput style 에 paddingTop: 0, paddingBottom: 0 을 넣어주면 TextInput 의 크기가 fontSize 에 맞게 줄어들고 vertical align 이 동작하는 것을 볼 수 있다.
참고 : https://www.postgresql.org/docs/9.1/static/ddl-partitioning.htmlpostgres 에서는 파티션 테이블을 테이블의 상속을 통해서 제공해 주고 있다. 부모 테이블을 생성해 준 뒤 이를 사용하여 자식 테이블을 생성해 준다. (테스트를 위해서 간단한 테이블을 생성해 준다.)1. 부모 테이블 생성CREATE TABLE TEST( ID NUMERIC NOT NULL );부모 테이블을 만들 때는 컬럼 속성외의 조건들은 (FK, PK, INDEX 등) 생성해도 자식 테이블로 전달되지 않는다.2. 이를 기반으로 자식 테이블을 생성해 준다.CREATE TABLE TEST_2 ( CHECK (ID >=1 AND ID =3 AND ID Seq Scan on test ..
앱을 만들면서 데이터를 가져오는 서버를 만들게 되었다. 처음에는 스프링의 세션을 사용하여 사용자 정보를 저장했지만 간단한 사용자 정보만 필요했기 때문에 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를 정의했던것은 극히 일부분에 지나지 않았다. (책에서는 도메인을 특정분야의 전문적인 영역으로 생각하며 개발자는 도메인 전문가와 언어를 정의하고 컨텍스트를 분리해나가고 다른 영역의 컨텍스트를 어떻게 사용해야 하는지 등등 을 끈임없게 탐구하도록 도와준다.) 내가 적용한것이 잘된 것인지 잘못..