-
Spring Boot에서 File을 송수신할 때의 disk I/O
dist I/O는 위험하다! 우리 process의 자원만 의도한만큼 잡아먹는다면 아무 문제가 없지만, 만약 한 머신에서 여러 서버가 돌고 있다면? disk I/O는 머신 전체에 영향을 미치기 때문에 신중해야 한다. 사실 그걸 떠나서 그냥 느리기도 하다. 기본적으로, JVM 기반의 언어(Java, Kotlin)에서 사용하는 File 또는 Resource 관련 class들은 in-memory data를 관리하는 게 아니다. 이러한 class들은 input stream을 이용해서 binary를 ‘읽어 오는’ 작업과 그 파일의 메타 데이터를 ‘관리하는’ 역할을 수행한다. 파일을 수신했다! 나는 MultipartFile 외에 다른 방법으로 파일을 받아본 적이...
-
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...
-
Spring Boot 프로젝트에서 Request Dto에 NotNull 사용하기
import javax.validation.Valid @PostMapping("/hi") fun someFunction(@RequestBody @Valid dto: Dto) import javax.validation.constraints.NotNull data class Dto( @field:NotNull var temp1: String? = null, var temp2: String? = null ) 꼭 dto 앞에 @Valid가 붙어 있어야 validation을 해줍니다. @RequestBody @Valid dto: Dto에서 @Vaild가 뒤쪽에 있어야 동작했었는지, 순서가 상관 없었는지는 잘 기억이 나지 않습니다. 테스트하긴 귀찮네요… Response Dto에는 NotNull 어노테이션이 동작하지 않았습니다. 그래도 명시해 주면, 나중에 배포하거나 일할 때 조금 더 편해서 저는 그냥 써줬습니다. 그리고 @NotNull은 java annotation인데, kotlin에서 사용할...
-
Spring Boot 프로젝트에서 MultipartFile을 수신할 때 주의점
잡것들 Content-Type은 multipart/form-data이고, form-data를 보내므로 @RequestBody 같은 어노테이션을 붙이면 안 됩니다. RFC 표준에서는 ‘client는 body를 같이 보내면 안 되고, server에서는 body가 있으면 무시해야 한다’ 정도로 써있었던 것 같은데 정확히는 잘 기억이 안 나네요. 아무튼 @RequestBody 어노테이션은 엄청 깐깐해서 body가 있으면 Content-type: ??? not supported 아마 이렇게 생긴? Exception를 뱉으면서 controller까지 보내지도 않습니다. 또, MultipartFile 외에 primitive type의 fields를 함께 수신하고 싶다면(파일이랑 json을 같이 보내는 등), 파일을 제외한 나머지 필드들의 타입은 무조건 text입니다. text만 받는 것이...