• [Devops] ELK - APM 연결 실패 이슈

    [Devops] ELK - APM 연결 실패 이슈

    APM url 문제로 연결 실패 2024-04-23 17:04:03,502 [elastic-apm-server-reporter] ERROR co.elastic.apm.agent.report.IntakeV2ReportingEventHandler - Failed to handle event of type METRICSET_JSON_WRITER with this error: Contains non-LDH ASCII characters 2024-04-23 17:04:03,502 [elastic-apm-server-reporter] INFO co.elastic.apm.agent.report.AbstractIntakeApiHandler - Backing off for 36 seconds (+/-10%) spring..

  • [React] react template 만들어놓기

    [React] react template 만들어놓기

    모든 코드는 깃허브에 있습니다. 개발환경 설정 0. LICENSE 파일 생성 (MIT) MIT License Copyright (c) 2024 TeTedo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copie..

  • 신입 개발자가 7일 동안 출시할 프로젝트의 PM 맡은 썰

    신입 개발자가 7일 동안 출시할 프로젝트의 PM 맡은 썰

    신입 개발자가 7일 동안 출시할 프로젝트의 PM 맡은 썰 1. 발단 회사에서 출시할 블록체인 지갑 앱을 개발중이고 나는 풀스택 개발자로 근무하고 있다. 앱에 대한 소개용 홈페이지, 어드민 백오피스를 풀스택으로 처음부터 내가 개발했었다. 앱에서 결제, 전송 기능등 블록체인에 관련한 프로세스들은 내가 주도해서 설계하고 개발하였기 때문에 홈페이지, 백오피스, 앱 전체적인 부분을 알고 있었다. 어느정도 개발의 막바지를 향하고 있는데 대표님 앞에서 시연이 필요한 상황. 우리팀에겐 3주간의 시간이 있었고 기획자와 PM이 없는 상황이지만 어느정도 다 개발되어있었기 때문에 여유가 있다고 판단했다. 시간이 지나 1주일이 남은 시점 시간이 부족할수도 있겠다고 판단해서 점심먹다가 PM을 맡겠다고 선언. 사수와 다른 개발자들..

  • [CS] DNS란 무엇인가?

    [CS] DNS란 무엇인가?

    DNS란 무엇인가? 발단 route53 에서 여러가지 실험을 해보다가 hostzone을 삭제하고 다시 생성 후 ALB를 적용하여 요청했는데 dns를 못찾음. 검색을 해보다가 AWS Route53에서 Record 변경 사항이 적용되는 시간의 질문을 보고 DNS 캐시를 인지했고 예전에 들어보기만 했던 DNS 캐시에 대해서 찾아보다가 DNS의 동작방식에 대해 알게 됨. 문제의 원인은 route53과 등록된 도메인의 네임서버가 다른게 원인이었지만 문제를 해결하며 알게된 DNS와 관련된 내용을 정리하려고 한다. DNS란? DNS란 Domain Name System의 도메인 이름을 ip로 바꾸거나 그 반대의 변환을 수행할 수 있도록 하기 위해 개발되었다고 한다. 사람이 이해하기 쉬운 도메인 이름을 IP 주소로 변환..

  • [AWS] aws 서버에 ssh 로 깃설정하기 (ubuntu 22.04)

    [AWS] aws 서버에 ssh 로 깃설정하기 (ubuntu 22.04)

    (1) 깃 시작 git init (2) ssh config 설정 sudo vi ~/.ssh/config Host my_ssh HostName [ip] User ubuntu IdentityFile [pemkey 경로] (3) git 추가 git remote add origin ssh://my_ssh:[aws ec2에 .git 경로] 예시 git remote add origin ssh://my_aws_server:/home/ubuntu/foobar.git

  • [개인 프로젝트] Around Flavor (주변 음식점 랜덤 찾기) 후기

    [개인 프로젝트] Around Flavor (주변 음식점 랜덤 찾기) 후기

    주변 음식점 랜덤 찾기 항상 점심시간이나 낯선 공간에 갔을때 귀차니즘으로 음식점을 찾아보지 않는 나같은 사람들을 위해 개발했다. 비슷한 기능을 하는 웹이나 앱이 널리고 널렸지만 생각을 실천으로 옮기는 첫번째 프로젝트라 나름 재밌게 개발했다. 개발하면서 나름 고민했던 부분들을 공유하기 위해 글을 쓴다. Web Link : Around Flavor 1. 구글맵 구현 먼저 네이버지도, 카카오맵 등도 많은데 구글맵을 선택한 이유는 글로벌한 프로젝트를 만들어보고 싶어서이다. 구글맵은 프론트(react)에서 구현을 했다. GoogleMapsPlatform에서는 nodejs의 예시코드가 있었기 때문에 react를 위한 라이브러리를 선택해야 했다. react-google-maps/api와 google-map-react..

  • [JPA] maven에서 querydsl Q class 생성

    [JPA] maven에서 querydsl Q class 생성

    maven에서 querydsl Q class 생성 maven 환경에서 querydsl 를 사용하려고 했는데 Q class가 안생겨서 삽질했던 경험을 적어본다. pom.xml com.querydsl querydsl-apt 5.0.0 com.querydsl querydsl-jpa 5.0.0 com.mysema.maven apt-maven-plugin 1.1.3 process target/generated-sources/java com.querydsl.apt.jpa.JPAAnnotationProcessor 처음에 이렇게 설정했는데 Q클래스가 생기지 않았다. plugin에서 Entity 어노테이션을 Q클래스로 변경해주는데 아무설정을 안해주면 javax 패키지의 Entity만 찾는것이었다. 그래서 jakarta ..

  • [BlockChain] gasPrice 상승 이슈

    [BlockChain] gasPrice 상승 이슈

    트랜잭션의 수수료는 gas의 가격과 사용된 gas를 기반으로 계산을 한다. 트랜잭션 type1의 경우에는 gasPrice * gasLimit 으로 수수료가 결정된다. 전에 사용하던 네트워크는 충분한 거래가 이루어지고 블록이 있다보니까 gasPrice의 가격이 안정화 되어있었기 때문에 gasPrice에 대한 이슈가 없었다. 새로 네트워크 생성 후 gasPrice를 기존의 2배로 여유를 주고 트랜잭션을 날릴때마다 gasPrice가 계속 올라갔다. ethereum 공식문서를 찾아보니 gasPrice는 마지막 100개 블록의 중간값으로 결정한다고 한다. 그래서 네트워크의 최소 gasPrice를 1gwei로 설정하고 트랜잭션을 날릴때 gasPrice는 1gwei로 고정하고 사용했다. estimateGas를 통해서..

  • [Devops] ELK APM으로 성능측정하기 - ubuntu 22.04

    [Devops] ELK APM으로 성능측정하기 - ubuntu 22.04

    APM으로 성능측정 - ubuntu 22.04 어플리케이션의 성능을 측정하기 위해 APM 을 설치하려고 한다. 기존에 ELK에서 로그나 메트릭을 모니터링하기 때문에 여기에 추가하기 위해서 ELK에서 제공하는 APM 을 사용할 것이다. APM 다운로드 curl -O https://artifacts.elastic.co/downloads/apm-server/apm-server-8.11.0-amd64.deb sudo dpkg -i apm-server-8.11.0-amd64.deb APM 설정 변경 sudo rm -rf /etc/apm-server/apm-server.yml sudo vi /etc/apm-server/apm-server.yml apm-server: host: "0.0.0.0" output.elas..

  • [Devops] ElasticeSearch에서 잔디 Webhook 연결 - ubuntu 22.04

    [Devops] ElasticeSearch에서 잔디 Webhook 연결 - ubuntu 22.04

    유료버전이라면 watcher 만들기를 참고해서 watcher를 만들거나 kibana에서 webhook connector 를 만들어서 사용하면 된다. 나는 무료버전이었기 때문에 다른 방법을 찾아야 했고 제일 원초적으로 어떠한 툴도 쓰지 않고 cron으로 해결하는 방법으로 직접 webhook을 호출하는 방법을 사용하려고 한다. 사내에서 잔디라는 메신저를 쓰는데 webhook으로 error로그 발생시 메신저에 보내는 shell 을 구현할 것이다. 아래 스크립트는 잔디에 맞춘내용이라 알아서 커스텀해서 쓰면 될것 같다. 그전에 먼저 jq를 설치해서 json 을 편하게 사용하도록 한다. sudo apt-get install jq (1) error-log bash #!/bin/bash ES_USER='elastic'..

  • [Devops] ELK Beat template (8.11.0) - ubuntu 22.04

    [Devops] ELK Beat template (8.11.0) - ubuntu 22.04

    ELK 구축후 각 인스턴스에 세팅해줄 템플릿 0-1. 호스트 네임 설정 sudo hostnamectl set-hostname [호스트 이름] 0-2. 인스턴스 시간 설정 (서울) sudo timedatectl set-timezone Asia/Seoul 1. metric beat 세팅 - CPU, 메모리, 디스크 사용량 (1) metric beat 설치 curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-8.11.0-amd64.deb sudo dpkg -i metricbeat-8.11.0-amd64.deb sudo apt-get update (2) metric beat 설정 sudo rm -rf /etc/metricbe..

  • [Devops] ELK 디스크 부족 이슈 S3로 해결하기 - ubuntu 22.04

    [Devops] ELK 디스크 부족 이슈 S3로 해결하기 - ubuntu 22.04

    어느날 kibana에서 위와 같은 오류가 떴다. 디스크의 용량이 부족하다는 이슈라고 추측. 디스크 용량 확인 df -h ec2 생성시 default 값인 8GB로 설정되어 있었다. AWS Ec2 디스크 용량 늘리기를 참고해서 기존 ec2의 volume을 20GB로 늘렸다. 1. 로그 삭제 계속 로그파일을 저장하다보면 언젠가는 늘려놓은 volume도 가득 찰것이다. 그래서 주기적으로 s3에 백업한 후 log를 삭제하는 프로세스를 만드려고 한다. S3 등록 먼저 access_key, secret_key를 등록한다. sudo /usr/share/elasticsearch/bin/elasticsearch-keystore add s3.client.default.access_key sudo /usr/share/ela..

  • [Devops] ELK Stack 8.x 설치 - ubuntu 22.04

    [Devops] ELK Stack 8.x 설치 - ubuntu 22.04

    환경 Elastic Search 와 Kibana는 같은 인스턴스, Logstash, filebeat 총 3개의 인스턴스로 테스트를 진행했다. aws ec2 ubuntu 22.04 1-1. Java 설치 sudo apt-get update sudo apt install openjdk-17-jdk 1-2. Nginx 설치 sudo apt install nginx 2. APT repository 추가 wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg sudo apt-get install apt-transport-https ec..

  • [JPA] N+1의 모든 것

    [JPA] N+1의 모든 것

    JPA N + 1의 모든것 모든 코드는 github에 있습니다. JPA를 사용하면 한번쯤 접하게 되는 N+1 문제에 대해서 다양한 해결책을 공부하려고 한다. 1. N + 1 문제란? 연관 관계가 설정된 엔티티를 조회(1)할 경우 조회된 데이터의 갯수(n)만큼 연관관계의 조회 쿼리가 추가로 발생하여 1 + n개 만큼의 쿼리가 발생하는 현상이다. 2. 프로젝트 기본 세팅 (1) Member.java @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = { "id", "username" }) public class Member { @Id @GeneratedValue(strategy = GenerationType.IDE..

  • [React] styled-components에서 Pseudo selector &을 생략하면 오류

    [React] styled-components에서 Pseudo selector &을 생략하면 오류

    sytled-components에서 Pseudo selector로 사용되는 &을 생략한 코드들의 css가 적용되지 않는 오류를 발견했다. "styled-components": "^6.0.4" 버전은 다음과 같이 사용하고 있었다. 일단 아래에 있는 코드들을 찾아서 급한대로 모든 코드에 &을 붙여 임시적으로 해결한 상태이다. :nth-child :first-child :last-child ::before ::after :focus styled-components github issues 첫 이슈 - v5 에서 v6 으로 마이그레이션 문제 Migration problems from v5 to v6 · Issue #4096 · styled-components/styled-components Hi! Found a..

  • [React] React.memo 최적화

    [React] React.memo 최적화

    React 최적화 - React.memo 모든 코드는 github에 있습니다. React는 부모가 렌더링 될때마다 자식들도 렌더링 되는 특징을 가지고 있다. 이러한 렌더링을 최적화하는 방법은 여러가지가 있다. 그 중 React.memo, useMemo, useCallback등이 있지만 React.memo를 소개하려고 한다. React.memo React.memo는 props가 변하지 않으면 리렌더링을 스킵한다. memo로 감싼 컴포넌트는 메모이제이션으로 이전 props와 새로운 props를 비교하여 같은 값이라면 리렌더링을 하지 않고 기존 컴포넌트를 반환한다. 여기서 props를 비교하는 함수로는 Object.is 를 사용하기 때문에 Object를 props로 넘기는거 보단 primitive 타입을 넘기..

  • [React] react-csv + recoil 로 csv다운로드 구현

    [React] react-csv + recoil 로 csv다운로드 구현

    React-CSV-Download + React recoil 모든 코드는 github에 있습니다. react-csv를 선택한 이유 여러 라이브러리중 react-csv를 선택한 이유는 사용이 간편해보여서이다. react-csv의 마지막 업데이트는 2022년 1월이지만 지금도 문제없이 사용된다. react-csv 사용 Install npm install react-csv --save; Import import { CSVLink, CSVDownload } from "react-csv"; CSVLink : 클릭시 다운로드 CSVDownload : 마운트시 다운로드 보통 다운로드 버튼으로 구현을 하기 때문에 CSVLink만 사용할 것이다. Import 후 해당 컴포넌트를 사용하면 끝이다. Download me ;..

  • [IntelliJ] 단축키 (MacOS)

    cmd + option + v : return 값 빼주기 cmd + shift + t : test 코드 바로 만들기 cmd + alt + p : 변수로 바꿔주기 f2 : 오류난 부분으로 바로 이동 pvsm : public void static main method 만들기 iter : for문 생성 cmd + option + m : 메소드로 추출 shift + shift : 하위 파일들 안에서 검색 cmd + o : 클래스 조회 cmd + b : 해당 메소드로 이동 cmd +l : 라인으로 찾기 cmd + shift + option + f7 : 변수나 메서드가 사용된 위치 전부 보기 cmd + option + [ : 괄호 시작지점으로 cmd + option + ] : 괄호 끝지점으로 cmd + 7 : 현재..

  • [Blockchain] Klaytn WebSocket 끊김 후 재연결 (spring boot)

    [Blockchain] Klaytn WebSocket 끊김 후 재연결 (spring boot)

    Klaytn에서 WebSocket을 연결하여 스마트컨트랙트에서 발생하는 이벤트를 구독하려고 했다. 문제는 웹소켓 연결이 시간이 지나면 계속 끊겼다. 이 문제를 정의하고 해결하려고 한다. 1. 문제 1분간 별도의 request가 없으면 끊긴다. 클레이튼 데브포럼에서 클레이튼 팀에서 직접 단 댓글이다. 하지만 나는 1분간 별도의 request가 없어도 정상적으로 연결되다가 몇 시간 후에 갑자기 끊겨 버린다. 21년 6월에 작성한 글이라 오래되서 뭔가 바꼈나 하고 다시 찾아봤다. 그랬더니 위와 같이 최근에도 같은 답변이 있었다. 주기적으로 getblocknumber를 호출하는 방법보다 더 효율적인 방법을 찾고 싶었다. 그래서 WebSocketService의 connect가 끊겼을때를 감지해서 다시 connec..

  • [Blockchain] 언어별 web3 차이로 트랜잭션 해시값 차이

    [Blockchain] 언어별 web3 차이로 트랜잭션 해시값 차이

    1. 문제 및 해결 클라이언트(flutter)에서 트랜잭션 사인 -> 백엔드(nodejs)에서 트랜잭션 해시값 send 위 과정에서 evm에 트랜잭션을 보내는 처리가 실패했다. 처음엔 flutter에서 트랜잭션을 잘못 생성했다고 생각하여 abi등 꼼꼼하게 확인했지만 이상이 없었다. 문제는 type2 트랜잭션의 문제였다. evm 트랜잭션의 타입 (1) type1 gas price를 설정하여 네트워크가 바쁠때는 높은 gas price부터 빠르게 처리한다. 트랜잭션 예시(nodejs) const tx = { to: to, value: parsedEthAmount, gasPrice: ethers.utils.parseUnits("20", "gwei"), gasLimit: ethers.utils.parseUnits..