주말이 끝나고 다시 월요일이다. 주말에는 머리를 좀 식혀가며 공부했는데, 다시 열심히 바짝 해보자. 💪아침에는 동시성 처리 관련한 경험을 트랜잭션 격리수준과 연관지어 정리해보았다. 당시에는 Serializable을 설정하면 무조건 트랜잭션 하나만 데이터베이스에서 동작할 수 있는 줄 알았다. 하지만 트랜잭션이 점유하고 있는 자원에 대해 넥스트 키 락으로 읽기 잠금을 걸어 다른 트랜잭션에서 읽기는 물론 변경이 불가능하게 한다.InnoDB implicitly converts all plain SELECT statements to SELECT ... FOR SHARE if autocommit is disabled. 추가로 서로 다른 사용자가 동시 요청으로 최대 인원 수보다 많은 참여 데이터가 쌓이는 경우를 ..
날씨가 조금 따땃해진 11월이다. 🍂불확실한 상황에 매너리즘에 빠지기 쉽지만 공부하고 싶은 것들을 꾸준히 공부하며 나아가자 😁 오늘도 오후 두 시간 정도 리트코드를 풀고 저녁에는 면접 스터디를 하였다. https://leetcode.com/problems/set-matrix-zeroes/Set을 이용해 0으로 만들 행과 열을 저장하고 NM번 탐색하여 Set에 저장된 행, 열이라면 0으로 세팅하는 방식으로 풀었다. 총 시간 복잡도는 C++로 풀었으므로 O(NM * log(NM))이다. 그리고 공간 복잡도는 O(N)이다. 시간 복잡도를 O(NM)으로 줄이고 공간 복잡도를 O(1)로 개선하도록 풀어보았다. 행렬 문제는 필기 없이 IDE에서만 풀기는 어려운 것 같다 😅 https://leetcode.com..
오늘은 두 시간 정도 리트코드를 풀었다. 덱을 사용하여 문제를 풀어보았다. 자바 덱은 익숙치 않아서 문서를 계속 찾아보았다. 코딩테스트를 위한 자바 문법이 어색하다. https://leetcode.com/problems/reverse-linked-list/class Solution { public ListNode reverseList(ListNode head) { ListNode node = null; while(head != null) { ListNode temp = head.next; head.next = node; node = head; head = temp; } r..
오늘은 리크루팅 데이🎉 였다. 오전에 늦게 일어나서 오후까지 리쿠르팅 데이 행사에 참여하였고, 저녁 먹기 전까지 리트코드를 풀었다. https://leetcode.com/problems/clone-graph/description/ 이 문제가 특히 어려워서 헤매다가 결국 솔루션을 보았다. public Node cloneGraph(Node node) { if(node == null) { return null; } Map mp = new HashMap(); // origin, copy int val = node.val; mp.put(node, new Node(val, new ArrayList())); Queu..
면접 스터디를 본격적으로 시작한 하루이다.이런 저런 일로 오후 내내 정신이 없었고 저녁에 인성 면접 질문과 이력서 포트폴리오 기반 질문을 뽑아보았다. 어떻게 내 포트폴리오에서 질문을 만들기 위해 포커싱 해야할 지 어려웠다.GPT가 추천해준 질문은 조금 추상적이여서 크게 도움이 안되었다. 내가 사용한 키워드 위주로 뻗어나갈 수 있는 가지들을 기록하고 스스로 답변해보는 방식으로 공부하였다.혼자서도 잘 안되어서 백호한테 질문을 뽑아달라고 요청했다. 확실히 혼자 준비하는 것보다 다른 사람들에게 물어보는 것이 제일 효과적이다 👍 오늘 공부한 것 301와 302 상태 코드의 차이. 302 상태코드와 함께 리디렉션 요청을 보냈을 때 클라이언트의 동작 HTTPS의 동작 방식SSL의 암호화 방식중간자 공격 방지 원리인..
오늘 한 작업은 두 가지이다. EC2 서버에 띄운 프로메테우스와 그라파나 대시보드를 로컬 웹 브라우저에서 접근하기 위한 설정로드 밸런서가 보낸 요청을 EC2 서버에서 받기 위한 설정추가로 Jmeter와 Postman을 사용해 서비스의 TPS를 측정해보았는데, 이는 다음에 포스팅해보겠다. 💪 프로메테우스와 그라파나를 Ubuntu 환경의 EC2 서버에 띄웠다. 그 다음 각각의 프로세스를 로컬 브라우저에서도 쉽게 경로로 확인하기 위해 Nginx 설정을 하였다. https://api.dev.mouda.site/prometheus https://api.dev.mouda.site/grafana 이렇게 URL을 입력했을 때 EC2 서버의 지표와 시각화 자료를 확인하는 것이 목적이었다.server { server_na..
Spring Actuator, Prometheus와 Grafana를 사용해 JVM의 정보를 모니터링 대시보드에 보여주기 위한 시스템을 구축하였다.🍃 Spring ActuatorSpring Actuator는 스프링 애플리케이션에서 CPU나 메모리 사용량 등을 확인하기 위한 지표를 제공하고 관리하기 위한 도구이다. implementation 'org.springframework.boot:spring-boot-starter-actuator' 해당 의존성을 추가하면 Spring Actuator를 사용할 수 있다. 아래와 같이 application.yml에 애플리케이션의 상태를 노출할 경로를 지정해주면 해당 엔드포인트에서 지표의 값을 확인할 수 있다.management: endpoints: web: exposur..
🤔 인증과 인가 인증 (Authorization) 이란 우리 서버에 접근하는 사용자의 신원을 확인하는 과정이다. 이를 위해서는 사용자마다 식별 가능한 정보가 필요하다.인가 (Authentication) 이란 인증된 사용자가 접근할 수 있는 자원인지 확인하는 과정이다. 😛인증과 인가를 구현하는 방법 HTTP는 기본적으로 무상태성 (stateless)이기 때문에 인증 정보를 유지하기 위해서 사용자를 식별할 수 있는 인증 정보를 어디엔가 저장해야 한다. 이 정보를 저장하는 위치와 방법은 다양하다. 브라우저에 인증 정보를 저장하는 방법세션 (session) 이란 사용자가 서버와 상호작용하기 위한 하나의 단위를 의미한다. 사용자가 서버에게 접근을 허가받았을 때 세션 아이디를 발급한다. 넓은 개념에서 하나의..
2024.09.09 - [우아한테크코스/레벨4] - [회고] 한 달 간 글을 작성하지 않은 이유 🥲 그런데 이제 레벨 3 회고를 곁들인 ... [회고] 한 달 간 글을 작성하지 않은 이유 🥲 그런데 이제 레벨 3 회고를 곁들인 ...8월 4일을 마지막으로 회고를 작성하고 한 달 넘게 회고를 작성하지 않았다. 여러 가지 이유가 있지만, 레벨 3 를 지내오면서 기술적으로 아쉬운 부분들에 대해서 돌아보고 개인적으로 성장하mingyum119.tistory.com9월 9일에 이 글을 작성했었다. 오늘 회고에서는 그 이후로 약 3주 간 어떤 변화가 있었는 지 돌아보려고 한다.레벨 4에는 우리 서비스가 하나의 소프트웨로서 더 가치있도록 하기 위해 서비스에 대한 고민과 통찰을 깊이 해보는 경험을 하고 싶다. 이 ..