-
일을 위한 일
저는 일을 위한 일을 하는 것을 굉장히 싫어합니다. 가끔 일을 멋있게 하려는 시도들이 있습니다. 일은 빠르고 단순하고 정확하게 하는 것이 가장 멋있습니다. 일은 어렵지 않게 해결할 수 있는 경우가 많고, 이것 저것 따질 것 없이 그냥 하면 되는 경우가 많습니다. 목표가 없는 일은 하지 않는 게 맞습니다. 차라리 그 시간에 동료랑 커피나 한 잔 마시고 옵시다.
-
회의혐오자
일을 하다 보면 습관성 미팅에 초대되는 경우가 많습니다. 회의는 반드시 달성하고자 하는 목표가 명확히 존재해야 합니다. 별로 중요하지 않거나, 너무 당연하거나, 누구나 다 아는 말을 꺼내서 ‘나 일 잘해요’를 자랑할 필요는 없습니다. 어떻게 해도 크게 상관 없는 것은 내가 정하거나 해치운 뒤 피드백을 받는 것이 편합니다. 이른 아침, 퇴근 시간, 점심 직전/직후 미팅은 매너상 피하는 것이 좋겠습니다.
-
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를 리소스로 관리하는 클래스이므로...
-
Kotlin에서 JPA 기본 repository interface 사용시 불편한 점
JPA의 respository interface를 코틀린에서 사용하면 조금 불편한 상황이 발생한다. interface SometingRepository : CrudRepository<Something, Long> { // (1) fun findById(id: Long): Something? // (2) fun findByIdAndActiveIsTrue(id: Long): Something? } val entity = somethingRespoitory.findById(id); 여기서 entity의 type은 Optional<T>이다. 왜냐면 interface가 Optional<T> findById(ID var1); 이렇게 생겼기 때문이다. 이 interface는 Optional<Something!>를 뱉는다. 그러면 어떤 문제가 벌어질까? entity.get()으로 그 안에 들어있는 데이터를 가져올 수 있다. /** * If a value is present, returns the value, otherwise throws * {@code NoSuchElementException}....