본문 바로가기

TIL

(28)
TIL) Kotlin Test https://mockk.io/ MockK Provides DSL to mock behavior. Built from zero to fit Kotlin language. Supports named parameters, object mocks, coroutines and extension function mocking mockk.io 아래 글은 어떤 외국 PPT 자료를 참고하였는데, 어디서 받았는지 기억이 나질 않는다.. 1. 테스트용 공통 인스턴스 @TestInstance(TestInstance.Lifecycle.PER_CLASS) class TestClass{ private val name = "TOMAS" private val age = 28 @Test fun test1() { } @Test fun ..
TIL) Airflow Xcom 1. Airflow Xcom Airflow : airbnb 에서 만든 오픈소스. workflow 를 쉽게 관리할 수 있는 툴이다. 예를 들어, 본인의 코드에 @Scheduled 에너테이션으로 관리하는 코드가 여기저기 흩뿌려져 있다면, airflow 를 통해 쉽게 관리할 수 있다. 또는, 순서가 정해져 있는 여러 Job 들을 주기적으로 실행해야 할 경우에 airflow 를 통해 쉽게 workFlow 를 정의하고, 실행하고, 스케줄링하고, 모니터링할 수 있다. airflow 의 아키텍쳐는 아래와 같다. Scheduler : Dag 와 Task 들을 관리한다. 등록된 시간에 등록된 Task 들을 실행하도록 스케줄링하고 모니터링한다. WebServer : Airflow 에서 제공하는 관리용 Web Ui 서버. ..
TIL) EPSILON, 몽고 업데이트시 다른 컬럼 값 참조, 몽고 덤프 1. Epsilon 테스트 코드에 엡실론이라는 단어가 나와서 살짝 당황했다. 엡실론 : 테스트 코드에서, 소숫점 결과를 검증할 때 차이가 몇 이하로 계산되는가 ? 를 검증한다고 치면, 몇 이하 의 몇 을 앱실론이라 하는 듯 하다. [AssertJ] val EPSILON = 1e-8 assertThat(Actural) .isEqualTo(Expected, within(EPSILON)) assertThat(Actural) .isCloseTo(Expected, within(EPSILON)) // Actural 과 Expected 의 값이 EPSILON 이하인가. // isEqualTo 와 isCloseTo 의 결과는 같다. assertThat(8.1).isEqualTo(8.0, within(0.2)) // p..
TIL) 인덱스, DFA 1. 인덱스 인덱스란 메모리에 { 특정 컬럼 : 주소 } 를 기록해놓은 목차이다. 이 목차를 조회하면 주소를 통해 데이터의 위치를 빠르게 찾을 수 있다. => select 가 빠르다. 인덱스는 하나의 테이블에 대해 저장되는 또 하나의 정보라 할 수 있다. 인덱스는 B-Tree 방식으로 저장하고 빠르게 조회할 수 있다. Root 노드 -> Branch 노드들 -> 리프 노드 의 구조이다. { 컬럼 : 주소 } 의 정보는 리프 노드에 저장되어 있다. Root 노드, Branch 노드는 리프 노드를 빠르게 찾아가기 위해 적절히 나눠져 있다. 이런 목차가 있다면 Select 구문이 빠르다. 반면 Update, Delete, Insert 동작은 느려지게 된다. 데이터가 추가되면, 그 데이터도 인덱스에 추가시켜야 ..
TIL) Webserver vs WAS, NGNIX vs Apache [웹서버] 웹서버는 정적인 자원만을 처리할 수 있다. (html, css) (Apache Http Server) [CGI] 동적인 자원 즉 요청된 데이터로 어떤 프로그래밍 작업을 한 후 응답을 주는 니즈가 생김. 그래서 생긴게 CGI (Common Gateway Interface). (인터페이스다.) 이는 웹서버와 CGI 구현체 사이의 인터페이스 즉 규약이다. 웹서버에서 에서 동적인 응답을 받고, 자신이 처리하지 못해 CGI 구현체에게 줄 때의 규약이다. [CGI 단점] 하지만 이 CGI 는 웹서버 -> CGI 구현체로 요청을 줄 때 한 요청당 프로세스를 만든다. 그리고, 한 프로세스마다 하나의 CGI 구현체를 사용한다. 따라서 한 요청에는 프로세스 한개, CGI 구현체 한개를 만들어 사용해야 한다. 프..
TIL) associate 시리즈 1. associate 시리즈 설명을 위한 클래스. class Person( val name: String, val age: Int ) val people = listOf(Person("a", 1), Person("b", 2), Person("c", 3)) associate { } : 인자로 () -> Pair() 를 받는다. list.associate { Pair(it.name, it) } associateTo { } : 인자로 결과가 저장될 Map 과 () -> Pair() 를 받는다. val result = destinationMap.putAll( people.associate { Pair(it.name, it) } ) 위와 아래는 같다. val result = people.associateTo {..
TIL) Enum, Memory Commit & OverCommit 1. Enum Enum 은 이전에 쓴 글에도 잘 설명되어 있지만, 간단하게 기억을 정리할 겸.. Enum 은 자바에서 정의된 java.lang.enum 을 상속해서 만들어진다. enum 상수들의 초기화는 아래와 같은 순서로 이루어진다. 클래스 로더에 의해 로딩 클래스 계층구조 연결 정적 초기화 블록에 의해 초기화 enum 의 바이트코드를 뜯어보면 알겠지만, 정적 (static) 초기화 블록 이 있다. 여기서 enum 상수들의 초기화가 진행된다. 그리고, 생성자가 private 으로 막혀있다. ==> 정적으로 한번만 생성되는 싱글톤 오브젝트 즉, 상수이다. [enum 의 값이 초기화 되는 경우] enum 값을 처음 얻을 때 (ex println(MyEnum.TEST)) enum 의 정적(static) 메서..
TIL) @Transactional Propagation, 스프링에서 초기화 코드를 넣기 1. @Transactional Propaction 스프링에서 트랜젝션을 설정하는 @Transactional 에는 전파레벨을 설정할 수 있다. @Transactional(propagation = Propagation.) PROPAGATION_REQUIRED 디폴트 값. 부모 트랜잭션이 있을 때 부모 트랜잭션에 참여. 없으면 새로운 트랜잭션 시작. 자식 트랜잭션에서 예외가 발생하면 부모 트랜잭션까지 모두 롤백. PROPAGATION_SUPPORTS 부모 트랜잭션이 있을 때 부모 트랜잭션에 참여. but 없으면 트랜잭션 없이 동작. PROPAGATION_MANDATORY 부모 트랜잭션이 있을 때 부모 트랜잭션에 참여. 부모 트랜잭션이 없다면 Exception 발생. PROPAGATION_REQUIRES_NE..