아래 글은 로버트 마틴의 클린코드 책 1장 ~ 13장 을 읽고 작성한 글입니다. 개요 이 책을 읽게 된 이유는 최근에 내가 너무 '어쨌든 굴러가는 코드'에만 집중해 코드를 작성하려고 해서였다. 구현이 빨리 되어 결과물이 바로 눈에 보이는 게 좋긴 하였으나 너무 성급하게 짠 코드는 정신이 하나도 없었다. 이 책을 읽어보면서 내가 작성한 코드를 리팩토링하기로 했다. 내가 개발한 코드와 서비스를 이어받아 운영할 분들에게 어느 정도 도움이 되고 싶다. 클린 코드란? 깨끗한 코드는 ‘보기에 즐거운’ 코드다. 클래스, 함수 , 메서드 등을 최대한 줄인다. 중복이 없다. 세세한 사항까지 꼼꼼하게 처리하는 코드다. 모든 테스트를 통과한다. 한가지에 ‘집중’한다. 의미있는 이름 함축성을 담자. 특히나 for문에 i,j,..
분류 전체보기
다음은 토비의 스프링 5.1 사용자 레벨 관리 기능 추가 를 공부하고 정리하였습니다. 요구사항 - 사용자의 레벨은 BASIC, SILVER, GOLD 세 가지 중 하나이다. - 사용자가 처음 가입하면 BASIC 레벨이며, 이후 활동에 따라 한 단계씩 업그레이드 도니다. - 가입 후 50 회 이상 로그인하면 BASIC에서 SILVER 레벨이 된다. - SILVER 레벨이면서 30번 이상 추천을 받으면 GOLD 레벨이 된다. - 사용자 레벨의 변경 작업은 일정한 주기를 가지고 일괄적으로 진행된다. Level을 Enum 을 쓰자 ! 만약 Enum이 아닌 class 로 쓴다면 ? 아래와 같이 일일히 int type으로 저장한다.이후 DB에서 어떻게 갖다 쓸 것인가? if (user1.getLevel() == U..
0. 문제 사칙연산 1. 문제 풀이 백준의 행렬 곱셈 순서 문제와 유사한 문제이다. 처음에는 Greedy라고 생각하였다 . 하지만 DP! - 뒤에는 작은 수가, + 뒤에는 큰 수가 나와야 한다. 또한 순차적인 계산 방식이 아니므로 Greedy로 풀 수 없고, 행렬 곱셈 순서 문제처럼 step별로 계산하며 DP table로 상태를 계속 적어두어야 한다. INF = 987654321 def solution(arr): answer=0 num = (len(arr)+1)//2 DP_max = [[-INF] *(num+1) for _ in range(num+1)] DP_min = [[INF] * (num+1) for _ in range(num+1)] for i in range(num): DP_max[i][i]=in..
Can’t log into Elastic (self hosted) “Oops! Error. Try again.” [lens_merge_tables] > [esaggs] > EsError TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark .. 해당 에러들은 모두 Elastic disk 가 가득차서 생기는 오류이다. free -h 명령어로 Elastic server에서 몇 퍼센트를 사용하고 있는지 확인할 수 있다. 아래 /elk 메모리가 90퍼센트 이상 사용하게 되면 주로 해당 오류들이 발생한다. [**@n**** config]# df -h Filesystem Size Used Avail Use% Mounted on dev**** t** t**s..
문제 상황 회사에서는 상담 센터에서 수많은 양의 상담 전화를 받고 있다. 이 상담 전화를 STT whisper로 받아 프로그램을 돌리고 있는데, 사실상 이 서비스가 빛을 발하지 못하고 있다. 밤새 돌려놓으면 2000건 까지는 돌릴 수 있으나 그 이상의 데이터(4000건 까지 들어옴)를 돌리지 못하는 어려움이 있음 whisper 에 화자분리는 지원이 되지 않아 해당 script의 화자 파악에 어려움이 있음✔️ 통화 음질이 아주 나빠서 정확도가 너무 떨어짐✔️ 이 STT 자료들을 조금 더 의미있게 사용하기를 원한다. 예를 들어 상담원 A와 상담원 B의 언어적 특징이나, 상담원들이 많이 사용하는 단어들을 추출한다거나 등 등 .. 내가 해볼 수 있는 기술적 영역에서 해결해볼 수 있는 것들? Kafka 등을 이용..
다음은 토비의 스프링 3.4 컨텍스트와 DI ~ 3.5장 3템플릿과 콜백 을 공부하고 정리하였습니다. DI에 대해 다시 복습하자 ! 1. 그림으로 표현해본다면? Pencil 객체와 Store 객체가 있다. 이 때 의존성은 다음과 같이 문장으로 표현된다. A가 B를 사용한다. A가 B에 의존성이 있다. A-store / B-pencil DI 가 아닌 코드를 먼저 보자. public class Store { private Pencil pencil; public Store() { this.pencil = new Pencil(); } } Store 객체 안에서 직접 객체를 생성하고 초기화한다. DI 인 코드 public class Store { private final Pencil pencil; public S..
개요 Elastic Observability로 NVIDIA GPU 메트릭을 모니터링하는 방법 을 참고하여 작업하였습니다. 해당 서버는 Linux에서 NVIDIA CUDA가 설치되어 GPU가 세팅되어 있는 환경이다. 해당 GPU가 얼마만큼 사용되는지 nvidia-smi 명령어를 사용하면 알 수 있지만, cmd 창에서 일일히 확인하지 않고 kibana 등을 이용하여 시각화하기 위해서 GPU 성능 모니터링 ELK 를 탑재하였다 ! DCGM DCGM (Data Center GPU Management) 툴은 NVIDIA GPU의 성능 및 상태를 실시간으로 모니터링하여 GPU의 온도, 전력 소비, 메모리 사용량, 그래픽 작업 부하 등의 데이터를 수집하고 분석할 수 있는 툴이다. GPU와 관련한 데이터는 metric..
해당 작업은 elastic metricbeat docker module 과 Docker Performance Monitoring with Metricbeat and ELK Stack (사진 출처) 을 참고하여 작업하였습니다. 개요 Linux에 ELK Stack(Metricbeat) 를 세팅하여 dashboard에서 확인하는 과정은 여기 에서 확인할 수 있다. ELK metricbeat는 Docker container 들에서 metric 데이터를 가져올 수 있는 모듈을 제공한다. 추가적으로 아래의 다른 모듈들도 기본적으로 제공되는데, ./metricbeat-7.12.1-linux-x86_64(다운로드 경로)/modules.d 경로에서 확인해볼 수 있다. activemq.yml.disabled docker...
아래 글은 토비의 스프링을 읽고 공부하였습니다. 목차 1. DI란 1) 의존관계 2) 모델링 시점의 의존관계 vs 런타임 시점의 의존관계 3) 제3의 존재 4) 의존관계 검색과 주입 5) 의존관계 주입 방법 3가지 2. XML을 이용한 DI 1) DI 설정정보를 만드는 XML 2) XML을 이용하는 애플리케이션 컨텍스트와 Datasource 1. DI DI는 의존관계 주입으로, IoC와 동떨어진 개념은 아니다. DI는 오브젝트 레퍼런스를 외부로부터 제공(주입)받고 이를 통해 여타 오브젝트와 동적으로 의존관계가 만들어지는 것이 핵심이다. 우리가 보통 알고있는 가장 대표적인 DI는 @Autowired 어노테이션일 것이다. 1. 의존관계 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입하는 방식이다...
아래 글은 토비의 스프링을 읽고 공부하였습니다. 목차 1. IoC란 1) 팩토리 2) IOC(제어의 역전) 3) 프레임워크와 라이브러리 2. 스프링의 IoC 1) Bean과 Bean Factory 2) 애플리케이션 컨텍스트와 동작방식 3) 직접 만든 애플리케이션 컨텍스트와 object factory의 차이점 3. 싱글톤 1) 싱글톤으로 만드는 이유 2) 싱글톤 패턴의 한계 3) 싱글톤 레지스트리 4) 싱글톤 사용 시 주의할 점 1. 오브젝트 팩토리 1. 팩토리 앞에서 우리는 UserDaoTest에 DB 연결에 대한 책임(ConnectionMaker 구현 클래스)을 던져버렸다. 이번에는 이 책임을 DaoFactory로 분리해보자. public class DaoFactory { public UserDao u..
아래 글은 토비의 스프링을 읽고 공부하였습니다. 목차 1. DAO 1) DAO vs DTO 2) DAO-관심사의 분리 2. DAO의 분리 1) 클래스의 분리 2) Interface의 도입 3) 관계설정 책임의 분리 2. 원칙과 패턴 1) 개방 폐쇄 원칙 2) 전략 패턴 1. DAO 1. DAO vs DTO DAO에 대해 파악하기 위해 우리가 개발할 때 많이 사용하는 DTO 개념과 비교해보자! DTO는 데이터를 운반하기 위한 틀이라면, class Person { private String name; private int age; } DAO는 data에 접근하기 위한 객체로, DB 접근에 대한 로직과 비즈니스 로직(Service, Controller, Repository)을 분리하기 위해 사용한다. 사실 지..
개요 회사의 빅데이터 장비 시스템( Linux+GPU+Docker ) 서버의 metric data를 쌓고 관리하기 위해 모니터링 툴을 도입하는 과제를 부여받았다! 서버 내에 ES 에 클러스터 5개가 docker와 NVIDIA GPU를 사용하여 운영되고 있었고, ELK Stack(ES + Kibana + Logstash)를 이용해 Filebeat가 이미 운용되고 있는 환경이었다. 모니터링 기술 선택 고민 모니터링 기술로 크게 두 가지 스택을 논의하였다. 1. Grafana + Prometeus 2. MetricBeat(ELK) ✅ 두 스택을 비교하자면 프로메테우스+Grafana는 Metric data(서버의 상태를 측정한 항목이나 지표) 모니터링 및 시각화에, ELK 스택은 로그 데이터의 수집, 분석 및 ..
FOSSLIGHT Fosslight는 LG전자에서 자체 개발하여 사용하고 있는 오픈소스 관리 통합 시스템을 누구나 사용할 수 있도록 2021년 오픈소스로 공개한 프로젝트이다. 매년 oss에서 오픈소스 컨트리뷰션을 통해 자체적으로 멘토와 멘티를 선발하고 있으며 좋은 기회에 참여할 수 있게 되었다. FOSSLight FOSSLight으로 완성하는 Open Source Governance fosslight.org 이슈 내용 ISSUE - #817 Project List, 3rd Party List > Add watcher search PR - Added watcher search box in Project List, 3rd Party List 내가 맡았던 이슈는 위의 사진처럼 검색을 할 때 Watcher 값도..
문제상황 3주 전에 하던 GIT 작업을 다시 진행하던 도중 remote의 상황이 바뀌었다. 이후 merge 이후 PR을 올리니 다른 사람들이 했던 커밋들이 모두 commit history에 쌓이는 모두 반영되는 불상사가 벌어지고 말았다.. 목표 나의 목표는 remote 깃 레포에 있는 6a1c234 commit 위에 내 commit만을 쌓아 PR을 날리는 것이다. 1. 나의 commit 상태 PS C:\Users\20wjs\OneDrive\COMPUTER\***> git log --oneline 0a7d2bf5 (HEAD -> test2, origin/feat/#817, test, feat/#817) Merge branch 'feat/#817' of github.com:Youngseo-Jeon0313/f..
문제 사항 오픈소스에 기여하는 과정에서 github indent가 지켜지지 않고 커밋되는 문제가 발생하였다. 혹시나 설치 상황에서 내가 놓친 게 있나 싶어 code style에 대한 issue 를 검색해보니 google java convention이 적용되고 있음을 알게 되었다! 해결 방안 1. IntelliJ > Files > Settings에서 google-java-format을 다운받아 Enable시킨다. (Enable 시키면 아래처럼 Disable 로 나타나게 된다) 2. 이후 Help > Edit Custom VM Options 버튼을 누르면 아래와 같이 창이 나오게 되는데 5번째 줄 아래의 내용을 복사해 붙여넣는다. --add-exports=jdk.compiler/com.sun.tools.ja..
0. 문제 과제 진행하기 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. 문제 설명 빡구현 문제로 뒤에 오는 과제를 확인하는 동시에 남은 시간이 있다면 내가 처리할 수 있는 못 끝낸 과제들을 확인하면 된다. 사실상 못 끝낸 과제들은 '가장 최근에 멈춘 과제'를 먼저 처리하기 때문에 stack 구조로 FILO 구조를 사용하여 구현하면 된다. 2. 문제 풀이 3. 문제 구현 from collections import deque def solution(plans): # 남으면 스택에 넣는다. (뒤에 있을수록 가장 최근에 멈춘 과제) stack = [] an..
본 내용은 아파치 카프카 애플리케이션 프로그래밍 with 자바 를 읽고 아파치 카프카 데브원영 강의를 들으며 공부한 내용입니다. 목차 0. 에필로그 1. 카프카란 1) 카프카의 개요 및 설명 2) 카프카의 구성 2. 카프카 실습 1) windows 10 Linux 설치 및 카프카 설치 2) Producer - Consumer 통신 (Window Local 환경) 0. 에필로그 Kafka 공부하기 전에 OS와 네트워크 DB 개념에 대해 알고 있으면 더 효과적으로 이해할 수 있을 것 같다. 책에 있는 java 코드는 깃허브에서 같이 공부해보기로 했다. 우선, 아래와 같은 고민을 하고 있다면 카프카는 해결을 위한 훌륭한 방안이 되어 줄 수 있다. 동기/ 비동기 데이터 전송에 대한 고민이 존재하는가? 실시간 데..
0. 문제 Z 1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을 www.acmicpc.net 1. 문제 설명 크기가 2^N X 2^N 모양 배열을 Z 모양으로 탐색하려고 할 때 R행 C열을 몇 번째로 방문하는지 찾아내는 문제이다. 규칙이 보이기 시작했고, 분할정복으로 채워나가며 추적하는 방법을 사용하려고 하였다. 2. 문제 구현 처음 시간초과 코드 N,R,C=map(int,input().split()) turn=1 def divide_and_conquer(x,y,size): global turn if y==R and x==C: p..
0. 문제 설명 궁금한 민호 1507번: 궁금한 민호 첫째 줄에 도시의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 각각의 도시 사이에 이동하는데 필요한 시간이 주어진다. A에서 B로 가는 시간과 B에서 A로 가는 시간은 같다. 또, A와 B www.acmicpc.net 1. 문제 생각 플로이드 워셜의 응용으로, 플로이드 워셜의 완성본을 보고, 어떤 간선들이 실질적으로 쓰이는지에 대해 추적하는 문제이다. 따라서 그림에서 보이는 것처럼 직접적으로 가는 길의 가중치만을 표현하기 위해 '플로이드 워셜을 이용하여 건너 가는 것들'에 대한 값들은 0으로 바꾸어주면 된다. '-1'을 출력하는 것은 플로이드와샬로 더 짧은 거리로 갈 수 있는 거리가 있는데 '완성본'에서 그 짧은 거리가 반영되어..
문제 시 삭제하겠습니다. 객체지향의 본질 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다. ex> 앨리스, 음료 는 객체이고 앨리스의 키(130cm), 앨리스의 위치("통로") 등은 객체의 property이다. 객체의 property value는 변화할 수 있다. 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다. 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다. 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다. ex> 객체의 행동은 ..