Posts

Showing posts from July, 2020

refactoring #2 moving features between Objects

이번 장은 주로 여기저기 퍼져있는 method들을 다시 재배치하고, public 에서 가릴건 가리고, 하는 방법이다. 1. method 나 class  를 따로 빼거나 이동하게 되면, 작업을 마친 뒤 original method, class  를 다시한번 살펴본다. 그러면 single-responsibility 를 더 잘 표현하는 increased clarity 로 renaming 할 수 있을지도 모른다. (여러 기능을 하던 것들이 빠져나갔기 때문에) 2. 이런 경험이 많지는 않아도 한 두번 있었던것 같은데.  library  class 에 원하는 method 하나가 없는 경우가 있다. 그런 경우, 아래와 같은 방법이 가능하다.  introduce foreign method method  를 하나 만들어서,  거기에 library object  를 parameter 로 받아서 필요한 기능을 구현한다.  introduce local extension    library class 를 extend 하거나, wrapper class 를 만든다. final  keyword  등으로 extend 를 할 수 없는 경우 wrapper class 를 만들어서 감싸면 되는데, 이 경우 기존 library class 의 모든 public class 를 delegate 해서 호출해줘야 한다.: 전반적으로 이번챕터는 지난  extract 챕터와 거의 유사해보인다. 아직 이런 경우에 대한 경험이 없어서 그런것 같다. 어쨌든 요점은, 1 class  1 responsibility 를 유지하는 것이 중요하며, class 가 점점 커져가면서 여러가지 field, method  들이 추가되게 되면, 어느 순간 extract class 하는것이 필요하고, 이때 관련 field, method 들을 새로 만든 class 로 이동시키면된다. 그리고 ...

Efficient PostgreSQL Index 생성을 위한 몇가지 참고점

B-Tree MySQL 과 마찬가지로, CREATE INDEX 를 하게 되면 B-Tree 를 사용한다.  B-Tree 는 별도로 공부해야하지만,  it tries to remain balanced. 가 핵심이다. 각 tree의 branch 들에 속한 값의 양들이 거의 동일하게된다.  INDEX  Case by case  select * from foo where bar = 1 select * from foo where bar = 2 bar=2 인 경우가 굉장히 많으면, 오히려 안타게 된다. sequential scan 이 index scan 보다 훨씬 빠르기 때문이다. Partial Index Index 는 Index 인데, where 조건이 포함된 Index 이다 Index size 를 줄임으로써 Index에 대한 효율성을 높일 수 있다 아래와 같은 경우, comments 중 flag 가 true 인 것들에 대해서만 created_at에 Index 를 걸 수 있다.  CREATE INDEX idx_comments_flagged_created_at ON comments ( created_at ) WHERE flag IS TRUE ; Expression Index data 를 function 에 넣은 결과값에 대해 Index를 걸 수 있다.   예를들어, 사용자의 email 계정을 저장하는  column  이 있다고 할때,  사용자가 입력한대로 값은 저장하되 로그인등 인증시에는 아래처럼 소문자로 처리하고 싶으면,   WHERE lower(account) = '{lowercased_email}'  Index 는 아래와 같이 걸수 있다.  CREATE INDEX idx_users_account_email ON users ( lower ( account ) ) ;   혹은 Timestamp Column 에 대해 날짜에 대...

OptaPlanner 공부하기 - 1

Optaplanner 란 간단히 말해서, 최적화 문제를 인공지능적인 방법으로 접근해서 해결해주는 open source java library 이다. maven 을 통해 import  를 할 수있으며, 소스 또한 github 에 공개 되어 있다. pure 100%  java 로 짜여있고, SpringBoot 와도 compatible 하다.  문제를 해결하기 위한 수학적 방정식같은걸 짜지 않아도 된다고 한다.  Optaplanner 라는 이름에서도 유추할 수 있겠지만, 이 도구가 해결해주는 문제는 간단히는 knapsack problem 부터 시작 해서,  vehicle routing, employee rostering, maintanence scheduling, task assignment, school timetabling 같은 것들이 있다. 제한된 자원을 문제 해결을 위해 할당해서 처리해야 하는데 optimal solution  을  내주는 것이다.  인공지능 하면, 방대한 데이터를 학습시켜서 판단하는 gene 같은걸 형성하는 거라고 생각했는데, maven library 를 import 하는 것만으로도 된다니 신기하다.  knapsack 문제 해결하는 예제를 따라가면서 해봤는데, 일단은 신기하다. 일단 개발자가 해야하는 일은 문제와 제약조건들에 annotation  을 달면 된다.  하나하나 앞으로 공부해가야 할 것들이다. @PlanningEntity, @PlanningVariable, @PlanningEntityCollectionProperty, @ProblemFactProperty, @PlanningScore solution 에 제약 조건들은 예를 들면 아래처럼 나타낼 수 있다. knapsack 같은 경우, maxWeight 를 넘으면 안되면서(penalize),   private Constraint maxWeight(ConstraintF...

MySQL slow log 원인 찾기 / "commit; set timestamp" analysis using performance_schema table

Image
MySQL slow query 를 보다보면 이해가 가지 않는 경우가 있다. # Time: 2020-07-02T15:44:14.145642Z # User@Host: mydatabase[mydatabase] @ [10.1.1.5] Id: 32026 # Query_time: 0.200300 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 use mydatabase; SET timestamp=1575301453; commit; 위 로그는 실제로 겪은 경우인데, Lock_time 도 0이고, rows_sent, rows_examined 도 0인데 0.2초가 넘는 시간이 걸렸다. 한번이면 그냥 무시하고 넘어가려고 했는데, 이 로그가 수십번 넘게 계속 쌓여가고 있어서 찾아봤다. MySQL 에서 제공하는 테이블중 innodb_trx 라는 테이블이있다.   select * from information_schema.innodb_trx; 실행 해보면 위와 비슷한 결과가 나오는데, application server 로부터 DB 에 connection 을 맺고 현재 진행중인 transaction 을 볼 수 있다. 왠만한 쿼리가 아닌 이상 매우 짧은 시간안에 끝나기 때문에 수행 할 때마다 결과 값이 바뀐다. 하지만 더 재미있는 테이블은 performance_shcema DB에 있다. MySQL 8.0부터 제공했던것 같다. https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html 여러가지 테이블이있지만 그중 가장 관심이 있는 테이블은 events_statements_history 와 threads 테이블이다. 이제 위 테이블의 trx_mysql_thread_id 컬럼의 값을 이용해서 performance_schema 를 조회해볼 수 있다. 그럼 저 trx_mysql_thread_id 에서 어떤 일들이 일어났는지를 알 수 있다. select SQL_TEXT FROM perform...