· 프로젝트
프로젝트에 레디스 Cache를 적용하며 많은 에러를 경험했습니다. 그리고 에러를 해결하며, 정확히 이해하지 못했던 개념들을 다시 되짚어볼 수 있었습니다.  레디스 Cache를 적용하며 겪은 에러는 크게 4가지인데, 하나씩 살펴보며 해결책과 관련 개념을 정리했습니다.   우선, 요구사항은 다음과 같았습니다.  서비스에서 이루어지는 메서드 들 중 findUsersById 를 통해 사용자 인증 과정을 거치게 했는데, 아래의 findUsersById 메서드에서 DB에 접근하는 횟수를 줄이는 것이 목표였습니다.public UserEntity findUsersById(Long userId){ return userRepository.findById(userId) .orElseThrow(()..
· MySQL
csv을 이용해 100만 개의 데이터를 DB에 넣은 상태이다. explain 명령을 통해 각 쿼리의 실행 계획이 어떻게 변화하는지를 살펴보자.  Explain과 AnalyzeExplain우선, mysql에서 explain 키워드를 붙이면 아래와 같이 실행 계획을 조회할 수 있다. explain은 쿼리를 직접 실행하지는 않는다.   여기서 나오는 각 필드의 개념을 표로 정리해보았다.항목내용id실행계획의 순서. 이 순서대로 select 문이 실행select typeSIMPLE : 단순 select문PRIMARY : 첫번째 쿼리DERIVED : select문으로 추출된 테이블 ( from 절에서의 서브쿼리 또는 inline view)SUBQUERY : sub query 중 첫번째 select문UNION : U..
JVM과 자바의 메모리 영역에 대한 학습을 정리했다.  우선 전반적인 실행 과정을 간단히 살펴보고, 하나씩 깊게 살펴보자!  1. Java 프로그램의 전반적인 실행 과정 가장 먼저, 자바 컴파일러가 Source Code (.java) 파일을 Java Compiler를 통해 기계어 파일인 Byte Code(.Class)로 변환한다.   그럼 변환된 기계어 파일을 JVM의 클래스 로더가 JVM 메모리 영역으로 가져온다. 클래스 로더는 말 그대로 Class 파일을 불러와서 메모리에 저장하는 역할을 수행한다. 이제 이렇게 JVM에 로딩된 바이트 코드들을 Execution Engine이 명령어 단위로 읽어서 실행한다.  위 실행 과정 중에서 JVM은 필요에 따라 가비지 컬렉션, 스레드 동기화 등으로 메모리와 자원..
· 운영체제
강의를 들으면서 정리한 강의 노트입니다. 강의 내용 외에도 이해가 잘 안가는 부분들을 쉽게 정리하려 노력했습니다. 반효경 교수님 운영체제 강의를 들으시는 분들이 이 글을 통해 도움이 되었으면 좋겠습니다!   (혹시 포스팅 중에 잘못된 내용이 있으면 댓글로 지적 부탁드립니다..!)강의 노트 목록1. 운영체제 서론 (Introduction to Operating Systems) 2. 운영체제 구조 : 컴퓨터 시스템의 구성(System Structure & Program Execution 1) 3. 운영체제 구조 : 동기식 입출력과 비동기식 입출력, 저장 장치 계층 구조, 프로그램의 실행(System Structure & Program Execution 2) 4. 프로세스 : 프로세스의 개념, 프로세스의 상태..
이번 포스팅에서는 JCF에서 LinkedList와 ArrayDeque가 어떻게 구현되어 있는지 살펴볼 것이다. 1.  ArrayDeque개념  Deque는 Double-Ended Queue의 줄임말로 큐의 양쪽에서 데이터를 삽입과 삭제를 할 수 있는 자료구조를 의미한다. 그리고 이 Deque 인터페이스를 구현하는 클래스가 ArrayDeque이다. JCF에서 어떻게 구현되어 있나?  elements와 head, tailpublic class ArrayDeque extends AbstractCollection implements Deque, Cloneable, Serializable{ transient Object[] elements; // non-priv..
· Network
컴퓨터와 네트워크 강의를 들으며 정리한 강의 노트 모음입니다.  강의 노트라고는 했지만 강의의 커리큘럼을 참고한 것이 크고, 강의 외로 참고한 것들도 꽤 있어서 강의 흐름과 결이 다른 부분이 있을 수 있습니다. 하지만 잘 이해가 안 가는 부분들을 추가 포스팅과 그림으로 최대한 쉽게 정리하려고 노력해서 네트워크 공부에 도움이 되지 않을까 생각합니다.  컴퓨터와 네트워크 강의를 들으시는 분들이나 네트워크 개념에 대한 학습이 필요한 분들께 도움이 되었으면 좋겠습니다. 혹시 잘못된 부분이 있으면 댓글로 지적 부탁드립니다..! 1. OSI 7계층을 쉽게 이해해보자 (1) 2. OSI 7계층, TCP/IP Updated 을 쉽게 이해해보자 (2) 3. 전송 계층 : 다중화(Multiplexing)와 역다중화(Dem..
· 프로젝트
ec2 서버 상에 SpringBoot 백엔드 프로젝트와 mysql를 컨테이너로 올렸는데, 자꾸만 SpringBoot 컨테이너에서 MySQL 컨테이너를 연결하지 못하는 오류가 나타났습니다.  결론적으로 백엔드 파이프라인 구성을 잘못한 것을 파악하지 못하고, 애먼 MySQL과 SpringBoot 설정을 이리저리 삽질했습니다  혹시나 도움이 될까 기록을 정리해두고자 합니다. SpringBoot와 MySQL과의 연결은 대부분 아래 방법으로 해결이 될 것이라 생각합니다. 문제 상황 도커 백엔드 컨테이너를 실행시키면 얼마지나지 않아 자꾸 내려가는 현상이 발생했다. 분명 젠킨스에서는 빌드가 잘 되는데.. 빌드 여부와 관계 없이 백엔드 컨테이너 내부의 문제일 것 같아 로그를 출력해보았다.sudo docker logs ..
· 운영체제
프로세스 메모리 구조 프로세스의 메모리 영역은 여러 부분으로 나뉜다. 우선 간단하게 Stack, Heap, TEXT 영역의 개념을 살펴보자!  Stack 스택은 함수 호출과 관련된 정보를 저장하는 메모리 공간이다. 함수를 호출할 때마다 함수의 매개변수, 반환 주소, 지역 변수가 스택에 저장된다.  stack은 LIFO의 특징을 가진다. 함수 호출시 새로운 stack 프레임이 생성되어 스택에 쌓이고, 함수 종료시 해당 스택 프레임이 제거 된다. 스택 프레임이란?스택 프레임은 쉽게 말해 함수의 호출 정보 모음이다. 함수 호출시 스택 영역에 차례대로 저장되는 것들을 말한다. 스택 프레임이라는 개념 덕분에 함수가 종료되면 이전 상태로 되돌아갈 수 있다.  HEAP 힙은 동적 메모리 할당이 수행되는 공간이다. 이..
· Java GUI
1. Snake game 이란?Snake game은 뱀을 조종하여 먹이를 먹어 길이를 늘리는 게임입니다. 게임의 규칙은 간단합니다.  1. 먹이를 먹으면 뱀의 길이가 증가한다.  2. 뱀의 머리가 뱀의 몸이나 벽에 부딪히면 종료된다.  이를 Java GUI를 통해 구현해보았습니다. 2. Java GUI 코드코드는 아래와 같이 세 가지 파일로 구성됩니다.   1. Main.java  2. GamePanel.java    3. GameFrame.java 1. Main.javapublic class SnakeMain { public static void main(String[] args) { new GameFrame(); }}2. GameFrame.javaimport javax.swin..
정렬 알고리즘을 배우며 병합 정렬, 퀵 정렬 등 다양한 종류의 알고리즘에 대해 배웠다. 그렇다면 자바에서 자주 사용하는 Arrays.sort() 는 어떤 알고리즘으로 구현되어있을까?  구글링과 자바 내부코드를 보면, Arrays.sort는 듀얼 피봇 퀵소트를 사용한다라고 나와있다. Arrays.sort 메서드 내부를 들여다보면서, 듀얼 피봇 퀵소트란 무엇인지 그리고 범위에 따라 어떤 정렬 방식을 적용하는지를 알 수 있었는데, 그 부분에 대해 공유해보려 한다.   Arrays.sort() 내부 들여다보기int[] arr = {1, 3, 4, 2, 1 ,7};Arrays.sort(arr)---result: {1, 1, 2, 3, 4 ,7} 보통 자바에서 배열을 정렬할 때,  java.util.Arrays 클..
https://dcloud.tistory.com/98 [Java 파헤쳐보기] JVM을 파헤쳐보자JVM과 자바의 메모리 영역에 대한 학습을 정리했다.  우선 전반적인 실행 과정을 간단히 살펴보고, 하나씩 깊게 살펴보자!  1. Java 프로그램의 전반적인 실행 과정 가장 먼저, 자바 컴파일러가dcloud.tistory.com지난 포스팅에서 JVM에 대해 살펴보았다. JVM의 메모리 영역에는 메서드, 스택, 힙 영역 등이 있었다. 그리고 가비지 컬렉터가 그 중 힙 영역을 청소하고, Heap 영역에 있는 객체를 가리키는 레퍼런스 변수는 Stack 영역에 저장된다고도 언급했다.   이게 정확히 무슨 말일까? 이번 포스팅에서 JVM의 가비지 컬렉터(Garbage Collector)을 살펴보며 자세히 알아볼 것이다..
· Spring
https://dcloud.tistory.com/178  지난 포스팅에서 동적 웹 페이지를 위해 서블릿이 도입된 배경과 서블릿의 장점을 살펴보았다. 그리고 서블릿을 재정의해서 서블릿의 요청을 처리하는 것도 알아보았다.  이번에는 이어서, 서블릿의 핵심 개념인 서블릿 컨테이너를 다루어보고 스프링에서 어떤 점을 개선했고 현재의 스프링 형태가 되었는지 살펴보자.   서블릿은 어떻게 관리되고, 서블릿은 어떻게 호출될까? 1. 서블릿 컨테이너서블릿을 관리하기 위한 서블릿 컨테이너라는 것이 있다. 서블릿 컨테이너란 단어 그대로 서블릿을 담는 컨테이너이다.   우리가 자주 들어본 톰캣(Tomcat)이 대표적인 서블릿 컨테이너이자 WAS이다. 예를 들어, 사용자가 브라우저에서 HTTP 요청을 보내면 톰캣이 해당 요청을..
· 운영체제
프로세스 동기화 도구에는 크게 뮤텍스 락과 세마포어가 있다.  둘 차이를 간단하게만 말해보면, 뮤텍스 락은 공유 자원에 하나의 스레드가 접근가능하고 세마포어는 공유자원에 여러 스레드가 접근 가능하다는 것이다.    지금까지 너무 얕게만 이해하고 있었다는 생각을 했다. 세마포어는 여러 스레드도 접근 가능하고, 뮤텍스 락을 대체할 수도 있기 때문에, 세마포어가 좋은 거 아닌가 라는 생각을 막연하게 해왔었다.  하지만 내부 동작 방식을 살펴보면 이야기는 달라진다. 문맥 교환이라는 오버헤드를 배제한 설명이기 때문이다. 이게 무슨 말인지 한번 살펴보자.   1. 뮤텍스락 뮤텍스락은 공유 자원에 접근하기 위해 뮤텍스를 획득해야하고, 자원 사용이 끝나면 뮤텍스를 해제하는 방식이다. 그리고 하나의 스레드만 뮤텍스를 획..
· BOJ
문제https://www.acmicpc.net/problem/3020  풀이 누적합을 이용해 해결한 문제입니다. 입력값이 2 ≤ N ≤ 200,000, 2 ≤ H ≤ 500,000 으로 주어지기 때문에, 이중 for문을 돌면 바로 시간 초과에 걸리게 됩니다. 문제 상황을 위처럼 그림으로 나타내볼 수 있었습니다. 각 높이별로 파괴해야하는 장애물의 개수을 표시한 것입니다. 저 개수를 어떻게 구해야할지 생각해보다가 우선 석순과 종유석 배열을 각각 나누어야겠다고 생각했습니다.    그래서 우선 입력을 석순과 종유석(bottom[], up[])배열에 나누어서 받았습니다.이 때, 주어지는 입력 값인 장애물의 크기는  bottom[], up[] 배열의 인덱스로 입력받아, 해당하는 인덱스 배열의 값을 +1 해줍니다...
동구름이
동구름