spring boot 2 책을 보면 WebMvcTest DataJpaTest, JsonTest, RestClientTest  등을 설명하는데..

 

이것만 있는 것이 아니다. 

 

여러 개가 더 있다.

 

https://docs.spring.io/spring-boot/docs/current/reference/html/test-auto-configuration.html

 

Appendix D. Test auto-configuration annotations

Appendix D. Test auto-configuration annotations The following table lists the various @…Test annotations that can be used to test slices of your application and the auto-configuration that they import by default: Test sliceImported auto-configuration@DataJ

docs.spring.io

 

@DataJdbcTest

@DataLdapTest

@DataMongoTest

@DataNeo4jTest

@WebFluxTest

@DataRedisTest

@JdbcTest

@JooqTest 등을 포함한다.

 

 

자세한 내용은 다음을 확인한다. 

 

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html

 

46. Testing

A Spring Boot application is a Spring ApplicationContext, so nothing very special has to be done to test it beyond what you would normally do with a vanilla Spring context. By default, @SpringBootTest will not start a server. You can use the webEnvironment

docs.spring.io

 

Posted by 김용환 '김용환'

 

소프트 스킬을 읽고 괜찮은 부분을 발췌한다.

 

 

<발췌>

 

1. 새로운 습관 만들기

 

존 레식 (John Resig) 블로그에서는 '코드를 매일 작성하라'라는 제목의 글이 있다.

 

매일 최소 30분씩 코드를 작성하는 습관을 들이기 전에는 부가적으로 진행하는 프로젝트에 아무런 진척이 없었다. 그 게 습관이 되니 생산성에 큰 향상이 있었다고 한다. 

 

https://johnresig.com/blog/write-code-every-day/

 

John Resig - Write Code Every Day

Last fall, work on my coding side projects came to a head: I wasn’t making adequate progress and I couldn’t find a way to get more done without sacrificing my ability to do effective work at Khan Academy. There were a few major problems with how I was work

johnresig.com

 

새로운 습관을 만드는 것은 새로운 반복 행위를 만드는 것과 비슷하다. 긍적적인 습관이 많을 수록 목표로 가는 길은 더 쉬워질 것이다.

 

다음에는 새로운 습관을 위한 신호를 찾아야 한다. 

 

소프트 스킬의 저자는 매일 저녁 30분씩 기술 서적을 읽는 습관을 가졌고 매일 30분씩 걷는 새로운 습관을 개발하기 로 했다.

 

 

 

 

 

 

2. 뽀모도로 기법

 

학자인 푸앵카레는 다음과 같이 말했다.

 

규칙적으로 오전 10시부터 12시까지, 오후 5시부터 7시까지만 일했다.그는 더 일해봐야 얻는 게 거의 없다고 생각했다.

 

 

 

 

<느낌>

 

내 생각과 많이 비슷한 내용이 적혀 있었다.

 

개발 + 안정적인 재정 독립!!!

Posted by 김용환 '김용환'

 

https://perso.limsi.fr/pointal/_media/python:cours:mementopython3-english.pdf

불러오는 중입니다...

 

 

Posted by 김용환 '김용환'

최근에 아는 DBA로부터 들었던 쇼킹한 줄임말


(약자)

최한시 , 최번시



최한시 - busy hour, peak hour, peak busy hour (트래픽이 가장 많은 시간대)

최번시 - idle hour, off-peak hour (트래픽이 가장 적은 시간대)


정보통신기술용어 뿐 아니라 특허, 정책연구원에서 사용하는 단어였다.



한가한 시간, 새벽 작업이라고  했지.


지금까지 개발하면서 한번도 써보지 않은 단어였다..

Posted by 김용환 '김용환'




오늘 트위터 CTO와의 간담회를 마치고 바깥에 나오는데..


점심식사를 같이 하면 좋겠다는 인사팀 수장님이 얘기가 나왔다.





잠깐동안 망설였다.




아.. 내가 트위터 CTO와 밥을!!!   동료와의 점심 식사 약속을 어떻게 하지?


동료와는 다음 주에도 식사할 수 있긴 한데... 어떻게 하지?


으와..










인사팀 수장에게 정중하게 거절하고 동료를 만났다.


(쏘리 트위터 CTO~~)



저녁에 돌아보니.. 나는 미쳤나 보다... 


그런 기회를 놓치다니.. 




그래도 내 동료와 점심 시간 약속을 지켜서.. 그게 참 좋았다. 





Posted by 김용환 '김용환'


kubernetes의 pod의 bash에 접근하려면, 먼저 pod 이름을 알아야 한다.



$ kubectl get pod

NAME                                READY   STATUS    RESTARTS   AGE

jenkins-8498fcb9b5-8k8b8         1/1     Running   0          40m



docker와 비슷하게 pod 이름으로 bash에 접근한다. 


$ kubectl exec -it  jenkins-8498fcb9b5-8k8b8 -- /bin/bash




Posted by 김용환 '김용환'

보통 kubernetes pod을 재시작하려면 deployment 파일을 이용하는 경우가 많지만..


설정 파일 없이 확인하는 방법도 있다.



먼저 도커 이미지 이름을 얻는다.


아래 커맨ㄷ는 실제 컨테이너의 데타 데이터 이름과 컨테이너의 도커 이미지 이름을 얻는 커맨드이다.


$ kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort


ingress-nginx-controller-szb9s: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0,

ingress-nginx-controller-ttq2h: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0,

jenkins-8498fcb9b5-6n2vm: jenkins/jenkins:lts,

kube-apiserver-dkosv3-jenkins-master-1: gcr.io/google-containers/hyperkube-amd64:v1.11.5,

kube-apiserver-dkosv3-jenkins-master-2: gcr.io/google-containers/hyperkube-amd64:v1.11.5,

kube-apiserver-dkosv3-jenkins-master-3: gcr.io/google-containers/hyperkube-amd64:v1.11.5,




원하는 것은 바로 아래 커맨드이다. 메타데이터와 컨테이너 이름을 얻을 수 있다.


$ kubectl get pods -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name

NAME                                                           CONTAINERS

jenkins-job-8f24e681-5b83-4f87-b713-69c86deedb22-25gsh-vjh9r   jnlp

jenkins-job-914tx-fthwt                                        jnlp

jenkins-8498fcb9b5-6n2vm                                    jenkins

my-release-mysql-65d89bd9c4-txkvn                              my-release-mysql








재시작을 진행한다. reboot 커맨드가 도커 안에 포함되어 있으면 다음처럼 실행한다.


$ kubectl exec jenkins-8498fcb9b5-6n2vm -c jenkins reboot



만약 다음 에러가 난다면, kill 커맨드를 사용해야 한다.


rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"reboot\": executable file not found in $PATH"




kubectl exec jenkins-8498fcb9b5-6n2vm -c jenkins  -- /bin/sh -c "kill 1"



Posted by 김용환 '김용환'


debezium을 이용해 CDC(change data caputre) 기능을 접목하려 할 때.  GTID와 binlog 설정에 도움이 되는 설정(테스트 환경 설정)은 다음과 같다.



server-id         = 111

log_bin           = mysql-bin

expire_logs_days  = 1

gtid-mode         = ON

enforce-gtid-consistency = ON

binlog_format     = row
enforce_gtid_consistency  = on

#binlog_cache_size

#max_binlog_size





snapshot 모드를 위해 select, reload, show databases 권한이..

connector 최소 연결을 위해 replication slave, replication client 권한이 필요하다.



GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium' IDENTIFIED BY 'dbz';




참고 


https://github.com/debezium/docker-images/blob/master/examples/mysql/0.8/mysql.cnf


https://dev.mysql.com/doc/refman/5.5/en/replication-options-binary-log.html


https://debezium.io/docs/connectors/mysql/#topic-names

Posted by 김용환 '김용환'


pod의 ip를 알려면 다음과 같은 커맨드를 사용한다.


$ bkubectl get pods

pod의 이름을 얻는다.


$ kubectl get pod <포트-이름> --template={{.status.podIP}}

10.10.10.10

Posted by 김용환 '김용환'

kafka-connect_1    | [2019-03-18 08:23:37,859] ERROR WorkerSourceTask{id=inventory-connector-0} Task threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerTask)

kafka-connect_1    | org.apache.kafka.connect.errors.ConnectException: Creation of database history topic failed, please create the topic manually

kafka-connect_1    | at io.debezium.relational.history.KafkaDatabaseHistory.initializeStorage(KafkaDatabaseHistory.java:348)

kafka-connect_1    | at io.debezium.connector.mysql.MySqlSchema.intializeHistoryStorage(MySqlSchema.java:266)

kafka-connect_1    | at io.debezium.connector.mysql.MySqlTaskContext.initializeHistoryStorage(MySqlTaskContext.java:196)

kafka-connect_1    | at io.debezium.connector.mysql.MySqlConnectorTask.start(MySqlConnectorTask.java:137)

kafka-connect_1    | at io.debezium.connector.common.BaseSourceTask.start(BaseSourceTask.java:47)

kafka-connect_1    | at org.apache.kafka.connect.runtime.WorkerSourceTask.execute(WorkerSourceTask.java:198)

kafka-connect_1    | at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:175)

kafka-connect_1    | at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:219)

kafka-connect_1    | at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

kafka-connect_1    | at java.util.concurrent.FutureTask.run(FutureTask.java:266)

kafka-connect_1    | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

kafka-connect_1    | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

kafka-connect_1    | at java.lang.Thread.run(Thread.java:748)

kafka-connect_1    | Caused by: java.util.concurrent.TimeoutException

kafka-connect_1    | at org.apache.kafka.common.internals.KafkaFutureImpl$SingleWaiter.await(KafkaFutureImpl.java:108)

kafka-connect_1    | at org.apache.kafka.common.internals.KafkaFutureImpl.get(KafkaFutureImpl.java:274)

kafka-connect_1    | at io.debezium.relational.history.KafkaDatabaseHistory.getKafkaBrokerConfig(KafkaDatabaseHistory.java:353)

kafka-connect_1    | at io.debezium.relational.history.KafkaDatabaseHistory.initializeStorage(KafkaDatabaseHistory.java:337)

kafka-connect_1    | ... 12 more



원인은 kafka connect 포트 이슈이다.



docker compose를 사용할 때. 

kafka를 9092로 띄우면 docker 이슈가 발생한다. 따라서 저 에러가 나면 해당 포트(9092)에 데몬 이슈가 있으니 아래 링크를 참고해서 kafka:29092로 변경하고 관련해서 kafka_connect 컴포넌트에서 kafka:29092에 연결하도록 변경한다. 




https://rmoff.net/2018/08/02/kafka-listeners-explained/



Posted by 김용환 '김용환'