본문 바로가기

프로그래밍 언어 노트

(87)
Kotlin ServerResponse 에 대한 DSL 을 구축해보자! [Spring Boot] + Kotlin 에서 Route + Beans DSL 을 사용해보자 (tistory.com) [Spring Boot] + Kotlin 에서 Route + Beans DSL 을 사용해보자 전통적인 Spring 의 방식 (MVC) 는 컨트롤러 + 서비스 + 레포를 어노테이션으로 등록하고, Spring 이 Bean으로 등록해서 슈슈슉 뜨는 방식인데, 나도 Spring 쓸때는 이렇게 작성하긴 하는데 개인적으로 선 see-ro-e.tistory.com 일전에 요 Post 에서 Kotlin Spring Boot 에서 Route Dsl 을 사용하는것을 확인했고 Kotlin SQL DSL 을 구축해보자! 쓸 수 있는 방법을 전부 동원해봐서! (tistory.com) Kotlin SQL DSL ..
[Spring Boot] + Kotlin 에서 Route + Beans DSL 을 사용해보자 전통적인 Spring 의 방식 (MVC) 는 컨트롤러 + 서비스 + 레포를 어노테이션으로 등록하고, Spring 이 Bean으로 등록해서 슈슈슉 뜨는 방식인데, 나도 Spring 쓸때는 이렇게 작성하긴 하는데 개인적으로 선호하는 방식은 아니다. 개인적으로는 route data (혹은 function) 으로 조합가능하게 짜는 방식이 더 우아하다고 생각한다. 다만 Webflux 의 경우 (Java 에서도) Route Function (Functional Endpoints) 방식을 사용할수있는데. MVC 는 딱히 없는걸로 알고있었다. 근데 JAVA 라 DSL 그렇게 이쁘지는 않다. LinkedIn post 를 보다가, JetBrains 에서 발표한 자료에서 Kotlin Beans DSL 이 있는것을 보고 좀 ..
Kotlin SQL DSL 을 구축해보자! 쓸 수 있는 방법을 전부 동원해봐서! 라이브러리를 설계하는 일은 사실 언어를 설계하는 일이다 (벨 연구소 격언) C# 언어에는 LINQ 라는 문법이 존재한다. SQL의 Query 문과 유사한 문법으로 map/reduce/filter 를 수행 할 수 있으며, ORM (엔티티 프레임워크) 에서도 지원되서 진짜 쿼리짜듯이 C# 코드내 작성이 가능하다. 당연히 언어에 내장된 DSL 이기 떄문에, 컴파일체크도 되고, IDE 의 도움도 받을수 있고, 원하는 대로 조작할수도 있다. (함수 조합이 가능하다.) C# 으로 일하다가 Kotlin (JAVA 계열) 로 넘어와서 느끼는 가장 불편한 점중 하나는 이런 SQL 을 위한 DSL 이 없다는점이다. Spring boot 의 JPA 방식인 function name 으로 sql 을 생성하는 기괴한 방식은 말할..
Kotlin 의 Lambda 문법으로 DSL 을 구축해보자 DSL 을 Kotlin / Scala 에서 구현할때 자주 사용하는 기법중 하나는 Last Parameter 의 람다 를 {} FileWriter(outPath).use { fileWriter -> fileWriter.write(fileReader.readText()) } } // DSL 쓸때 fileScope(inPath, outPath) { (fileReader, fileWriter) -> fileWriter.write(fileReader.readText()) } } // DSL 용 헬퍼 Class / 함수 data class Rewriter(val fileReader: FileReader, val fileWriter: FileWriter) fun fileScope(inPath: String, outP..
[F#/Fabulous] fabulous version 2 로 안드로이드 앱 만드는 기나긴 여정 BE 엔지니어가 FE 프로그래밍을 하면서 생긴 [마이너(F#) X 마이너(멀티플랫폼) X 마이너(Fabulous) X 마이너(Version 2)] 의 환장의 콜라보 발단 - 회사의 식대카드중 하나의 사용자 기록을 내가 기록하게됨 - 슬랙에 매번 작성하는데 먹은 사람들 이름 적는게 너무 귀찮음 - 그렇다고 완전 자동화 SW 를 짜기는 너무 어려움 - 그럼 관리를 도와주는 Helper SW 를 짜자! 라는 기적의 논리로 앱을 하나 짤 계획을 세웠다. 최종결과물은 아래와 같은 아주~~~ 간단한 앱이다. 가격, 장소를 입력하고 먹은 사람들은 버튼을 눌러서 추가하고 SEND 를 보내면 슬랙으로 Noti가 오는 그런 시스템.. 너무 간단한 SW 이기 때문에.. 업무에서 사용하고있는 Kotlin 이나 아니면 뭐 MA..
[Jackson] Subtype 별 Polymorphic De/Serialization 을 제공하는 Deduction Jackson 은 JVM 진영에서 주로 사용하는 JSON 역/직렬화 라이브러리로 JSON 은 이제 Web 에서 빼놓을수없는 포맷이므로.. 자주 사용하게 된다. 그러나 JSON 은 근본이 동적언어인 js 의 (사실상) 표준 포맷이므로, 이를 완전한 정적언어인 Java/Kotlin 등에서 사용할떄 충돌(불일치) 이 발생하게된다. JS 는 같은 이름의 필드지만, 안에 내용물은 쓱싹쓱싹 바뀔수있고, 특히 본인의 경우 가장 신경쓰이는것이, 바로 이질 (Heterogeneous) 적인 Array 이다 {"myset":[ {"name":"Tanker","def":100}, "Dealer", 10]} JS 같은 언어는 Array 에 아무타입이나 전부 들어갈 수 있기 때문에, 막 담아서 보내줄수있는데, 이걸 Jackso..
[JVM] Typereference 와 Type Erasure (타입 소거) 기본적으로 JAVA 를 포함한 JVM 기반 언어는 제네릭에있어서 불완전하다 "타입 소거" 가 되기 때문 (어느 번역서에서는 타입 지우개라고 적혀있던데.. 암튼) 이는 하위호환성을 유지하기 위하여 JAVA 가 택한 방법이고... 이로 인하여 JVM 기반언어는 타입 소거에서 자유로울수가 없다. 킹갓 닷넷은 다르다 킹갓 닷넷과는! 간단히 말하자면 타입안정성을 얻기 위하여 제네릭(제네릭에 내가 쓸 타입을 적어두었음)을 썻는데. 런타임에는 이 안정성이 보장되지 않는다는 소리 (내가 써둔 타입 정보가 사라짐)다. 따라서 JVM 상에서는 T든 U 든 써둔건 런타임에 죄다 Object 다. //List 제네릭 타입이 있다고 가정 List genericIntList = new List()//이거나 List generic..
[clojure] clj-oauth2 를 통해서 github Oauth 를 가져와 보자 주요 코드 (ns ossss.routes.oauth (:require [ossss.config :refer [env]] [mount.core :refer [defstate]] [clj-http.client :as http] [clj-oauth2.client :as oauth2] [ring.util.http-response :as response])) ;; env 에 있는값을 쓰기 위해서 defstate 사용 (defstate github-oauth2 :start {:authorization-uri (env :authorize-uri) :access-token-uri (env :access-token-uri ) :redirect-uri "http://localhost:3000/oauth/callback" ..