
다중 DB 연결 후 Spring batch를 통해 1시간마다 batch 작업 실행 예정으로 batch 설정 작업 진행. boot 사용중으로 다음과 같이 디펜던시 추가. pom.xml 작성 org.springframework.boot spring-boot-starter-batch 2.7.8 org.springframework.boot spring-boot-starter-quartz 2.7.8 org.springframework.batch spring-batch-test 4.3.7 test spring-boot-starter-batch spring-boot-starter-quartz spring-batch-test yml 작성 spring: batch: job: enabled: false jdbc: init..

협업 업체에서 ERP 연동을 위한 DB 연동을 요청. ERP 관리 업체에서 여러 업체가 있으니 API 통신 말고 각 업체들이 알아서 ERP DB에 붙어 데이터 입력 요청. 새로 1개의 어플리케이션을 띄우고 배치를 돌려 주기적으로 기존데이터를 ERP에 입력하기로 결정. 연결 테스팅해볼 DB는 MySQL과 ORACLE임. Spring data JPA를 통해 연결까지 테스트 진행. Maven dependency mysql mysql-connector-java 8.0.22 runtime com.oracle.database.jdbc ojdbc8 21.8.0.0 org.springframework.boot spring-boot-starter-data-jpa 2.7.8 yml 작성 spring: datasource:..
보안에 완벽함이란 없다. 그래도 더 나은 보안을 위해 노력은 해야한다. JWT는 헤더, 페이로드, 서명 세 가지 정보를 base64로 인코딩한 값을 콤마를 사이에 두고 이어붙인 형태로 생성된다. 토큰 인증은 사용자가 인증 정보를 토큰 발급 후 해당 토큰을 통해 복잡한 인증 과정 없이 토큰으로 사용자를 인증 및 인가할 수 있다. 그런데 이 JWT는 Stateless 방식이기 때문에 서버측에서는 이 토큰을 받아도 본인이 맞는지 확인이 불가능하다. 하나의 토큰(Access token) 인증 방식에 대한 대책으로 Refresh token을 활용할 수 있다. Refresh token은 사용자 인증이 아닌 새로운 Access token을 발급하는데에만 활용된다. Refresh token은 다음과 같이 사용될 수 있..
토이 프로젝트로 Upbit 관련 자동매매를 Spring 사용하여 구현중.. RSI 계산, Websocket 연동, 매매 까지 테스트 완료. 실제 구현해나가는데 지속해서 막히는 부분 생김. Websocket Listener 쪽에서 Message 수신해주는 메서드쪽에 RSI계산, 매매 로직 삽입하려 하지만 지속 실패. (물론 RSI계산, 매매 로직 등을 따로 spring에 위임하지 않은 class로 작성했으면 됐겠지만 DB 사용이 필요했기에 지속 spring 위임 한채로 시도.) 원인을 찾아보니 Websocket Listener를 주입해서 불러오지 않고 생성자를 통해 생성해줌. 따라서 Spring에 위임되지 않은 새로운 Websocket Listener가 불러와짐. 해당 Listener에서 Spring에 일..
Date 타임을 표기할때 각 프로젝트 마다 원하는 표기 방법이 다르다. JPA에서는 @Temporal annotation을 줌으로써 구별한다. @Temporal(TemporalType.DATE) Date regDate; @Temporal(TemporalType.TIME) Date regTime; @Temporal(TemporalType.TIMESTAMP) Date regTimestamp; TemporalType.Date : 년-월-일 의 date 타입 TemporalType.Time : 시:분:초 의 time 타입 TemporalType.TIMESTAMP : date + time 의 timestamp(datetime) 타입 annotation을 사용하지 않으면 timestamp가 기본값이 된다.
맨날 까먹어서 구글링하기 귀찮아서 정리 *.properties 안에 value 값들을 지정해서 관리할때 property config 구성 후 bean 등록을 통해 value 값을 접근할 수 있다. example config @Configuration public class PropertyConfig { @Bean(name = "key") public PropertiesFactoryBean propertiesFactoryBean() throws Exception{ PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); ClassPathResource classPathResource = new ClassPathResource("k..

간단하게 외부 api 문서 작성할게 있어 도입하고 지속 활용해보기로 결정. 이전 기본 설정 이후 test class 작성. 하나 예시로 get 방식 api 활용. @Test public void getAlarmHistoryList() throws Exception { this.mockMvc.perform(RestDocumentationRequestBuilders.get("/external/getAlarmHistory/{startDate}/{endDate}", "20220629120000", "20220629120500") .accept(MediaType.APPLICATION_JSON)) .andDo(print()) .andExpect(status().isOk()) .andDo(document("alarm..

특징 1. 테스트 코드 기반으로 문서를 작성함. 2. 테스트 코드에서 명세를 작성하기 때문에 비즈니스 로직의 가독성에 영향을 미치지 않는다. maven dependecy, plugin 설정 org.springframework.restdocs spring-restdocs-mockmvc {project-version} test org.asciidoctor asciidoctor-maven-plugin 1.5.8 generate-docs prepare-package process-asciidoc html book org.springframework.restdocs spring-restdocs-asciidoctor {project-version} 작성된 doc을 jar에 package하기 위해 플러그인 추가 ma..

QueryDsl은 Entity를 가지고 QueryDsl 전용 Q클래스를 미리 생성한다. 기본적인 사용방법은 다음과 같음. 1. Repository에서 Support 클래스를 생성해준다. ex) DownTimeScheduleRepositorySupport.java @Repository public class DownTimeScheduleRepositorySupport extends QuerydslRepositorySupport{ private final JPAQueryFactory jpaQueryFactory; public DownTimeScheduleRepositorySupport(final JPAQueryFactory jpaQueryFactory) { super(DowntimeSchedule.class..