HOHYEON.DEV — 개발 노트
막혔던 문제를,
원인부터 해결까지 남깁니다.
직접 겪은 에러와 삽질을 한 편씩 정리하는 블로그입니다. 전체 노트와 바로 실행해 보는 강좌, 막힐 때 묻는 도와줘요는 dev.meokko.com에서 볼 수 있습니다.
주문 내역을 불러오는 평범한 코드였습니다. 그런데 배포하던 몇십 초 사이에 문의가 몰렸습니다. "와이파이 멀쩡한데 왜 네트워크를 확인하라고 하나요?"try { const res = await fetch('/api/orders'); const data = await res.json(); renderOrders(data.items);} catch (e) { showToast('네트워크 연결을 확인해 주세요.');}에러 수집 도구를 열어 보니 네트워크 오류는 단 한 건도 없었습니다. 대신 이 에러가 잔뜩 쌓여 있었습니다.에러 로그SyntaxError: Unexpected token '이 에러를 검색해서 들어오셨다면, 결론부터 말하면 JSON 대신 HTML을 받은 것입니다.3줄 요약fetch는 서버가 5..
CSV 파일 확장자만 떼서 Parquet로 바꾸는, 다섯 줄도 안 되는 배치 코드였습니다. 몇 주 동안 아무 문제 없이 잘 돌았습니다. 그러다 분석 쪽에서 연락이 왔습니다. orders 테이블이 없다고요.폴더를 열어 보니 order.parquet, sale.parquet, metri.parquet가 있었습니다. 범인은 이 한 줄이었습니다.name = os.path.basename(path).rstrip(".csv")잠깐, 퀴즈 하나만 풀고 가세요print("sales.csv".rstrip(".csv"))print("vcs.csv".rstrip(".csv"))대부분 sales, vcs라고 답합니다. 실제로는 sale과 빈 문자열('')이 나옵니다.3줄 요약rstrip의 인자는 떼어낼 문자열이 아니라 지울 ..
고차 함수는 함수를 매개 변수로 사용하거나 함수를 반환하는 함수입니다. fun main(args: Array) { // 람다 함수를 이용하여 함수 전달 result("고차함수 ", { x, y -> x + y }) } // sum: (Int, Int) -> Int // 함수명 : (매개변수 타입) -> 리턴 타입 fun result(str: String, sum: (Int, Int) -> Int) { println(str + sum(10, 20)) // print 고차함수 30 } 위 코드를 이해하기 위해서는 아래 코틀린 문법이 필수입니다. 2019/05/19 - [Kotlin] - 코틀린 기초 문법) 1. 코틀린 변수 정의하기 2019/05/19 - [Kotlin] - 코틀린 기초 문법) 2. 코틀린 ..
람다 식과 익명 함수는 '함수 리터럴'입니다. 즉, 선언되지 않고 즉시 식으로 전달되는 함수입니다. fun sum(x: Int, y: Int) = println(x + y) // 일반 함수 val lambda = { x: Int, y: Int -> println(x + y) } //람다 함수 fun main(args: Array) { sum(10, 20)// print 30 lambda(10, 20)// print 30 } 람다 표현식은 항상 중괄호로 둘러쌉니다. 전체 구문 형식의 매개 변수 선언은 중괄호 안에 들어가고 선택적 유형 주석을 가집니다. 본문은 -> 부호 뒤에 옵니다. 유추된 람다 반환 형식이 아닌 Unit경우 람다 본문의 마지막 식 (또는 단일 식)이 반환 값으로 처리됩니다. 쉽게 말해 람..
https://openjdk.java.net/ OpenJDK What is this? The place to collaborate on an open-source implementation of the Java Platform, Standard Edition, and related projects. (Learn more.) Download and install the open-source JDK for most popular Linux distributions. Oracle's OpenJDK JDK 12 binar openjdk.java.net 1. 위 사이트로가서 원하는 jdk 를 다운 받습니다. (당연히 맥용) 2. 압축 풀고 나온 폴더를 드래그로 "/Library/Java/JavaVirtualMac..
우리가 필요로 할 때마다 수작업으로 구현할 수 있지만 일반적으로 한 번만 구현하고 라이브러리에 넣는 것이 좋을 것입니다. 예 : 게으른 속성 : 첫 번째 액세스시에만 값이 계산됩니다. 관찰 가능한 속성 : 리스너는이 속성에 대한 변경 사항에 대한 알림을받습니다. 각 속성에 대한 별도의 필드 대신지도에 속성을 저장합니다. 이러한 (및 기타) 사례를 다루기 위해 Kotlin은 위임 된 속성을 지원 합니다 . import kotlin.reflect.KProperty fun main(args: Array) { val ex = Example() ex.p = "홍길동" // setValue 호출 println(ex.p) // getValue 호출 } class Example { var p: String by Del..
코틀린에서 위임(Delegation) 패턴은 상속에 좋은 대안용으로 사용합니다. 기본적으로 클래스는 final이며, 상속될 클래스는 open 키워드가 필요합니다. 상속할 수 없는 클래스에 기능을 추가하거나 변경이 필요할 경우 fun main(args: Array) { val b = BaseImpl(10) val d = Derived(b) d.printMessage() d.printMessageLine() } interface Base { fun printMessage() fun printMessageLine() } class BaseImpl(val x: Int) : Base { override fun printMessage() { print(x) } override fun printMessageLine(..
비즈니스 로직이 어떤 유형의 래퍼를 작성해야하는 경우가 있습니다. 그러나 추가 힙 할당으로 인해 런타임 오버 헤드가 발생합니다. 또한 래퍼 된 유형이 프리미티브 인 경우 원시 형식은 일반적으로 런타임에서 크게 최적화되므로 래퍼는 특별한 처리를하지 않기 때문에 성능이 저하됩니다. 이러한 문제를 해결하기 위해 Kotlin은 클래스라는 이름 앞에 한정자를 inline class배치하여 선언되는 특별한 클래스의 클래스를 소개합니다 inline. 인라인 클래스 특징 생성자에 초기화 된 단일 속성이 있어야합니다. 클래스는 실제 인스턴스화가 발생하지 않습니다. init 블록을 가질 수 없습니다. 인라인 클래스 속성에는 배경 필드가 있을 수 없습니다. (계산 가능한 속성만 가질수 있음) 인라인 클래스는 다른 클래스를 ..
때로는 새로운 클래스를 명시 적으로 선언하지 않고 클래스를 약간 수정 한 객체를 만들어야 합니다.Java는 익명의 내부 클래스 로이 경우를 처리합니다. Kotlin은 객체 표현과객체 선언 으로이 개념을 약간 일반화합니다. fun main(args: Array) { foo() } fun foo() { val adHoc = object { var x: Int = 10 var y: Int = 20 } print(adHoc.x + adHoc.y) } 익명 객체는 로컬 및 개인 선언에서만 유형으로 사용할 수 있습니다. 익명 객체를 공용 함수의 반환 유형 또는 공용 속성의 유형으로 사용하는 경우 해당 함수 또는 속성의 실제 유형은 익명 객체의 선언된 상위 유형이거나 Any상위 유형을 선언하지 않은 경우입니다. 익명..
enum Class 를 사용하는 이유 코드가 단순해지며, 가독성 UP 인스 턴스 생성과 상속을 방지, 상수값의 타입 안정성 보장 enum class Direction { NORTH, SOUTH, WEST, EAST } fun main(args: Array) { getDirection(Direction.NORTH) getDirection(Direction.SOUTH) getDirection(Direction.WEST) getDirection(Direction.EAST) } fun getDirection(d : Direction){ when(d){ Direction.NORTH -> println("북쪽") Direction.SOUTH -> println("남쪽") Direction.WEST -> printl..
웹과 앱을 만들며 막혔던 순간을 기록합니다. 전체 노트와 강좌는 dev.meokko.com에서 이어집니다.
