-
막연한 두려움
불현듯 막연한 두려움이 찾아올 때가 있습니다. 성실한 사람들은 두려움이 찾아올 때 무언가와 싸우려고 합니다. 막연한 두려움은 시야를 협소하게 만들고 생존에 위협을 느끼게 합니다. 비이성적인 사고에 기반한 의사결정은 자원의 낭비 또는 거대한 실패로 이어질 가능성이 높습니다. 두려움은 전염성이 강합니다. 하지만 항체가 있는 사람이 있다면 두려움을 막을 수 있습니다. 두려움이 느껴질 때는 그 대상을 객관적으로 바라보기 위해 노력해야 합니다. 하지만 모든 순간마다 이러한 사실을 인지하는 것은 많은 훈련이 필요합니다. 생각이 파도처럼 밀려와 잠기게 되면 빠져나오기가 어렵습니다. 그래서...
-
일을 위한 일
저는 일을 위한 일을 하는 것을 굉장히 싫어합니다. 가끔 일을 멋있게 하려는 시도들이 있습니다. 일은 빠르고 단순하고 정확하게 하는 것이 가장 멋있습니다. 일은 어렵지 않게 해결할 수 있는 경우가 많고, 이것 저것 따질 것 없이 그냥 하면 되는 경우가 많습니다. 목표가 없는 일은 하지 않는 게 맞습니다. 차라리 그 시간에 동료랑 커피나 한 잔 마시고 옵시다.
-
회의혐오자
일을 하다 보면 습관성 미팅에 초대되는 경우가 많습니다. 회의는 반드시 달성하고자 하는 목표가 명확히 존재해야 합니다. 별로 중요하지 않거나, 너무 당연하거나, 누구나 다 아는 말을 꺼내서 ‘나 일 잘해요’를 자랑할 필요는 없습니다. 어떻게 해도 크게 상관 없는 것은 내가 정하거나 해치운 뒤 피드백을 받는 것이 편합니다. 이른 아침, 퇴근 시간, 점심 직전/직후 미팅은 매너상 피하는 것이 좋겠습니다.
-
Spring Boot에서 File을 송수신할 때의 disk I/O
disk I/O는 머신 전체에 영향을 미치기 때문에, 하나의 머신에서 여러 process를 사용한다면 신중해야 한다. 기본적으로, JVM 기반의 언어(Java, Kotlin)에서 사용하는 File 또는 Resource 관련 class들은 in-memory data를 관리하는 게 아니다. 이러한 class들은 input stream을 이용해서 binary를 ‘읽어 오는’ 작업과 그 파일의 메타 데이터를 ‘관리하는’ 역할을 수행한다. MultipartFile을 수신할 때 MultipartFile을 수신하면, 서블릿은 이 파일을 disk의 temp directory에 임시로 ‘저장’한다. MultipartFile은 Resource를 member로 가지고 있고, Resource는 binary를 input stream을 통해 읽어 오는데, 서블릿은 binary를 disk에서 직접...
-
Kotlin에서 ByteArray를 MultipartFile로 post하기
val file = object : ByteArrayResource(byteArray) { override fun getFilename(): String { return "tempFileName.ext" } } val headers = HttpHeaders() headers.contentType = MediaType.MULTIPART_FORM_DATA val body: MultiValueMap<String, Any> = LinkedMultiValueMap() body.add("file", file) val requestEntity = HttpEntity(body, headers) val response = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, object : ParameterizedTypeReference<String?>() {}) 구현체를 못 봐서 정확히는 모르지만, 추측하자면 MultiparFile의 interface에는 getResource()가 정의되어 있고, Resource 타입의 객체를 리소스로서 들고 있는 것 같다. ByteArrayResource는 Resource를 조상 클래스로 두고 있는, ByteArray를 리소스로 관리하는 클래스이므로...