본문 바로가기

프로그래밍 언어 노트/JAVA | Kotlin

(7)
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..
[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..
JVM GC와 Reference 자바공부할때 다른 내용이야 어디서나 나오지만 JVM / GC / Weak Reference Soft Reference ... 같은 내용은 공부하기도 공부해야하는 지도 잘 모르기때문에 나중을 위해서라도 검색하기 쉽게 간단한 키워드라도 남겨두기 위해 블로깅 갓갓 Naver D2 를 많이 참고 JVM JVM 은 Class Loader / Execution Engine / GC / Runtime Data Area 로 나뉜다. Class Loader : 클래스 파일을 데이터 에어리아에 적재 Execution Engine : 메모리에 적재된 클래스를 기계어로 번역해 명령어단위로 실행 Garbage Collector : 뭐 다들 아시는 그거, Heap 에서 참조되지 않는 객체를 탐색, 제거, GC 하면 다른 쓰레드가..