개발

    [C++ STL] Map 사용법 이모저모

    [C++ STL] Map 사용법 이모저모

    최근에 코테 주 언어를 모종의 이유로 C++로 바꾸게 되었다. C++에서 Map자료 구조 활용의 이모저모를 정리해보았다. Map이 뭔데? Map은 Key-value 형태로 데이터를 정리하는데 사용된다. unordered_map과의 차이점은 key를 기준으로 정렬을 내부적으로 시킨다는 것이다. 좀 더 깊이 이야기해보자면 Map은 C++내부적으로 Red-Black Tree로 구현되어 있기 때문에 Search, Insert, Delete에서 최악의 시간의 경우 O(logN)의 시간이 보장되는 무시무시한 놈이다. 대학교 2학년때 이거 구현한다고 진짜 밤날샌거 생각하면 진절머리가 난다. 문법 1. 정의 std::map 변수명; 로 선언하게 된다. 자료형은 단순하게 int, string등이 들어갈수도 있고 새롭게 ..

    [Spring] SpringSecurity와 Jwt : 이론편

    [Spring] SpringSecurity와 Jwt : 이론편

    이번 글에서는 SpringSecurity를 이용한 Jwt방식의 인가 처리에 대한 방식과 관련 용어를 정의해보겠다. 용어 설명 우리가 SpringSecurity를 이용해서 client 요청에 대해서 인증을 하고 권한을 부여하기 위해서 이를 위해 노력하는 등장인물들에 대해 먼저 알아봐야한다. 1. Filter Spring Security는 request에 대해서 Dispatcher servlet이 처리하기 전에 Filter를 통하여 request에 대한 검사를 진행하고 해당 request에 대해서 권한을 부여해준다. 권한을 부여해주는거는 다르게 말하면 request에 대해서 SecurityContext를 부여한다고 이야기할 수 있다. 2. SecurityContext SecurityContext란 무엇일까?..

    Docker -v ?

    Docker -v ?

    Docker에는 -v옵션이 있다. 해당 옵션이 왜 필요한지를 모르겠어서 구글링 해보아도 한국어 설명이 부족한것 같았다. 이에 공식 document를 보고 정리해보고자한다. 도커의 Layer 구조 도커의 컨테이너는 아래와 같은 Layer들로 구성되어있다. Docker Container는 Image를 기반으로 실행이 된다. 이렇게 실행된 container의 경우 image layer 최상단 층에 container layer를 추가하게 된다. 이때 container layer의 경우 R/W layer이고 나머지 Layer는 Read-Only layer이다. 이는 어찌보면 당연한 구조인데 한개의 docker image로 여러 container를 실행시키고자 한다면 docker image에 해당하는 layer는 ..

    MySQL Free Space Management

    MySQL Free Space Management

    MySQL의 Storage Engine은 Innodb이다. Innodb은 Transaction-Safe한 Storage Engine이며 자체적으로 메인메모리 안에 데이터 캐싱과 인덱싱을 위한 버퍼 풀을 가지고 있습니다. 이번 글에서는 데이터 캐싱과 관련해서 Cache Miss가 발생했을 때 MySQL이 이를 어떻게 처리하는지 공부한 것을 정리해보려고 합니다. 먼저 Innodb의 버퍼 풀을 살펴 보겠습니다. InnoDB의 Buffer pool의 구조는 위와 같습니다. 이러한 buffer pool을 다르게 말하면 LRU list라고 이야기합니다. 이는 page 교체 알고리즘을 LRU 방식을 사용하기 때문에 붙여진 이름이라고 생각합니다. Page Hit page들이 어느 영역에 속하는지에 따라 Page hit..

    Docker란?

    Docker란?

    소프트웨어를 배포하려면 소프트웨어 자체 뿐만 아니라 의존성과 구성이 필요하다. 여기서 의존성이란 라이브러리, 인터프리터, 서브 패키지, 컴파일러 , 확장 등을 의미하고 구성이라는 것은 설정, 라이선스 키, 데이터베이스 비밀번호 등을 의미한다. 이러한 문제를 해결하기 위해서 옴니버스 패키지, 가상 머신 이미지 등의 방법들이 있지만 이들은 규모가 너무 크고 다루기 힘들며 구축과 유지보수에 시간이 오래 걸린다. 더욱이 여러대의 프로그램을 한 서버에서 돌릴려면 이러한 다양한 종류의 패키지에 대해 관리, 감시, 네트워크 설정 등의 부수적인 작업이 필요하다. 이런 문제를 해결하기 위해 등장 한 것이 컨테이너이다. 컨테이너는 쉽게 말하면 소프트웨어 배포 및 패키징 단위이다. 더 나아가서 설명하면 재사용, 스케일링, ..

    [Spring ] SLF4J을 이용한 스프링 로그 작성

    [Spring ] SLF4J을 이용한 스프링 로그 작성

    서버에서 로그를 상세히 적어두면 디버깅이나 서버 오류가 발생했을 때 쉽게 파악할 수 있어 유지보수에 있어서 중요하다. 로그는 총 7단계로 나뉘는데 설명을 요약하자면 아래와 같다. 로그 레벨과 설명 레벨 설명 ALL custom level을 포함한 모든 로그를 저장하는 레벨이다. DEBUG 프로그램 상 아주 단위의 행동들을 기록하는 레벨이다. INFO 프로그램 상 큰 단위, 덩어리채로 정보를 기록하는 레벨이다. WARN 잠재적으로 위험할 수 있는 상태가 될 수 있는 정보를 기록하는 레벨이다. ERROR 원래 설정된 error로 프로그램 구동에는 영향을 미치지 않을 수 있는 것들을 기록하는 로그레벨이다. FATAL 원래 설정된 error이긴 한데 프로그램 중단을 야기시키는 것만 기록하는 로그레벨이다. OFF..

    [Git] Git flow 정리 및 실습

    [Git] Git flow 정리 및 실습

    Git flow 개념에 대한 정리는 Vicent Driessen의 글로부터 하게되었다. https://nvie.com/posts/a-successful-git-branching-model/ 들어가기전에 학교에서 프로젝트를 진행할때 git을 교수님이 쓰라고 하셔서 써본 기억이 있다. 평소에 repo를 그냥 code 저장소로 사용하기만 했었기 때문에 협력 툴로써 git은 처음 사용하는 거였다. 대부분의 코딩 팀플이 그러듯 해당 과정에서 branch의 의미는 무색해졌고 결국에는 4명이 모두 main에서 작업하는 경이로운 프로젝트가 되었었다. 당시에 이 글만 읽고 진행했어도 더 좋은 git관리를 했을 텐데 아쉬움이 느껴진다. 탈중앙화와 중앙화를 동시에 프로젝트로 작업하다보면 프로젝트 내에 각자의 역할이 존재한다..

    [Spring]JUnit에서 Async메소드의 비정상적인 종료 - 2편

    이전 글에서 Async로 정의된 메소드를 실행하는 걸 JUnit으로 테스트 하던 중 비정상적으로 테스트가 빨리 끝나는 것을 확인 할 수 있었다. 이는 멀티쓰레드로 돌고 있는 비동기 메소드들이 프로세스 종료에 따라 Thread interrupt가 걸려서 생기는 문제였었다. 이번 글에서는 해당 문제를 해결하는 과정을 서술해보고자 한다. 문제 해결에 핵심 비동기로 선언된 메소드들이 끝나는 것을 알 수 있어야한다는 것이였다. 따라서 이를 위해 비동기 함수의 반환값을 Future로 처리하였다. Future Future는 Java에서 비동기로 처리된 메소드들에 대하여 미래에 받아올 수 있는 방식을 정의하는 사용된다. 모르겠는거에 최고는 공식 문서나 소스코드를 읽는거라 생각이 든다. 이번에는 소스코드를 까보도록 하겠..