728x90

분류 전체보기 173

Effective Kotlin - Item01

가변성을 제한해라 들어가기에 앞서 이건 완전한 번역글이 아닙니다. 원서를 읽고 느낀점을 적은 글 입니다. 본문 일단 첫장 부터 가변성을 제한하라고 적혀있다. 책에서 나온 글귀중 이런 글이 있다. When an element holds state, the way it behaves depends not only on how you use it, but also on its history 나는 이뜻을 이렇게 해석했는데 element 가 상태를 지니고 있을때 상태를 다루는 방법은 오직 어떻게 사용하는 것에만 의존하는 것이 아니라 그것의 History(객체의 변화 상태를 보여주는 것이라고 나는 해석했다) 에도 관련있다. 그래서 아래 예시가 나오는데 같이 한번보자. class BankAccount { var ba..

Kotlin 2022.05.25

GC 분석해보기

이번에 새로 진행하는 신규 프로젝트를 작업중이였는데 모니터링을 하던 도중 의도치 않게 MinorGC 가 자주 발생하고, 시간 또한 긴것을 발견하였다. 그래서 이를 어떻게 개선했는지 그 방법에 대해서 적어보려고 한다. 탐색 일단 Spring Application Proccess 의 번호를 알아야 한다. jps 프로세스를 알았다면 현재 HeapDump 를 떠서 확인해야 한다. (내 프로세스 번호는 6485번 이였다.) jmap -dump:format=b,file=heapdump.hprof 6485 잘 dump 가 떠졌다면 아래와 같이 heapdump.hprof 라는 파일을 확인할 수 있을 것이다. 이 파일을 열기 위해서 GC 를 Monitoring 할 수 있는 도구인 VisualVM 을 이용했다. Dump ..

Kotlin 2022.05.24

AWS LogInsight 를 통해 RDS 하루마다 발생하는 SlowQuery 개수 검색하기

AWS LogInsight Query 를 사용하다보면 이런 생각이 문득든다. @message field 안에 들어있는 메세지들을 어떻게 분리하여 검색조건으로 사용할 수 있을까? 혹은 @message 안에 텍스트들을 내가 특별하게 변수로 활용할 수 있을까? AWS LogInsight Query 를 공부해보거나 많이 사용해봤다면 알수도 있겠지만 이런 방법에 대해 설명해보려고 한다. 이제 어떻게 @message 내부를 검색의 조건으로 사용할 수 있는지 알아보도록 하자 예시 위의 사진을 보라 @message 본문의 내용들이다. 밑에 SELECT * FROM 뭐시기와 같은 field 도 적혀있다. 다만 보안상 쿼리는 보여줄 수 없어서 적지 않았지만 생김새는 RDS 의 slowQuery log 를 생각하면 된다. ..

AWS 2022.05.23

HTTP Pipelining

HTTP Pipelining 기존 HTTP/1.0 에서는 여러개의 Request 와 Response 를 순차적으로 받기 위해 아래와 같은 방식으로 Transaction 에서 요청과 응답을 처리했다. 위와 같은 형테이므로 여러건의 요청이 오게됬을때 하나의 과정 (요청을 보내고 응답을 받기까지) 이 마치고 난뒤에야 다음 요청에 대한 과정을 진행할 수 있는 구조였다. 그래서 여러건의 요청을 보내야 하는 요청-응답의 구조가 순차적이므로 상황에서는 시간이 오래걸릴수 밖에 없었다. 또한, 한가지 문제가 더 있었는데 똑같은 도메인에 대해 요청건을 많이 보내게 될 경우가 대다수인 브라우저 환경에서 새로운 요청을 보낼때 다시 TCP Connection 을 맺게 되는 경우 TCP 의 Slow Start 나, 다시 3-Wa..

CS 2022.05.22

End-To-End Header / Hob-by-Hob Header

End-To-End Header / Hob-by-Hob Header End-To-End Header end-to-end Header 는 마지막 Receiver 에게 전달되어야 하는 Header 입니다. 따라서 Proxy 서버에서 이를 임의로 변경해서는 안됩니다. Cache-Entry 의 일부로 저장되어야 Hob-By-Hob Header 현재 Transaction 에서 사용되는 Header 입니다. Hob-By-Hob Header 가 Final Receiver 에게 갔을때 Client 는 Nginx(Web Server) 와 Keep-Alive Connection 을 맺고 싶어 Connection: keep-alive 헤더를 넘겨주었는데, Nginx 에서 이를 해석하지 못하고 Application Serve..

CS 2022.05.22

AutoScailing Group 만들어보기

Auto Scailing Group 이란? Auto Scailing Group 은 AWS 에서 제공하는 다중 서버 서비스이다. Auto Scailing Group 에 묶인 인스턴스들은 같은 성능과 같은 코드를 가지고 있다. 따라서 우리는 ASG 를 통해 우리가 원하는 서버의 인스턴스를 다수로 늘리거나 줄이는 것을 관리할 수 있다. 실습 일단 ASG(AutoScailing Group) 을 만들기 위해 하나의 인스턴스가 필요한데, 이건 각자 알아서 만들어 오길 바란다. Spring 으로 뛰어와도 좋고 어떤 방식으로던 Server 를 뛰어오면 된다. 이미지 생성 일단 준비해온 인스턴스를 이미지(Amazone Machine Image?) 로 만들어야 한다. 이미지로 만들어야 하는 이유는 우리가 ASG 로 운용할..

AWS 2022.05.18

Kotlin Delegation

Delegation 은 코틀린에서 지원하는 문법적 기능 중 하나인데, 이는 Delegation Pattern 의 Boiler Plate 를 줄여주는 Sugar Syntex 중 하나이다. Delegation Pattern 은 쉽게 말해 상속이 아닌 다른 객체에게 세부 구현을 위임하는 것이다. 공식문서의 예제를 한번 살펴보자. interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { print(x) } } class Derived(b: Base) : Base by b fun main() { val b = BaseImpl(4) Derived(b).print() } 위의 예제는 Derived 의 내부 인터페이..

Kotlin 2022.05.16

Kotlin Class 내부 object 에서 Class Property 참조하는 법

오늘 Kotlin 을 사용하다가 objcet 로 만든 곳에서 Class 내부 Property 를 참조해야 하는 일이 생겼다. 코드는 대략적으로 아래와 비슷한 상황이였다. interface Roach { fun roa() } class Test( val testProperty: String, ) { fun test() { object : Roach { override fun roa() { // testProperty 에 접근하고 싶음 } } } } 처음에는 음 this 를 사용하면 붙어질까? 라는 생각을 했지만 당연히도 익명 클래스의 안이기 때문에 오히려 this 에 맵핑되어 있는 객체는 익명 클래스의 인스턴스 라는 것을 깨닫게 됬다. 그래서 어떻게 할까 하다가 아래와 같은 방법이 되는지도 테스트 해봤다...

Kotlin 2022.05.11

MySQL Hint

MySQL 에서 Hint 란 옵티마이저의 실행계획을 바꾸는 것을 뜻한다. 대부분의 MySQL 책에서 왠만해서 Hint 를 사용하는 일은 없을 것이라고 말했고, 오히려 내가 주는 Hint 가 "훈수" 느낌으로 될 수 있어서 오히려 성능을 악화시킬 수도 있다고 알고 있었다. 그리고 옵티마이저 자체가 대부분 똑똑한 의사결정을 해서 필요하다고 생각하지 않았는데, 오늘 신규프로젝트를 구성하던 도중 잘못사용하는걸 파악했다. 현재 쿼리를 날렸을때 실행계획은 아래와 같다. test1 은 현재 자주사용하는 쿼리에 맞게 인덱스를 구성했는데, PRIMARY 인덱스를 사용해서 현재 filtered 가 10 밖에 나오지 않는다. 인덱스를 구성할때 test1 인덱스를 사용하여 filtered 가 100 이 되는게 내 목표였다. ..

DB 2022.05.09

고차함수에서 Return 이 안되는 이유

코틀린에서 가끔씩 고차함수에서 Return 을 할 경우에 안되는 경우가 있다. 바로 아래 코드와 같은 상황일 경우에 말이다. fun forEach(a: IntArray, action: (Int) -> Unit) { for (n in a) action(n) } fun main() { forEach( intArrayOf(1, 2, 3, 4)) { if (it 3) return println(it) } ) } 이 이유는 무엇일까? 이건 일단 람다 안에서의 return 에 대해서 생각해봐야 하는데, 일단 lambda 안에서의 return 은 가까운 함수 혹은 무언가 람다를 둘러싸고 있는 환경을 반환하려고 시도한다. 즉 위의 코드에서는 return 이라는 함수가 main() 함수를 반환하려고..

Kotlin 2022.05.03
728x90