728x90
반응형

전체 글 846

SQS와 SSE를 이용한 Proxy 서버 만들기

기사용앱에서 특정 데이터를 승객용 앱에 내려주기 위해서 Server에서 정보를 Proxy 해 주어야 하는데 이와 관련하여 기사용 앱에서 내용을 올려주는 거야 단순히 API 하나를 호출하면 끝나지만, 승객용 앱 입장에서는 언제 내용이 변경되는지 알 수 없어서 고민하던 차에 SQS와 SSE를 사용해서 prototype을 만들어 봤다. 물론 승객용 앱에서 주기적으로 Polling 해서 만들 수도 있지만 조금 더 좋은 방법이 무엇인지 고민하면서 개발을 하게 되었다. 아직 오픈이 안된 상태이므로 잘못된 소스일 수도 있다. 간단한 구조는 아래와 같다. 일단 SQS는 AWS를 쓴다는 입장에서 사용할 수 있는 간단한 Queue 다. 기사용 App에서 특정 API를 호출하게 되면 해당 내용을 SQS에 담는다. @Slf4..

Java/Spring 2021.01.22

Asynchronous Methods 만들기

본 내용은 spring.io/guides/gs/async-method/ 를 참고하여 작성한다. CompletableFuture가 어떻게 동작하는지 확인한다. 코드가 동작하는 시나리오는 https://api.github.com/users/{user} API를 호출하여 그 결과를 보여주는 것이다. 동시에 3개의 API를 호출하게 될 경우 sync로 받게 될 경우 1개의 API 당 1초가 걸리게 될 경우 3초 + Alpha의 시간이 걸릴 것인데 결과는 어떻게 나오게 될지 확인해 본다. 먼저 값을 담아 올 User 객체를 만든다. 참고로 Api Response는 다음과 같다. { "login": "pivotalsoftware", "id": 4247270, "node_id": "MDEyOk9yZ2FuaXphdGl..

Java/Spring 2021.01.14

Spring Cloud Gateway - Custom Filter

Custom Filter의 기본적인 동작 방식에 대해 알아본다. 기본적인 내용은 docs.spring.io/spring-cloud-gateway/docs/2.2.6.BUILD-SNAPSHOT/reference/html/#writing-custom-global-filters 를 참고하면 되지만 매뉴얼의 특성상 자세하게 나오지 않아서 이해를 위해 www.baeldung.com/spring-cloud-custom-gateway-filters 를 참고하였다. 필터는 기본적으로 Proxied Service로 들어가기 전에 수행하는 Pre filter와 나오면서 수행하는 Post filter가 있다. 또한 org.springframework.core.Ordered 인터페이스를 구현하게 되면 순서에 따라 실행 되는데..

Architecture/MSA 2021.01.08

Spring Cloud Gateway - CORS Configuration

Global CORS 정책을 셋팅할 수 있습니다. spring: cloud: gateway: globalcors: cors-configurations: '[/**]': allowedOrigins: "https://docs.spring.io" allowedMethods: - GET 위의 예는 docs.spring.io 에서 GET으로 호출하는 것만 허용하는 경우이다. POST도 포함하고 싶으면 다음 처럼 열거해 주면 된다. - GET - POST CORS와 관련된 기본 정보는 developer.mozilla.org/ko/docs/Web/HTTP/CORS 참고. 위와 같이 CORS를 셋팅해 주지 않을 경우 POSTMAN 을 통한 호출처럼 호출할 경우 상관 없지만 script를 통해 호출할 경우 호출이 안되는..

Architecture/MSA 2021.01.07

Spring Cloud Gateway - Http timeouts configuration

http 관련 타임아웃 설정을 할 수 있다. Global timeouts 전역 설정 식으로 모든 것에 적용 되는 설정을 할 수 있다. spring: cloud: gateway: httpclient: connect-timeout: 1000 response-timeout: 5s Per-route timeouts 각 route 룰 마다 타임아웃을 별도로 줄 수 있다. 아래는 yml 서정 방식 - id: per_route_timeouts uri: https://example.org predicates: - name: Path args: pattern: /delay/{timeout} metadata: response-timeout: 200 connect-timeout: 200 아래는 Java 설정 방식 RESPO..

Architecture/MSA 2021.01.07

Spring Cloud Gateway - Route Metadata Configuration

route 룰에 meta data를 넣을 수 있다. yml 파일의 경우 아래와 같은 방법으로 하면 된다. spring: cloud: gateway: routes: - id: route_with_metadata uri: https://example.org metadata: optionName: "OptionValue" compositeObject: name: "value" iAmNumber: 1 Java 로 할 경우에는 다음과 같이 한다. import static org.springframework.cloud.gateway.support.RouteMetadataUtils.CONNECT_TIMEOUT_ATTR; import static org.springframework.cloud.gateway.suppor..

Architecture/MSA 2021.01.07

Spring Cloud Gateway - Configuration

yml 파일에 기록한 config를 어떻게 적용 시키는지에 대한 내용으로 보임. 기본적으로 RouteDefinitionLocator 인터페이스를 구현한 PropertiesRouteDefinitionLocator 에서 Springboot의 기본 configure 로딩 방법인 @ConfigurationProperties 메카니즘에 의해 설정을 로딩하게 되어 있다. 매뉴얼에서는 Shortcut notation 방법과 이름 기반하의 설정이 동일하다고 말하고 있다. spring: cloud: gateway: routes: - id: setstatus_route uri: https://example.org filters: - name: SetStatus args: status: 401 - id: setstatuss..

Architecture/MSA 2021.01.07

Spring Cloud Gateway - HttpHeadersFilters

ForwardedHeadersFilter from의 헤더를 to 로 복사해서 보내주는 역할을 하는 것으로 보인다. package org.springframework.cloud.gateway.filter.headers; public class ForwardedHeadersFilter implements HttpHeadersFilter, Ordered { /** * Forwarded header. */ public static final String FORWARDED_HEADER = "Forwarded"; ... @Override public HttpHeaders filter(HttpHeaders input, ServerWebExchange exchange) { ServerHttpRequest request..

Architecture/MSA 2021.01.07

Spring Cloud Gateway - Custom Predicate with AbstractRoutePredicateFactory

특정 조건에 특정 route를 적용할 것인지 정의 내리는 것을 predicate 라고 하는데 이미 정의 된 predicate 말고 Custom predicate를 만들 수 있다. AbstractRoutePredicateFactory 추상 클래스를 상속받아 몇 가지만 구현해 주면 된다. import lombok.Getter; import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory; import org.springframework.validation.annotation.Validated; import org.springframework.web.server.ServerWebExchange; import ja..

Architecture/MSA 2021.01.06

Spring Cloud Gateway - Global Filter

기본적인 GlobalFilter 사용법 Global Filter를 커스터마이징 해서 사용하는 방법은 GlobalFilter 인터페이스를 구현하여 filter를 재정의 하면 된다. @Slf4j @Component public class MacaronCustomGlobalFilter implements GlobalFilter, Ordered { @Bean public GlobalFilter customFilter() { return new MacaronCustomGlobalFilter(); } @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("##################### cust..

Architecture/MSA 2021.01.06

Spring Cloud Gateway - Route Predicate & Gateway Filter Factory

Gateway를 만들면서 사용할 수 있는 룰들을 셋팅하는데 있어서 구글링 및 공식 Document를 보는 것에 시간이 걸려 하나씩 정리해 둔다. 참고로 사용하게 되는 Predicate Factory는 org.springframework.cloud.gateway.handler.predicate 아래에 있다. ( github.com/spring-cloud/spring-cloud-gateway/tree/2.2.x/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate ) @Autowired private SecureHeadersProperties secureHeadersProperties; /** ..

Architecture/MSA 2020.12.28

API 호출 테스트를 위한 간단한 팁

api 호출을 할 경우 일부러 타임아웃 Exception과 같은 상황을 만들어서 테스트 하는 경우가 있다. 이럴 경우 Target API에 일부러 Sleep을 주어 상황을 만들어서 작업을 하였는데 그렇게 할 필요가 없다. spring.io/guides/gs/gateway/를 보면서 Srping Cloud Gateway를 구축하고 있는데 예제로 사용되어지는 httpbin.org 이라는 사이트를 이용하면 된다. 가령 간단하게 3초 딜레이 되는 경우를 테스트 하고 싶다면 http://httpbin.org/delay/3 이라고 호출하면 된다. 전체적인 내용은 swagger로 정리되어져 있기 때문에 http://httpbin.org 메인을 참고하면 된다. httpbin.org A simple HTTP Reques..

Java/Spring 2020.12.21

Hystrix, Feign을 이용한 개발

아직 프로토타입까지만 작성하였지만 기본적인 내용이 돌아가기에 현재의 상태를 기록한다. application.yml 파일 feign: hystrix: enabled: true client: config: feignName: connectTimeout: 5000 readTimeout: 5000 loggerLevel: full hystrix: command: default: # 5초 타임아웃. 1분동안 최소 5회 호출 이상, 50% 이상 실패면 circuit open execution: isolation: thread: timeoutInMilliseconds: 5000 metrics: rollingStats: timeInMilliseconds: 60000 circuitBreaker: requestVolumeT..

Architecture/MSA 2020.12.18

AttributeConverter class registered multiple times 에러가 발생할 경우

다른 사람이 Push 해 둔 소스를 Pull 받아 Springboot를 실행하는데 "AttributeConverter class registered multiple times" 에러가 뜨면서 실행이 되지 않았다. 관련된 에러가 Entity의 Converter 부분이여서 Database 연동 문제인줄 알고 intellij에서 Database source를 연결하였지만 실패... 구글링 해 보니 해당 Converter가 여러 곳에서 사용되면 그런 문제가 발생된다는 답이 몇 개 보여 converter를 사용 하는 곳을 다 주석 처리해 봐도 안되서 실패... 결국 로컬 Git repository 삭제 후 다시 Clone 받아서 실행해 보니 성공 함.

Java/Spring 2020.12.16

Zuul을 이용한 Gateway 구축 시 설정

Zuul을 이용하여 MSA의 Api Gateway 구축을 테스트 삼아 하고 있는데 설정 값을 지정하면서 알게 된 내용을 정리한다. application.yml 파일을 아래와 같이 설정 하였다. spring: application: name: api-gateway server: port: 8801 eureka: instance: instance-id: zuul-inst001 client: service-url: defaultZone: http://localhost:8761/eureka zuul: routes: chauffeur: path: /chauffeur/** stripPrefix: true path 에 지정하는 값은 client에서 api gateway로 호출할 때의 url path 이다. 해당 pa..

Architecture/MSA 2020.12.11

테스트 코드 작성 시 willReturn 값이 안나오는 경우

오랜만에 테스트 코드를 작성하기 위해 구글링 해서 작성을 했는데 내가 짜 놓은 시나리오대로 동작을 하지 않아 더 구글링, 그리고 주변에 사람들에게 질문을 하였지만.... 해답은 안 보였다. 작성한 테스트 코드는 아래와 같다. import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springf..

Java/Spring 2020.12.02

MSA 관련 북마크

futurecreator.github.io/2018/09/14/what-is-microservices-architecture/ 마이크로서비스 Microservices (1) 아키텍처 소개 주변에서 마이크로서비스 아키텍처(Microservices architecture; MSA)에 대한 이야기가 많이 들려옵니다. 마이크로서비스가 모든 것을 해결해줄 것처럼 이야기하는 사람이 있는가하면, 서비스 지향 아키 futurecreator.github.io futurecreator.github.io/2018/09/14/microservices-with-api-gateway/ 마이크로서비스 Microservices (2) API 게이트웨이 이전 포스트에서 마이크로서비스 아키텍처의 개념을 살펴봤습니다. 이번 포스트에서는 ..

Architecture/MSA 2020.11.20

아마존 한국 설명서 참 힘들다...

CodeDeploy 관련해서 설명서 보다가... 아래와 같은 링크를 보았다. https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/instances-health.html#instances-health-status CodeDeploy 인스턴스 상태 - AWS CodeDeploy CodeDeploy 인스턴스 상태 CodeDeploy는 배포 그룹의 인스턴스 상태를 모니터링합니다. 정상 인스턴스 개수가 배포 중 배포 그룹에 대해 지정한 최소 정상 인스턴스 개수 미만인 경우 배포에 실패합니 docs.aws.amazon.com '개정상태' 라고 나와서 개정이 뭘까? 란 생각이 들었다. 계정도 아니고 개정이라... 뭔가를 수정하고 정정한다는 의미인건가? 하고 ..

Develop? 2020.05.11

MySQL Window 설치 삽질 후기...

AWS에 있는 Aurora MySQL에 접속하기 위해 MySQL Workbench를 깔아 접속을 하려 하였지만 실행되자 마자 프로세스가 죽어 버리는 문제 발생. 여기 저기서 들은 말로는 .NET Framework가 설치되어 있지 않아서라는 말을 듣고 설치하려 했지만 이미 최신 버전이 깔려 있는 상태... 그래서 그냥 Workbench 말고 MySQL을 통으로 설치하려 함. 통으로 설치 하고 마지막에 뭔가 Config를 처리하는 과정에 오류 발생. 아래와 같은 이미지가 뜸 삽질은 시작 됨. 찾아 보니 컴퓨터 이름이 한글일 경우 안된다고 해서 찾아 보니 회사에서 기본으로 설정해 둔 컴퓨터 이름이 '내이름-PC' 였음 ㅠㅠ 그래서 이름 변경 후 다시 설치 하였지만 동일한 문제... MySQL 관련된 내용을 다..

Develop!/MySQL 2020.03.30

Springboot + JPA + JTA (Atomikos) + MySQL 을 이용한 멀티 트랜잭션 구현

두 개의 물리적으로 다른 Database에 트랜잭션을 적용하기 위해서 JTA를 사용해야 한다는 것을 듣고 그 중에 Atomikos를 사용하면 된다는 이야기에 구현을 해 보았다. 구글링을 해 보아도 이런말 저런말들이 많고 예전 기준으로 구현된 것도 많고 소스들이 너무나도 달라 뭘 어떻게 따라 해야 할지 막막했는데... 그리고 주로 MyBatis 기준으로 작업이 되어 있어서 답답한 감이 있었는데 JPA 기준으로 작업을 할 수 있도록 4일 정도 삽질 끝에 완성하여 백업 차원에서 기록으로 남긴다. 먼저 Legacy Database와 새롭게 사용하는 Database가 있다는 가정하에 아래와 같이 작업을 해야 한다. 먼저 사용한 의존성은 아래와 같다. build.gradle dependencies { impleme..

Java/Spring 2019.12.05

멀티 DataSource 접속 방법 정리

한 개의 프로젝트에서 하나의 Database에만 접속하는 경우가 대부분이지만, 2개 이상의 데이터 베이스에 접속하는 경우도 발생하게 된다. 이럴 경우 어떻게 셋팅을 해야 하는지 정리한다. application.yml 설정파일 spring: profiles: active: local application: name: usercms application-local.yml server: port: 9090 spring: profiles: local domain: localhost datasource-a-write: driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://a-db-url:3306/a?autoReconnect=true&useSSL=fals..

Java/Spring 2019.08.13

Spring Batch, Migration, 튜닝 및 OOM 해결 후기

회사에서 진행하는 새로운 프로젝트를 위해서 회원 정보 1,000만건에 가까운 데이터를 마이그레이션 해야 하는 작업이 필요 했다. 회원 정보만 1,000만건이고 기타 회원이 가지고 있는 부가적인 정보들을 포함하자면 거의 1억건에 가까운 데이터로 보여졌는데 이를 어떻게 마이그레이션 해야 하나 고민이 깊었다. 기존 레거시 시스템에서 새로운 시스템으로 이전을 해야 해서 내부적으로 새로운 데이터 베이스 시스템에 맞게 구조를 변경하고 적절한 로직을 가미해서 옮겨야 했기 때문에 단순 데이터 이전은 아니였다. 할줄 아는 거라고는 별로 없으니 Spring Batch를 사용할 수 밖에... 한동안 JPA를 편하게 써 와서 JPA를 사용하고 싶었지만... Bulk Insert가 없어서 저 많은 Insert문을 날리느니 안하..

Java/Spring 2019.08.12

QueryDSL 사용하기

JPA를 사용하면서 QueryDSL을 셋팅하고 사용하는 부분에 있어서 매번 헷깔려 정리한다. QueryDSL을 사용하기 위해서 build.gradle 파일에 아래의 내용을 추가 해 준다. plugins { ... id 'idea' id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' ... } dependencies { ... implementation 'com.querydsl:querydsl-apt:4.1.4' implementation 'com.querydsl:querydsl-jpa:4.1.4' ... } ext { querydslSrcDir = 'src/main/generated' queryDslVersion = '4.1.4' } configuratio..

Java/Spring 2019.08.08

세상은 참으로 다양한 사람이 산다...

인종 차별이나 인격에 대한 비하 발언도 아니고....단지 팩트는...사람 간에 똑똑함과 미련함의 차이가 생각보다 크게 난다는 것이다.이미 알고 있는 사실이고...많이 느껴 왔지만...오늘 새삼 더 느끼게 된다. 취업이 힘들다 말하지 말고...본인이 왜 취업이 안되는 것인지 돌아보고 조금 더 노력해 보자... 취업이 잘 되는 사람들이 본인들보다 왜 더 잘 되는 것인지...얼마나 더 많이 노력하는 것인지...그래서 나보다 얼마나 무엇을 더 알고 있는지 돌아보자. 그 갭이 생각보다 매우 크다는 것을 깨닫게 될 것이고..그 갭을 채우려면 지금보다 더욱더 치열하게 노력하지 않은 이상...그들과 같은 레벨로 올라서기에는 한계가 있다는 것을 알게 될 것이다.

파라미터에 따라 특정 변수에 값 Set 하기

Java로 Entity를 만들고 멤버 변수로 1 ~ 31일을 만들어 둔 다음 넘오는 날짜에 따라 특정 날짜 변수에 값을 담는 작업을 하다 알게 된 내용이다. 역시 새롭게 알게 된 내용이라 정리 차원으로 올린다. MontTimeTable Entity는 아래와 같다. @Entity @EntityListeners(value = {AuditingEntityListener.class}) @Data @Table(name = "month_timetable") public class MonthTimetable { @Id @Column @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private Integer policy_inst..

Java/Spring 2018.10.24

JPA QueryDsl 에서 Group By Count 값 가져오기

JPA, QueryDsl 쓰기 참 힘들다. 그래도 하나 하나 어렵게 해 나가고 있는데 오늘은 또 Group By한 Count 개수를 반환하는 것을 만든 삽질 내용을 올린다. 리파지토리 단 소스는 아래와 같다. @Override public QueryResults getBusinessTotalCount() { QUser user = QUser.user; return from(user).where(user.userType.eq(UserType.B2B)).groupBy(user.platform).select(user.platform, user.platform.count()).fetchResults(); } 그리고 가지고 온 내용을 가지고 맵으로 이쁘게 정렬해서 반환해 주면 된다. public Map getBu..

Java/Spring 2018.09.28

RestTemplate에서 PUT으로 파라미터 전송하기

http로 값을 전송 하면서 보통 GET, POST를 많이 쓰고 PUT 으로는 전송을 잘 안하게 되는데, PUT으로 받아야 하는 API를 만들다가 값이 잘 전송이 안된다는 것을 알게 되었고, 이럴 때 어떻게 값을 전송해야 하는지 삽질의 결과물을 남겨 둔다. 보통 postman을 사용하여 값을 전송하는데 POST일 경우에는 body의 Typ을 form-data 또는 raw를 하게 된다. PUT일 경우에도 form-data 로 전송하니 값을 받을 수 없어서 이리 저리 확인해 보니 PUT일 경우에는 다음과 같이 전송 해야 한다. 이와 마찬가지로 Spring에서 RestTemplate를 이용하여 PUT 파라미터를 전송하게 될 경우 아래와 같이 하여야 한다. MultiValueMap body = new Linke..

Java/Spring 2018.09.13

Jackson ObjectMapper에서 json data를 Map이 아니라 Object로 받기

API 통신을 하면 보통 데이터 외에 Code나 Message가 같이 오고, 필요한 데이터는 한번 가공해서 받아야 한다. 그런데 이렇게 받게 되는 경우 안의 데이터가 무조건 HashMap으로 받아지게 된다. 이런 경우에 원하는 Object로 받기 위해 제네릭을 사용해 보았지만 역시 맵으로만 받아지게 되어서 구글링을 통해 해결하였다. 다음과 같은 방법으로 사용하면 된다. import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.core.type.TypeReference; String response = restTemplate.p..

Java/Spring 2018.09.12

캐릭터셋에 대한 고민...

회사에서 sms 발송 시 특정 문자가 깨져 나가는 문제가 발생...sms 발송 시스템은 "세X 텔레X"을 사용 하는데 특정 DB에 값을 넣어 두면 jar로 실행 되는 데몬이 해당 DB 값을 읽어서 발송 하는 방식임.DB에 값이 들어갈 때까지 UTF-8 형식이고 깨지지 않고 들어가는데, 실제 폰에서 받아 보기만 하면 깨지는 상황.깨지는 문자는 "–" 임. 일반 키보드에서 치는 "-"와는 다르고, 워드나 한글 등에서 copy & paste 한 것으로 보임.실제 폰에서 받아 볼 경우 해당 문자는 "?"으로 치환 되어 옴. 해당 현상을 재현 하기 위해 php에서 테스트 해 보았으나 재현 안되고Java에서는 아래와 같은 방식으로 재현 됨. 콘솔에 찍힌 결과 값은 아래와 같음.euckrString : 201? 21..

Develop! 2018.03.21
728x90
반응형