본문 바로가기

분류 전체보기

(49)
[Docker][MySQL] Access denied for user 'root'@'172.17.0.xx' 도커로 mysql 컨테이너를 올려 로컬에서 커넥션을 맺을때, Access Denied 메시지가 뜨는 경우가 있습니다. 도커 컨테이너는 기본적으로 완전히 격리된 네트워크를 지닙니다. 하지만 우리는 localhost 의 -p 옵션으로 바인딩한 포트를 통하여 도커 컨테이너에 접속할 수 있습니다. 도커 컨테이너는 docker0 이라는 도커 설치시 생성되는 네트워크 브릿지를 통하여 외부와 연결이 될 수 있습니다. 각각의 컨테이너는 실행시 172.17.0.xx 대역의 가상 IP를 가진 veth 인터페이스를 호스트에 생성하고 할당받습니다. 생성된 veth 인터페이스는 docker0 브릿지에 연결됩니다. 최종적으로 docker0 브릿지는 호스트의 eth0, eth1 등의 이더넷과 연결되며 컨테이너와 통신이 가능하게 됩..
도메인 객체에서 Bean 객체의 기능을 필요로 해 수행한 코드 개선기 발단 * 코드는 샘플입니다. 실제 개선사항과는 조금의 차이가 있습니다. 이런 프로세스를 생성하는데 dday 가 특정일 (공휴일이나 주말 같은) 날 일 경우 그런 특별한 날이 아닌 날까지 밀거나 당기는 기능이 필요했습니다. '특별한 날' 은 어떤 API 를 통해 매년 DataBase 에 적재시켜놓고 있었고, 밀고 당기는 기능도 존재하는 상황이었습니다. 사실상 유틸성 클래스지만, 빈으로 제공되고 메서드들이 static 으로 제공되지 않고 있어 도메인 내부에서 참조할 수 없었습니다. 또 isSpecialDay 는 불필요하게 매번 모든 데이터를 가져오고 있습니다. 이 클래스를 사용하여 Service Layer 에서 Process 를 생성하는 매 메서드 마다 데이터를 조회하고, pull 을 호출하는 코드를 매번 ..
Kotlin 의 널 (Null) 을 다루는 방법 코틀린은 많은 장점을 가지고 있지만, 자바를 사용하던 개발자들이 가장 피부로 와닿는 장점을 뽑으라고 한다면 Null 타입 시스템이 꼽히지 않을까 생각합니다. 코틀린에서는 강력한 Null Safety 한 문법을 제공함으로서 NPE의 발생을 획기적으로 사전에 차단합니다. Nullable 타입 코틀린은 모든 객체타입이 Nullable 한 타입과 NonNull 타입으로 나뉩니다. class Person( val name: String, val nickName: String?, val age: Int ) 타입 뒤에 ? 가 붙은 타입은 Nullable 한 타입이 됩니다. ?가 붙지 않은 타입의 변수에는 null 을 할당할 수 없습니다. 하지만 개발을 하다보면 어떤 Nullable 한 값을 리턴하는 함수를 통하여 얻..
두번째 이직 많은 면접과 오퍼를 거쳐서 세번째로 몸담을 회사를 최종적으로 결정하고 근로계약서에 서명을 했다. 정말 오랜만에 많은 면접을 보면서, 회사들이 어떤 기술적인 면을 많이 보는지 그리고 문화적으로 어떤 사람을 뽑고싶어하는지 많이 느끼는 계기가 되었다. 첫 이직, 지금도 주니어지만 더 주니어일적 면접을 보던 것과는 또 다르게 많은 것을 배운 것 같고 첫 이직시 기술 면접의 통과율 아니 서류까지 합하면 정말 이직이 쉽지 않았는데 이번에는 지원한 대부분의 회사에 기술면접까지는 일사천리로 통과함에 성취감도 많이 느꼈던 것 같다. 이번 회사를 최종적으로 결정내린 이유는, 오직 면접 경험 더 높은 오퍼를 제시한 곳도 있었지만 면접관으로 들어오신 분들의 일에 대한 생각, 분위기 모두 맘에 들었고 무엇보다도 최종 면접에서 ..
[REAL MYSQL 8.0] 옵티마이저 와 실행계획 (2) - 정렬 MySQL 의 정렬 처리 특징 MySQL 은 정렬을 위한 별도의 메모리 공간을 쿼리 수행시 할당 받는다. 이를 Sort Buffer 소트 버퍼 라고 하며 버퍼의 크기는 정렬 대상의 크기에 따라 최대 sort_buffer_size 변수 만큼 가변적으로 할당 받는다. 소트버퍼는 쿼리 수행 완료후, 바로 반납된다. 그렇다면 소트 버퍼보다 예상 레코드 수가 크다면 어떻게 처리될까? 소팅을 버퍼의 크기만큼 여러 조각으로 나누어, 매 처리 결과를 디스크에 임시저장을 한 후 병합한다. 이를 멀티 머지라고 한다. 디스크 I/O 가 계속 발생하는 것이므로, 성능에 영향이 있다. 하지만 이를 해결하기 위해 sort_buffer_size 를 늘리는 것은 옳지 않다고 한다. 소트 버퍼를 늘려도 속도에 대한 효과는 미미하고, ..
[REAL MYSQL 8.0] 옵티마이저 와 실행계획 (1) - 데이터 처리 옵티마이저는 최적의 실행계획을 수립하기 위한 DBMS 의 뇌라고 볼 수 있다. 실행계획을 이해하려면 옵티마이저에 대한 이해가 필수이다. 옵티마이저에 의한 쿼리 처리 과정 SQL 을 SQL Parser 에 의해 분리 하여 Parse Tree 를 생성 Parse Tree 를 보고 인덱스와 어떤 테이블을 읽을지 선정 (실행계획 수립) 불필요 조건 제거, 연산 단순화 조인의 경우 읽을 순서 선정 (드라이빙 테이블, 드리븐 테이블) 조건문과 인덱스의 통계정보를 활용하여 어떤 인덱스를 태울지 선정 가져온 레코드들을 임시 테이블에 넣고 가공할 필요가 있는지 판단 결정된 실행계획에 따라 실제로 엔진에 의해 쿼리 수행 옵티마이저의 종류 규칙 기반 최적화 - Oracle 에서 예전에 자주 사용하던 방식. 내장된 우선순위를..
Redis 를 이용한 분산 락 구현 분산락? 서비스가 점점 커지다보면 서버의 갯수가 늘고, 요즘에는 대부분이 클라우드환경에서 자동 수평확장 설정을 통하여 얼마든지 서버의 기동대수가 늘 수 있도록 확장에 용이한 구조로 설계를 합니다. 이런 환경에서 서비스를 운영하다보면 여러서버에서 특정한 요청 처리에 대하여 공통된 락이 필요한 경우가 있습니다. 이때 사용하는 락을 분산락이라고 합니다. 저의 경우에는 서버의 대수와는 별개로 이체, 송금 도메인에서 클라이언트 단의 오류로 인하여 동시성 처리가 되어 있지 않은 이체, 송금 서버에 동시에 여러번의 요청이 들어와 여러번의 이체가 되는 대형 장애가 발생한 적이 있었고 이를 해결하기 위해 Redis 를 활용하여 여러대의 서버에 낙관적락을 분산락으로 잡아 같은 요청이 중복으로 요청되는 상황에 대한 처리를 ..
[Real MySQL 8.0] 인덱스 랜덤 I/O 와 순차 I/O 인덱스를 설명하기 전, 랜덤 I/O 와 순차 I/O 에 대해 알아야한다. 고전적인 HDD 디스크는 디스크를 돌려 순차적으로 읽을 경우 한바퀴에 모든 데이터를 조회 할 수있다. 반면에, 읽어야 하는 데이터를 순차적으로 조회하지 않는다면 3개의 데이터를 조회하는데 3번 디스크를 돌려야한다. 이를 랜덤 I/O 라고 한다. 즉 일반적으로 순차 I/O 가 랜덤 I/O 보다 훨씬 성능이 좋다. 이는 디스크를 돌리지 않는 SDD 에서도 마찬가지이다. 인덱스 레인지 스캔은 일반적으로 랜덤 I/O 이며, 풀 스캔의 경우 순차 I/O 이다. 그래서 테이블의 데이터 대부분을 읽어야하는 경우, 풀 스캔 후 가공하는 편이 성능이 더 좋다. 인덱스 인덱스란 말 그대로 목차와 비슷한 역할을 한다. 인덱..