| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- 백준 알고리즘
- spring
- 프로젝트
- 리눅스
- 유사코드
- c#
- 오라클
- 티스토리
- 문법 정리
- gradle
- jsp
- 학점
- 파이썬 소스
- 초대장
- resilience4j
- dynamic query
- 운영체제
- MongoDB
- SQL
- smart cast
- 자바 프로젝트
- auto configure
- hyperledger
- 자바
- 알고리즘
- 파이썬
- oracle
- K6
- 오라클 디비
- JVM
- Today
- Total
목록Programming (157)
모종닷컴
플러그인 스토리지 엔진 모델 MySQL에서 쿼리가 실행되는 과정을 본다면 거의 대부분의 작업이 MySQL 엔진에서 처리되고, 마지막 '데이터 읽기/쓰기' 작업만 스토리지 엔진에 의해 처리된다. MySQL 에는 이미 기본적으로 많은 스토리지 엔진을 지니고 있다. 하지만 수많은 사용자의 요구 조건을 만족시키기 위해 기본적으로 제공되는 스토리지 엔진 이외에 부가적인 기능을 더 제공하는 스토리지 엔진이 필요할 수 있기에, 사용자가 직접 스토리지 엔진을 개발하는 것(=플러그인)도 가능하다. 플러그인해서 사용할 수 있는 것이 스토리지 엔진만은 아니다. 검색어 파서도 플러그인 형태로 개발해서 사용할 수 있으며, 사용자의 인증을 위한 플러그인도 있다. 모든 쿼리 작업에 스토리지 엔진 모델이 적용되지는 않는다. MySQ..
MySQL에서 사용되는 메모리 공간은 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있다. 글로벌 메모리 영역의 모든 메모리 공간은 MySQL 서버가 시작되면서 운영체제로부터 할당된다. 운영체제에 따라 100퍼센트 할당해 줄 수도 있고, 공간을 예약만 해두고 필요할 때 조금씩 할당할 수도 있다. 글로벌 메모리 영역 글로벌 메모리 영역은 아래와 같이 이루어져 있다. 테이블 캐시 InnoDB 버퍼 풀 InnoDB 어댑티브 해시 인덱스 InnoDB 리두 로그 버퍼 클라이언트 스레드의 수와 무관하게 하나의 메모리 공간만 할당된다. 필요에 따라 2개 이상의 메모리 공간을 할당받을 수도 있지만, 클라이언트의 스레드 수와는 무관하며, 생성된 글로벌 영역이 N개라도 모든 스레드에 공유된다. 로컬 메모리 영역 로..
제가 다니고 있는 회사에서는 Flyway를 이용하여 테이블의 버전(?)을 관리하고 있습니다. 어플리케이션 내에 테이블의 수정 쿼리를 .sql 파일로 만들고 운영에 배포를 하면 flyway가 이 sql 파일을 데이터베이스에 대신 실행을 해줍니다. 예를 들어 테이블에 필요없는 컬럼이 존재하여 삭제를 해야 한다면 아래와 같은 sql을 만들고 배포를 하면 어플리케이션이 시작하는 타이밍에 flyway가 데이터베이스에 해당 sql 파일을 실행시켜줍니다. ALTER TABLE test DROP COLUMN unused_col; 설명은 간단히 이정도로 마치고 실제 겪었던 이슈를 설명하도록 하겠습니다. 엔티티 명세와 테이블 명세가 달라요. 저희 회사에서는 현재 JPA를 사용하고 있어서 Entity 클래스가 따로 존재합니..
MySQL 스레딩 구조 MySQL 서버는 프로세스 기반이 아닌 스레드 기반으로 동작한다. 그리고 이 스레드는 크게 포그라운드 스레드와 백그라운드 스레드로 나뉜다. 41개의 백그라운드 스레드와 3개의 포그라운드 스레드로 총 44개의 스레드가 실행중이다. 위는 MySQL 서버가 전통적으로 가지고 있는 스레드 모델이며, 서버의 설정이나 어떤 에디션을 사용하는지에 따라 다를 수 있다. 포그라운드 스레드 = 클라이언트 스레드 MySQL 서버에 접속된 클라이언트의 수만큼 존재하며 클라이언트 사용자가 요청하는 쿼리 문을 처리 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하던 스레드는 스레드 캐시로 되돌아간다 스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드 캐시에 넣지 않고 스레드를 종..
MySQL 서버는 사람의 머리역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구분할 수 있다. 그리고 손과 발의 역할을 담당하는 스토리지 엔진은 핸들러 API를 만족하면 누구든지 스토리지 엔진을 구현해서 MySQL 서버에 추가해서 사용할 수 있다. MySQL 아키텍처 MySQL 서버는 일반적인 다른 DBMS에 비해 구조가 살짝 독특하다. 이러한 구조는 다른 DBMS에서는 가질 수 없는 이점도 있지만 반대로 문제가 되기도 한다. 아래의 사진에서 SQL 파서, SQL 옵티마이저, 캐시 & 버퍼, CRUD 인터페이스와 + 보이지는 않지만 커넥션 핸들러를 포함하여 MySQL 엔진이라 부르며, MySQL 엔진 + 스토리지 엔진 = MySQL 서버라 부른다. 아래 파일 시스템 부분은 운영체..
지난 1편에서는 리팩토링 중 스프링 프록시와 관련한 문제를 경험하였고 이에 대한 해결책 3가지를 알아보았습니다. 이번 포스트에서는 스프링이 프록시를 생성하는 방법 2가지에 대해 알아보는 시간을 가지려고 합니다. 그리고 스프링 부트에서 설정된 프록시 생성방법에 대해 설명드리겠습니다. 프록시란? 프록시를 검색해보면 아래와 같은 의미를 지니고 있음을 볼 수 있습니다. 어떤 일을 대신 맡아서 행하는 걸 뜻한다는 걸 알수 있습니다. 저희가 흔하게 듣는 프록시 서버가 바로 이러한 뜻입니다. 그리고 지금 포스트하려는 스프링에서 프록시는 어떠한 A객체의 일을 대신 위임받아 행하는 객체라고 이해해주시면 될 것 같습니다. 스프링에서 프록시 생성 방법 스프링에서 프록시를 생성하는 방법은 크게 2가지가 있습니다. CGLIB를..
코틀린 코드를 리팩토링하면서 만났던 에러를 공유합니다. 환경은 아래와 같습니다. kotlin + Spring Boot (2.2.13.RELEASE) kotlin allopen plugin 적용 spring-boot-starter-web 의존 추가 위에도 필요한 의존성이 있을 수 있습니다.. 이슈 같은 로직을 가지고 있지만 때에 따라 조금씩 다른 부분들이었고 앞으로도 재사용 가능성이 있는 코드이기에 이를 추상화시켜 재사용하는 것이 저의 목표였습니다. 따라서 공통적인 부분들을 모아 추상클래스를 아래와 같은 형태로 리팩토링을 하였는데요. private val log = KotlinLogging.logger { } abstract class EvaluationService { @Autowired private ..
지난글에서 쿼리를 수정함으로써 아주 굉장한 효과를 보았습니다. 하지만 만족하지 않습니다. 고민 : 작업을 왜 하나의 스레드로만 하고 있었을까? 지금까지 Batch Update의 1편, 2편 모두 잘 보았더라면 결국 저희가 하고 있는 코드는 id가 1 ~ 1,000,000 인 데이터 행들을 일괄적으로 업데이트하는겁니다. 그렇다면 이런 생각을 해볼 수 있습니다. 왜 내가 이걸 스레드 하나로 돌리고 있어야 할까?? 여러 개의 스레드를 이용해서 각각 범위를 나누어 실행시키면 더 빠르지 않을까 하고 말이죠. 예를 들면 1~ 10000 은 스레드1이 담당하고 10001 ~ 20000는 스레드2가 담당하도록 한다면 동일한 행을 참고할 일도 없으니 여러 개의 스레드로 나누어서 실행해도 문제없을 것 같습니다. 일단 해보..
고민을 너무 많이 했나봅니다. 글이 너무 길어져서 지난 글에 이어 2편으로 다시 돌아왔습니다. 지난 글에서는 메모리와 JPA에 대한 고민을 위주로 글을 썼었더라면 이번 편에서는 데이터베이스와 관련된 고민들을 나열해보았습니다. 고민1 : 쿼리 횟수에 대한 고민 다음으로 고민했던 부분은 쿼리의 횟수였습니다. 분명 지난번 rewriteBatchedStatements 설정을 통해 쿼리가 나가는 횟수를 여러개에서 한번으로 줄였는데 무슨 또 쿼리 횟수를 고민하냐라고 하실수 있습니다. 하지만 그것과는 별개로 다른 문제가 있습니다. 1000개의 쿼리를 한번에 보냄으로써 여러 번 네트워크를 타거나 쿼리를 보내기 위한 과정을 줄일 수 있었지만 1000개의 쿼리를 한번에 보냈다 해서 데이터베이스에서 쿼리를 한번 실행시키는게..
650만건 정도의 데이터를 일괄로 업데이트해야 하는 상황이 생겼습니다. 이 과정에서 고민했던 부분들과 그 고민들을 어떻게 해결하였는지를 간단하게 글로 남겨 공유를 드리려고 합니다. 글을 쓰기 이전에 아래와 같은 의문이 들수도 있을것 같아 문답 형식으로 남겨놓았습니다 :) 왜 코드를 통해 일괄 업데이트를 진행하였나요? 처음에는 sql을 이용하여 일괄 업데이트 할 계획이었지만, 해당 컬럼을 세팅하기 위해서는 여러 비즈니스 로직들이 들어가게 되면서 sql 만으로는 업데이트 하지 못하는 상황이었습니다. 스크립트 언어를 사용하였나요? 저희 회사에서는 spring boot + kotlin을 주력으로 프로젝트를 구성하고 있습니다. 물론 스크립트 언어를 이용하여서도 가능은 할 수 있었지만 여러 비즈니스 로직들을 다시 ..