· 모니터링
🧐 그라파나 (Grafana) 이전 글에서 간단히 언급했지만 다시 한 번 하도록 하겠습니다. 프로메테우스가 DB라고 한다면, 이 DB에 있는 데이터를 불러서 사용자가 보기 편하게 보여주는 대시보드가 필요합니다. 그라파나는 데이터를 그래프로 보여주는 툴입니다. 수 많은 그래프를 제공하고, 프로메테우스를 포함한 다양한 데이터소스를 지원합니다. 🧐 그라파나 설치 그라파나 설치 사이트(https://grafana.com/grafana/download)로 이동합니다. 여기서는 맥 OS 기준으로 설치를 진행하겠습니다. 위의 명령어를 복사합니다. 이후 그라파나를 설치할 (임의의)폴더로 이동한 뒤, 위의 명령어를 그대로 입력합니다. (설치하는데 시간이 좀 걸릴 수 있습니다) 그라파나를 설치할 폴더의 bin 폴더로 이동..
· 논리회로
디지털 시스템의 논리 설계를 학습하기 위해 필요한 기본 수학은 부울 대수이다. 우리가 사용할 모든 스위칭 장치들은 기본적으로 2상태 장치이며 따라서 우리는 모든 변수가 두 값 중 하나만을 가지는 부울 대수의 특별한 경우를 강조할 것이다. 이렇게 두 값을 갖는 부울 대수는 종종 스위칭 대수라고 불린다. 부울 대수에서 사용되는 0과 1은 수치적인 값을 가지지 않는다. 대신 논리회로에서 두 개의 다른 상태를 표현하고, 스위칭 변수의 두 값을 나타낸다. 논리 게이트 회로에서, 0을 일반적으로 낮은 전압대를 표현하고, 1은 높은 전압대를 표현한다. 스위칭 회로에서 0은 일반적으로 열린 회로(normally open, NO)를 의미하고, 1은 닫힌 회로(normally close, NC)를 의미한다. 🧐 기본 연산..
🧐 어려운 배포 배포는 참 어렵습니다. 저는 지금 정말 너무 어려워서 울 것 같아요. 하지만, 배포를 처음 해보는 모두가 다 저와 같은 감정일 것이라 생각합니다. 그래서 배포를 처음하는 제가, 이 글을 써가면서 자동 배포까지 진행하는 과정을 세세히 정리함으로써, 누군가에게 도움을 줄 수 있지 않을까 하는 생각으로 이렇게 정리를 하게 되었습니다. (무엇보다, 다른 블로그들이 너무 불친절하달까... 정말 아무것도 모르는 사람이 이걸 따라할 수 있다고..? 하는 생각이 들어서 제가 그냥 저를 위해서 정리를 하고 있네요..😭) 예상하는 목차는 다음과 같습니다. AWS 계정 만들기 ~ EC2 인스턴스 만들고 접속하기 (이번 글) 간단한 스프링 프로젝트 생성하고 깃허브에 올리기 -> EC2에서 손수 clone받아 ..
· 기본
🧐 Collectors.toMap이 뭔가요? Stream을 사용하는 경우, 최종 연산으로 collect()를 사용하는 경우, Stream의 요소들을 수집하여 특정한 자료구조로 변환할 수 있습니다. 이때 Map으로 변환하기 위해서는 Collectors.toMap을 사용합니다. 흔히 사용하는 toMap은 다음과 같습니다. List strings = Arrays.asList("apple", "banana", "pear"); Map map = strings.stream() .collect(Collectors.toMap(String::length, Function.identity())); System.out.println(map); // 결과: {4=pear, 5=apple, 6=banana} 그러나 위 코드에는..
· 계산이론
유한상태 기계(finite state machine) (유한 오토마타) 유한 인식기는 유한 개수의 상태를 가지며, 그 임시 저장장치가 없기 때문에 유한하다고 하며, 문자열을 처리하면서 이를 승인(accept)하거나 거부(reject)하는 기능을 하기 때문에 인식기(accpter)라 합니다. 따라서 유한 인식기를 간단한 패턴 인식 매커니즘이라 볼 수 있습니다. 결정적 유한 인식기 (Deterministic finite accepter, DFA) 결정적이라는 단어의 의미는 해당 오토마타가 항상 하나의 선택만을 취할 수 있음을 의미합니다. DFA는 정규 언어(regular language)라 불리는 특별한 형태의 언어를 정의하기 위해 사용합니다. 결정적 유한 인식기(Deterministic finite acc..
🤔 서론 이번 글에서는 Redis를 사용하여 분산락을 구현해 보도록 하겠습니다. Java의 Redis 클라이언트로는 Jedis, Lettuce, Redisson 등이 있으며, 각각의 특징이 서로 다릅니다. 이중에서 Jedis는 제외하고 Lettuce와 Redisson을 사용해서 분산락을 구현해 보도록 하겠습니다. (Jedis와 Lettuce의 비교는 다음 글을 참고해주세요) 🤔 Redis 환경 설정 아래 명령어를 통해 redis를 다운받아줍니다. (반드시 도커를 사용할 필요는 없습니다.) docker pull redis 이후 레디스를 실행시켜줍니다. docker run --name redis -d -p 6379:6379 redis 프로젝트에서는 Redis 관련 의존성을 추가해주도록 하겠습니다. imple..
🤔 서론이전 글에서는 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)을 통해 분산락을 구현하여 단일 서버는 물론 다중 서버에서도 동시성 문제를 해결하였습니다.이번 글에서는 비관적 락과 비슷한 MySQL의 USER-LEVEL Lock(Named Lock)을 통해서 동시성 문제를 해결해 보도록 하겠습니다.(앞으로는 user-level lock이라고 부르도록 하겠습니다.)       🤔 USER-LEVEL Lock (Named Lock)MySQL 공식 문서를 보면 다음과 같은 user level lock을 지원해주는 것을 알 수 있습니다.   🐳 GET_LOCK(str, timeout)주어진 이름(str)에 대한 Lock 획득을 시도합니다. 이때 문자열의 길이는 최대..
🤔 서론 이전 글에서 알아본 synchronized는 단일 서버 환경에서만 동시성 문제를 해결할 수 있었습니다. 이번 글에서는 다중 서버 환경에서 동시성 문제를 해결할 수 있는 방법에 대해 알아보도록 하겠습니다. 여러 대의 서버에서 동일 자원에 접근하는 경우, 동시에 한 개의 프로세스(혹은 쓰레드)만 접근 가능하도록 하기 위해 사용하는 Lock을 분산 락(Distributed Lock)이라 부릅니다. 이제부터 분산 락을 구현하는 여러 방법들에 대해 알아보도록 하겠습니다. 💡 분산 락에 대해서 분산 락에 대해서 이렇다 할 완전한 정의를 찾지는 못해서 다음 두 상황이 혼동될 수 있을 것 같습니다. 1. 웹 애플리케이션 서버가 여러대인 경우, 이들간의 동시성 문제를 해결하기 위해 사용되는 Lock 2. 스케일..
🤔 서론 다중 사용자를 위한 웹 애플리케이션을 만들다 보면 한 번쯤은 동시성 문제에 접하게 됩니다. 동시성 문제는 하나의 자원에 대해서 여러 쓰레드가 동시에 접근하여 수정하는 경우에 발생하는 문제입니다. 동시성 문제가 발생하는 간단한 예시로는 특정 게시물의 조회 수가 올바르게 증가되지 않는 문제가 있을 수 있습니다. 특정 게시물에 100명의 사용자가 동시에 접근하는 경우 조회수는 100이 되어야 옳겠지만, 대부분의 경우 조회수는 100보다 작은 값으로 설정될 것입니다. 조회수 같은 경우에는 대체로 데이터의 정합성이 중요하지 않기 때문에 이러한 부분이 문제가 되지 않을 수 있지만, 상품의 재고 수량과 같은 경우에 이러한 동시성 문제가 발생한다면 치명적일 수 있습니다. 이러한 동시성 문제를 막기 위해서는 다..
· JPA
(제 궁금증 풀 용도로 정리한거라 막 깔끔하게 정리하지는 않았습니다.) 🧐 ManyToOne, OneToOne 연관관계 일반적으로 merge 시 merge되는 특정 엔티티에 대해서만 조회합니다. 그러나 cascade 속성이 MERGE라면 merge 시 연관된 엔티티들도 left join으로 조회해옵니다. merge()가 되어 값이 변경되는 것도 일반적으로는 fk 값의 변경만이 반영되지만, cascade 속성이 merge라면 연관된 엔티티의 변경도 함께 반영됩니다. (DB 관점에서 생각하면 편합니다) @NoArgsConstructor @Accessors(fluent = true) @Getter @Entity public class Member { @Id @GeneratedValue(strategy = Ge..
말 랑
Shin._.Mallang