[Springboot] 대용량 Select Query OOM 방지를 위한 스트림
2022. 12. 13. 00:12
개발/Spring
서론 대량의 select 쿼리를 날릴 때 대부분의 개발자들은 Memory 요소를 파악하지 못하는 것 같다. 이번에도 몇십만건의 데이터를 한번에 load 해서 front에 뿌리는 프로세스에서 was가 후두둑 죽어가는게 아닌가. 이전 프로젝트에서도 배치개발을 하던 과장급 프리랜서가 있었는데, 운영에 올리자마자 터지고 난리도 아니였다. 그들의 답변은 항상 '개발환경에선 잘된다, 단지 데이터가 많을 뿐 -> 인프라문제다.' 제발 메모리 이슈좀 알아서 해결해라!!!!!!!!!!!! 테스트 목적 '직접'해보자 Q. 수십~수백만 건의 데이터를 어떻게 사용자에게 보여줄 것인가??? 검색해보니 제일먼저 Mybatis fetchSize 조정이 있었다.(default 10) - 만약 1000개의 데이터를 select 한다면..
[Gradle] build Error - validity check failed
2022. 12. 10. 23:08
엔지니어링/기타
얼마전에 NCP(Naver Cloud Platform) 프로젝트 중 개발사에서 Gradle 기반의 springMVC 이미지를 빌드 에러가 난다고 연락이 왔다. PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed 개발사 말로는 local 환경에서는 정상적으로 라이브러리를 가져올 수 있으나, Naver 빌드시 보안상 오류가 아니냐고 해서 확인 요청이 온 것이다. 결과적으로는 라이브러리 사이트에서 tls 인증서가 만료가 된 상황이였다. 오픈이 1주일도 안남은 상태에서 정신없다보니 그런거라 생각하며.. 필자도 1시간동안 찾아 해멘 끝에 이 것을 찾을 수 있었다. 보통 개발자들이 로컬환경에서..
[Springboot] Fabric8 kubernetes 리소스 컨트롤하기
2022. 10. 26. 23:59
개발/Spring
스프링부트에서 쿠버네티스 리소스를 컨트롤하기 위해 제공되는 라이브러리가 2개 있다. 하나는 kubernetes에서 제공하는 것이고 또 하나는 Fabric8 에서 제공하는 라이브러리이다. 이 두개의 차이는 이 링크에서 아주 잘 설명하고 있다. 위 링크에서 대충 보자면 kubernetes는 객체를 선언하고 하는 작업들이 많고 Fabric8은 웹소켓을 이용한다는 것이다. (소스 구현부도 Fabric이 편해보임..) 이제 간단히 k8s 리소스를 가져와보자. Pom.xml k8s / ocp 라이브러리가 따로 존재한다.(필자의 현재 코드는 k8s용) io.fabric8 kubernetes-client 6.1.1 io.fabric8 openshift-client 6.1.1 Controller 간단히 GET /k8s/..
[Springboot] Sse(Server Send Event) 단방향 통신을 이용해 tail -f 기능 구현
2022. 10. 26. 23:27
개발/Spring
난 이걸 왜 쓰게되었나? OCP 웹콘솔에 보면 pod의 log를 지속적으로 호출하는 페이지가 있는데, 말 그대로 서버가 클라이언트 쪽에 로그를 일방적으로 보내는 방식인거 같았고, 이걸 구현해보고 싶다는 생각이 들어 통신모듈을 찾아보다가 SSE(Server Send Event)라는 라이브러리를 알게되어 찾아보니 보통 접속중인 사용자에게 push 알림을 보내는 용도, 스포츠 중계서비스에 이용할 수 있다. 필자는 리눅스에서 로그 파일을 볼 때 이용하는 tail -f 기능으로 활용해보려한다. 단방향 통신을 위한 모듈 SeeEmitter 클래스는 2015년(Spring Framework 4.2)부터 사용할 수 있게 되었다. Internet Exporer를 제외한 모든 브라우저를 지원한다. HTTP/1.1 프로토콜..
[Springboot] kafka JSON 통신하기
2022. 10. 25. 21:32
개발/Spring
그동안 메시지 큐에 대해 알고만 있지 사용은 해보지 않았다. 메시지 큐는 어떤 서비스A가 서비스B에게 데이터를 전송할 때 서비스B가 만약 메모리등의 이슈로 정상적인 응답을 하지 못할 경우 해당 요청에 대한 데이터에 유실이 발생할 수 있어서 그 중간 매개체로 사용하게 된다. 실제로 작년에 ELK, EFK 를 구축할 때 메시지 큐를 포함한 아키텍처를 많이 보았었다. filebeat 에서 Logstash로 데이터를 전송할 때나, Logstash에서 Elasticsearch 에 데이터를 전송할 때 메시지큐를 사용하는 것이다. 메시지 큐는 카프카(Kafka), 레빗엠큐(RabbitMQ) 등의 솔루션이 있고, 이 글은 카프카를 사용하여 JSON 타입의 메시지 전송을 해볼 것이다. 카프카(Kafka) 카프카는 도커로..
[Springboot] springBoot와 springCloud 버전 맞추기
2022. 10. 24. 17:36
개발/Spring
스프링부트 application을 개발하던 중 스프링 클라우드 zipkin 을 사용하려다 에러가 발생하였다. configurationPropertiesBeans' defined in class path resource [org/springframework/cloud/autoconfigure/ConfigurationPropertiesRebinderAutoConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.context.properties.Co..
[Springboot] Maven 멀티 모듈 프로젝트 만들기(Eclipse)
2022. 10. 4. 16:02
개발/Spring
이제는 쿠버네티스 서비스가 주로 이루면서, 마이크로서비스아키텍처 서비스개발이 많이 진행되어가고 있다. spring 에서도 gateway, discovery, config 등 cloud 서비스를 구축하는데에 필요한 데모프로젝트들이 많이 있는데, 오늘은 Maven 멀티 모듈 프로젝트를 구성을 포스팅한다. Maven Project 생성 가장 먼저 Eclipse 를 키고 New>Maven Project 를 선택한다. 상위 프로젝트 프로젝트 타입 Maven Project 프로젝트 이름 test 패키지 이름 com.joon95.test Maven Module 생성 이제 1에서 생성한 project를 우클릭>New>Other Maven Module을 생성한다. 테스트로 core, market 프로젝트를 만들었다. 하..
[Springboot] Exception 처리하기
2022. 8. 4. 16:07
개발/Spring
springboot 로 RestApi 를 만들다보니 Exception 처리는 필수이다. 한번 해보자. 에러는 {“error”:”에러코드”,”error_decription”:”에러설명”} 위와 같이 내보낼 것이다. ErrorEnum 정의 @Getter public enum ErrorEnum { /* API 응답 코드 */ E00000("00000", "처리 성공", HttpStatus.OK), E40401("40401", "요청한 엔드포인트가 존재하지 않습니다.", HttpStatus.NOT_FOUND); E50002("50002", "API 요청 처리 실패.", HttpStatus.INTERNAL_SERVER_ERROR); private String code; private String msg; priv..
[Springboot] JPA 적용
2022. 8. 4. 15:50
개발
springboot 개발을 할 때 늘 mybatis를 사용하여 mapper.xml에 SQL쿼리를 작성해 database 로직을 구현했었다. 언제부턴가 JPA라는 말이 자주 들려오고 있는데, 이제야 테스트를 해본다. JPA(Java Persistence API)와 mybatis와 비교하자면 먼저 Mybatis 는 SQL자체로 xml 파일을 분리할 수 있으며, 복잡한 쿼리 작성의 장점이 있지만, 간단한 쿼리들을 많이 작성하여 코드가 길어지는 단점이 있다. JPA 는 CRUD 메소드가 이미 정의되어있어 sql을 직접 구현할 필요가 없기 때문에 소스코드의 양이 적어지는 점, 또 database 와 연결되어 table 생성을 자동으로 할 수도 있다. 하지만, 복잡한 쿼리의 사용은 JPQL 또는 Query dsl ..
[Springboot] swagger 3.0 설정
2022. 8. 4. 10:30
개발
젤 중요했던거.... 3 버전 대는 접근 URL 이 '/swagger-ui' 이다. pom.xml 먼저 pom.xml 에 관련 라이브러리를 추가 io.springfox springfox-boot-starter 3.0.0 io.springfox springfox-swagger-ui 3.0.0 config 설정 @Configuration @EnableSwagger2 @EnableWebMvc public class SwaggerConfig { private ApiInfo swaggerInfo() { return new ApiInfoBuilder().title("2022 토이 프로젝트") .description("나만의 OAUTH 인증 솔루션 제작기 - 임준혁").build(); } @Bean public Do..
[Springboot] CSRF Token 설정 시 Postman 테스트 방법(Spring Security)
2022. 8. 4. 10:25
개발
스프링 시큐리티는 POST, PUT, DELETE 등의 method를 요청할 때 이전 페이지에 발급된 CSRF토큰 정보를 체크하기 때문에 해당 정보를 header 로 넘겨주어야 처리가 된다. GET은 상관없음! 어쨋든 테스트 API 를 만들고 postman으로 요청을 해보았는데 자꾸 403 forbidden 에러가 떨어진다. 그래서 CSRF token 이 발급되는 설정을 하고, API를 요청할 때 'X-XSRF-TOKEN' 이라는 이름의 헤더이름으로 token을 넣어주면 된다. CSRF Token 발급 설정 @EnableWebSecurity @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter{ @Override p..