이미지에서 사물을 분석해주는 모델(VGG16)을 사용해 API로 만들어보자
2024. 12. 11. 18:13
개발/Python
언젠가 AI를 해봐야지 생각하면서.. 미루고 있었다.perplexity(GPT) 와 채팅을 하면서 문득 사전에 학습된 모델을 알게되어VGG16 모델을 통해 이미지를 분석하는 테스트를 해보았다. VGG16먼저 VGG16 이란- 키보드, 동물, 연필 등의 정보를 1000개의 Class로 분류 가능- 3x3 커널을 사용- 모델 이미지 입력 크기 224x224 GPU (CUDA) 세팅CPU 를 사용했더니 너무 느려서 노트북에 내장되어 있는 그래픽카드를 셋업했다.필자의 그래픽 카드정보는 NVIDIA GeForce GTX 1650 Ti with Max-Q Design 이며,NVIDIA 사이트에서 Cuda를 지원하는지 체크하여 가능한 것임을 알았다. TensorFlow GPU 지원-소프트웨어 요구사항다음 NVIDIA..
Golang Test Standard
2024. 10. 10. 01:58
개발/기타
golang application 개발팀에서 테스트에 대한 가이드가 필요하다고 요청받아 찾아본 내용을 기술한다.좋은 사례로 Thanos Teams, Uber, Devocean, Buzzvil 의 내용을 참고하였다. Test Code의 표준화의 목적은 테이블 주도 테스트(Table-driven Test)로 개발자가 함수를 개발하며 여러 테스트 케이스를 수행해보며 중복을 제거할 수 있도록 표준을 정의한다. 먼저 테스트의 범위를 생각하면 아래 3가지의 항목이 존재한다.1. Data Access Layer - 데이터베이스와의 상호작용, SQL 쿼리 검증2. Business Layer - 비즈니스 로직이 의도한대로 작동하는가, 외부 의존성3. Presentation Layer - API Endpoint 또는 Co..
자바 Integer 비교 시 알아야 할 것
2023. 8. 12. 19:54
개발/JAVA
이번년도는 1월부터 개발 프로젝트로 매우 바빠서 블로그 쓸 시간이 없다ㅜ(핑계는..) 지난 주에 내부적으로 개발한 core 모듈에서 버그를 하나 찾았는데 내부적으로 만든 함수 중 객체 비교를 위한 메소드(isEquals)에서 Integer 타입에 대한 처리를 == 으로 했었던 부분이였다.당연히 객체간 데이터 비교에서는 .equals 를 사용해야 하는 것은 익히 알고 있었는데, == 으로 되어있었다는... 그럼 Integer 데이터간 비교는 왜 ==로 하면 안되는지 알아보자! 래퍼 클래스(Wrapper Class) 래퍼 클래스란 기본 타입의 데이터를 객체로 취급해야하는 경우 사용된다. - 기본 타입 데이터 타입 : byte,short,int,long,float,double,char,boolean (맨 앞이..
[Android] Thread로 간단한 처리해보기
2023. 6. 20. 13:33
개발/JAVA
서론 갑작스럽게 회사 후임이 안드로이드를 물어봐서 간단히 테스트 글을 적어본다. 요구사항은 시크바(SeekBar)를 조절하면서 지속적으로 다른 곳에 데이터를 전송하는 내용이다. 시크바란? 시크바는 사용자가 범위 내에서 값을 선택할 수 있도록 도와주는 막대 형태의 뷰입니다. 음량/밝기 조절, 이미지 필터 적용, 동영상 재생 등 다양한 곳에 활용됩니다. 결과적으로 사용자가 바를 터치하고 있는 상태의 데이터를 지속적으로 전달해야한다. (뭐 데이터가 변경될때만 보내면 간단한데, 변경이 아닌 사용자가 누르고 있는 상태에 대한 값을 보내고싶다고 했다) 그래서 Thread를 이용해서 0.3초마다 실행할 수 있도록 구현하고자한다. MainActivity 시크바의 리스너함수 start에서 Thread를 실행, stop에..
[Springboot] @JsonProperty는 언제 써야 할까!
2023. 2. 22. 00:07
개발/Spring
이번에 개발하다가 DB 테이블 컬럼 중 숫자형태의 'A_CNT' 이런 앞에가 짧은 컬럼이 있어서, 늘 하던대로 RequestDTO 에 aCnt 로 작성하고 난 뒤 Post 방식으로 데이터를 보내봤더니 자꾸만 0 이 넘어오는게 아닌가???? @JsonProperty 이 때 @JsonProperty를 쓰면된다.(변수가 많다면 @JsonNaming 으로 통합해도 됨) @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class Sample { @JsonProperty("a_cnt") private int aCnt; } 이렇게 하고 요청할 때 a_cnt 로 던지면 정상적으로 오게된다. 추가로 mybatis 에서 camelCase vo를 자동으로 변환해..
[MSA] SAGA pattern
2022. 12. 19. 13:44
개발/Spring
지난번 MSA 포스팅에 사용한 Outbox pattern글에 이어 SAGA pattern을 작성하려한다. MSA : Outbox Pattern MSA 아키텍처? 마이크로서비스아키텍처에 대한 화두가 널리 퍼진지 한 8년정도 된 것 같다. 대학교 1학년 때(2014년도)에 쿠버네티스에 대해 알게되어 도커컨테이너에 대해 공부했었던 기억이 있 flowlog.tistory.com Saga패턴 Saga 패턴은 간단히 말해 이벤트에 대한 보상트랜잭션을 발행할 수 있는 것이다. 가장 흔한 예로 주문서비스가 있는데, 재고-주문-결제 라는 하위 이벤트가 존재하게 된다. 이 때, 기존 프로세스라면 재고->주문->결제를 정상적으로 수행하는데 만약 결제에서 잔액부족의 이유로 결제취소가 이루어진다면 해당 주문건에 대한 트랜잭션 ..
[Springboot] 대용량 Select Query OOM 방지를 위한 스트림
2022. 12. 13. 00:12
개발/Spring
서론 대량의 select 쿼리를 날릴 때 대부분의 개발자들은 Memory 요소를 파악하지 못하는 것 같다. 이번에도 몇십만건의 데이터를 한번에 load 해서 front에 뿌리는 프로세스에서 was가 후두둑 죽어가는게 아닌가. 이전 프로젝트에서도 배치개발을 하던 과장급 프리랜서가 있었는데, 운영에 올리자마자 터지고 난리도 아니였다. 그들의 답변은 항상 '개발환경에선 잘된다, 단지 데이터가 많을 뿐 -> 인프라문제다.' 제발 메모리 이슈좀 알아서 해결해라!!!!!!!!!!!! 테스트 목적 '직접'해보자 Q. 수십~수백만 건의 데이터를 어떻게 사용자에게 보여줄 것인가??? 검색해보니 제일먼저 Mybatis fetchSize 조정이 있었다.(default 10) - 만약 1000개의 데이터를 select 한다면..
[MSA] Outbox Pattern
2022. 11. 4. 13:58
개발/Spring
MSA 아키텍처? 마이크로서비스아키텍처에 대한 화두가 널리 퍼진지 한 8년정도 된 것 같다. 대학교 1학년 때(2014년도)에 쿠버네티스에 대해 알게되어 도커컨테이너에 대해 공부했었던 기억이 있는데, 인프라(infrastructure)영역은 쿠버네티스, 오픈시프트(redhat), 탄주(vmware) 등의 오케스트레이터를 통해 널리 사용하고 있는 것 같다. 그럼 이제 어플리케이션영역이 마이크로서비스화 되어야한다. 필자는 작년 한 해동안 마이데이터 제공자 API 프로젝트를 openshift 기반 환경에서 진행하였는데, redhat 기반이라 해당 플랫폼에서 제공하는 3scale(API G/W), rhsso(인증), Fuse, Jboss 를 사용하여 컨테이너를 운용했다. 하지만 마이데이터 제공자는 단순히 Rea..
[JAVA] 간단한 .java 파일을 실행 가능한 .jar 파일로 만들고 도커 이미지로 쿠버네티스 cronjob 생성하기
2022. 11. 3. 13:35
개발/JAVA
어제 간단한 특정시간이 지난 뒤 프로세스가 종료되는 자바파일을 구현해야하는 상황이 생겼다. 그래서 jar 파일을 만들고 Dockerfile을 작성한 뒤 Docker image를 생성하고, 쿠버네티스 cronjob 에서 가져오는 것 까지해보았다. 먼저 .jar 파일은 그동안 maven, gradle을 통해 자동으로 쭈루룩 만들어줬었는데, 그냥 test.java main 메소드 하나 있는 것을 컴파일하여 나온 .class 파일과 매니패스트파일을 합치는 작업을 해주면 된다. 근데 이때 매니패스트 지정하는데에 시행착오를 겪었다.. (문자열 끝에 엔터가 필요하다고...) test.java 가장먼저 개발을 할 test.java 를 만들자. 간단히 Thread를 통해 3초의 대기를 준 뒤 프로세스가 종료되게 하였다...
[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/..
[Spring Cloud] Zipkin(집킨) 분산 추적 해보기
2022. 10. 26. 23:43
개발/Spring
Zipkin(집킨)은 스프링클라우드에서 제공하는 분산추적 서비스이다. Zipkin(집킨)서버와 sleuth(슬루스)가 있으며 집킨서버는 데이터를 보관 및 웹대시보드를 제공하며, 슬루스는 로그 데이터들을 잘 처리하여 집킨에 보내는 역할이다. 집킨서버의 데이터 저장소는 - 인메모리 - mysql - 카산드라 - elasticSearch 로 설정할 수 있으며 별다른 설정이 없을 경우 인메모리(WAS)에 저장하게 된다. Zipkin 구동 간단히 도커를 통해 기동하며 port는 default 9411 을 사용한다. docker run -d -p 9411:9411 openzipkin/zipkin Pom.xml zipkin 사용을 위한 라이브러리 추가 위에서 설명했듯이 슬루스란 친구를 통해 데이터를 zipkin서버에..
[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..
[GIT] 불필요한 파일 업로드 제한하기
2022. 10. 13. 11:16
개발/기타
지난 spring 멀티 모듈프로젝트 구성 후 이것저것 테스트를 하다가 target 폴더 제한하는 방법을 기록해두려한다. 뭐 이미 알고 있듯이 .gitignore 파일을 작성하면 된다. 추가로 이미 업로드 된 상태라면 git rm -r --cache [폴더]로 지운 뒤 push 해주면 된다. .gitignore 파일 작성 git clone 후 최상단 경로에 작성해야 한다. # ignore properties file test/core/target test/market/target test/target/ .metadata test/.settings test/core/.settings test/market/.settings 적당히 target 과 .settings / .metadata 폴더를 제외시켰다. 참고..