포스트

2021-08-19-TIL

2021-08-19-TIL

Kotlin

How to iterates over hashmap in Kotlin

  • https://stackoverflow.com/questions/47204146/how-to-iterate-over-hashmap-in-kotlin

Kotlin에서는 구조 분해(destructuring)로 키와 값을 바로 꺼내며 순회한다(Kotlin 문서).

1
2
3
4
5
6
7
val prices = mapOf("kimchi" to 3000, "soup" to 5000)

for ((name, price) in prices) {
    println("$name: $price")
}

prices.forEach { (name, price) -> println("$name: $price") }

키나 값만 필요하면 keys, values 프로퍼티를 쓴다. 자바의 entrySet()을 돌며 getKey(), getValue()를 부르던 코드가 한 줄로 줄어든다.


Convert map to array in Kotlin

  • https://www.techiedelight.com/convert-map-array-kotlin/

Map을 배열로 바로 바꾸는 함수는 없고, keys, values, entries 같은 컬렉션을 거친다. Collection<T>.toTypedArray()는 컬렉션 크기만큼 Array<T>를 만들어 원소를 채운다(Kotlin API).

1
2
val names: Array<String> = prices.keys.toTypedArray()
val pairs: Array<Pair<String, Int>> = prices.toList().toTypedArray()

toTypedArray는 reified 타입 파라미터를 써서 런타임에 정확한 배열 타입을 만든다. 그래서 자바의 String[]을 받는 메서드에 그대로 넘길 수 있다.


CONTENT-DISPOSITION

axios로 파일 다운로드

  • https://soobakba.tistory.com/30

Content-Disposition 응답 헤더는 본문을 브라우저 안에서 보여 줄지(inline), 파일로 내려받게 할지(attachment)를 알려 준다. attachment에는 저장할 파일 이름을 함께 줄 수 있다(MDN).

1
Content-Disposition: attachment; filename="report.csv"; filename*=UTF-8''%EB%B3%B4%EA%B3%A0%EC%84%9C.csv

filename은 ASCII 이름에 쓰고, 한글처럼 ASCII가 아닌 이름은 filename*에 퍼센트 인코딩으로 넣는다. 둘 다 있으면 filename*가 우선이고, 호환성을 위해 둘 다 넣는 것이 권장된다.

axios로 파일을 받을 때는 responseType: 'blob'을 지정해야 본문이 문자열로 깨지지 않는다(axios 요청 설정). 받은 Blob으로 객체 URL을 만들고 임시 <a download> 링크를 눌러 저장한다.


CORS in configuration Spring Boot

  • https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

파일 다운로드와 CORS가 같이 나오는 이유가 있다. 교차 출처 응답에서 브라우저가 스크립트에 보여 주는 헤더는 Cache-Control, Content-Language, Content-Length, Content-Type, Expires, Last-Modified, Pragma 같은 CORS 허용 목록(safelisted) 헤더뿐이다. Content-Disposition은 여기에 없어서, 서버가 Access-Control-Expose-Headers로 노출하지 않으면 axios에서 파일 이름을 읽을 수 없다(MDN).

Spring에서는 전역 CORS 설정에 exposedHeaders를 추가한다(Spring 문서).

1
2
3
4
5
6
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")
            .allowedOrigins("http://localhost:3000")
            .exposedHeaders("Content-Disposition");
}
참고한 자료외부 출처 5

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다