{"id":15583345,"url":"https://github.com/kjpar0317/electron-javalin","last_synced_at":"2026-04-05T22:01:43.869Z","repository":{"id":185183255,"uuid":"612229635","full_name":"kjpar0317/electron-javalin","owner":"kjpar0317","description":"electron + solidjs - javalin + kotlin","archived":false,"fork":false,"pushed_at":"2023-10-14T10:44:24.000Z","size":369,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T08:28:06.294Z","etag":null,"topics":["daisyui","electron-app","java11","javalin","kotlin","solidjs","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kjpar0317.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-10T13:32:28.000Z","updated_at":"2023-03-15T14:23:43.000Z","dependencies_parsed_at":"2025-02-03T22:39:52.581Z","dependency_job_id":"1c2bc807-d504-41f1-b2ca-d2efaffa7412","html_url":"https://github.com/kjpar0317/electron-javalin","commit_stats":null,"previous_names":["kjpar0317/electron-javalin"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kjpar0317/electron-javalin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjpar0317%2Felectron-javalin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjpar0317%2Felectron-javalin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjpar0317%2Felectron-javalin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjpar0317%2Felectron-javalin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kjpar0317","download_url":"https://codeload.github.com/kjpar0317/electron-javalin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjpar0317%2Felectron-javalin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31451446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"ssl_error","status_checked_at":"2026-04-05T21:22:51.943Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["daisyui","electron-app","java11","javalin","kotlin","solidjs","tailwindcss","typescript"],"created_at":"2024-10-02T20:07:11.273Z","updated_at":"2026-04-05T22:01:42.621Z","avatar_url":"https://github.com/kjpar0317.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# electron-javalin\nelectron + solidjs - javalin + kotlin\n\nSTUDY용\n\nScope Functions\n객체를 사용할 때 Scope(범위, 영역) 를 일시적으로 만들어서 속성(property)나 함수를 처리하는 용도로 사용되는 함수이다. 간편한 코드 사용과 가독성, 빌더 패턴의 이용, 부가적인 후처리 등을 하는 데에 도움을 준다.\n\nlet\nwith\nrun\napply\nalso\n\n1. let\n```\nfun \u003cT, R\u003e T.let(block: (T) -\u003e R): R\n```\n\nlet 함수는 매개변수화된 타입 T의 확장 함수이다.(extension) 자기 자신을 받아서 R을 반환하는((T) -\u003e R) 람다 식을 입력으로 받고, 블럭 함수의 반환값 R을 반환한다. 여기서는 Person 클래스의 확장 함수로 사용되어 person.let 의 형태가 가능해진다.\n\nlet 함수를 사용하면 객체의 상태를 변경할 수 있다.\n```\nval person = Person(\"\", 0)\nval resultIt = person.let {\n    it.name = \"James\"\n    it.age = 56\n    it // (T)-\u003eR 부분에서의 R에 해당하는 반환값.\n}\n\nval resultStr = person.let {\n    it.name = \"Steve\"\n    it.age = 59\n    \"{$name is $age}\" // (T)-\u003eR 부분에서의 R에 해당하는 반환값.\n}\n\nval resultUnit = person.let {\n    it.name = \"Joe\"\n    it.age = 63\n    // (T)-\u003eR 부분에서의 R에 해당하는 반환값 없음\n}\n\nprintln(\"$resultIt\")\nprintln(\"$resultStr\")\nprintln(\"$resultUnit\")\n\n\n// Person(name=James, age=56)\n// Steve is 59\n// kotlin.Unit\n```\n블럭의 마지막 return 값에 따라 let의 return 값 형태도 달라지는 모습을 보인다.\n\n\n또한 T?.let { } 형태에서의 let 블럭 안에는 non-null 만 들어올 수 있어 non-null 체크 시에 유용하게 쓸 수 있다. 객체를 선언하는 상황일 경우에는 elvis operator(?:) 를 사용해서 기본값을 지정해줄 수도 있다.\n```\nval nameStr = person?.let { it.name } ?: \"Defalut name\"\n```\n\n2. with\n```\nfun \u003cT, R\u003e with(receiver: T, block: T.() -\u003e R): R\n```\nwith는 일반 함수이기 때문에 객체 receive를 직접 입력받고, 객체를 사용하기 위한 두 번째 파라미터 블럭을 받는다. T.()를 람다 리시버라고 하는데, 입력을 받으면 함수 내에서 this를 사용하지 않고도 입력받은 객체(receiver)의 속성을 변경할 수 있다.\n\n즉, 아래 예제에서 with(T) 타입으로 Person을 받으면 {} 내의 블럭 안에서 곧바로 name 이나 age 프로퍼티에 접근할 수 있다. with는 non-null의 객체를 사용하고 블럭의 return 값이 필요하지 않을 때 사용한다. 그래서 주로 객체의 함수를 여러 개 호출할 때 그룹화하는 용도로 활용된다.\n```\nval person = Person(\"James\", 56)\nwith(person) {\n    println(name)\n    println(age)\n    //자기자신을 반환해야 하는 경우 it이 아닌 this를 사용한다\n}\n\n// James\n// 56\n```\n\n3. run\nrun은 두 가지 형태로 선언되어 있다. 먼저 첫 번째는 이렇게 생겼다.\n```\nfun \u003cT, R\u003e T.run(block: T.() -\u003e R): R\n```\nrun은 with처럼 인자로 람다 리시버를 받고, 반환 형태도 비슷하게 생겼지만 T의 확장함수라는 점에서 차이가 있다. 확장함수이기 때문에 safe call(.?)을 붙여 non-null 일 때에만 실행할 수 있다. 어떤 값을 계산할 필요가 있거나 여러 개의 지역변수 범위를 제한할 때 사용한다.\n```\nval person = Person(\"James\", 56)\nval ageNextYear = person.run {\n    ++age\n}\n\nprintln(\"$ageNextYear\")\n\n// 57\n```\n\n\n두 번째 run 선언은 다른 형태를 띤다.\n\n```\nfun \u003cR\u003e run(block: () -\u003e R): R\n```\n이 run은 확장 함수가 아니고, 블럭에 입력값도 없다. 따라서 객체를 전달받아서 속성을 변경하는 형식에 사용되는 함수가 아니다. 이 함수는 어떤 객체를 생성하기 위한 명령문을 블럭 안에 묶음으로써 가독성을 높이는 역할을 한다.\n```\nval person = run {\n    val name = \"James\"\n    val age = 56\n    Person(name, age)\n}\n```\n\n\n4. apply\n```\nfun \u003cT\u003e T.apply(block: T.() -\u003e Unit): T\n```\n\napply는 T의 확장 함수이고, 블럭 함수의 입력을 람다 리시버로 받았기 때문에 블럭 안에서 객체의 프로퍼티를 호출할 때 it이나 this를 사용할 필요가 없다. run과 유사하지만 블럭에서 return 값을 받지 않으며 자기 자신인 T를 반환한다는 점이 다르다.\n\n```\nval person = Person(\"\", 0)\nval result = person.apply {\n    name = \"James\"\n    age = 56\n}\n\nprintln(\"$person\")\n\n//Person(name=James, age=56)\n```\n\n앞에서 살펴 본 let, with, run 은 모두 맨 마지막 반한되는 값은 R이었다. 하지만 apply와 아래에서 살펴볼 also는 T를 반환한다.\n\n예시로, let에서는 resultUnit의 블럭 내에서 반환되는 값이 없어 최종적으로 Unit 타입이 되었지만, apply에서는 마지막에는 객체 자기 자신(T)을 반환하기 때문에 result는 Person 타입이 되었다. 그래서 println을 실행했을 때에 person의 내용이 콘솔에 찍히는 것을 확인할 수 있다.\n\n객체의 함수를 사용하지 않고 자기 자신을 다시 반환할 때에 사용되기 때문에, 객체의 초기화나 변경 시에 주로 사용된다.\n\n\n\n5. also\n```\nfun \u003cT\u003e T.also(block: (T) -\u003e Unit): T\n```\n\nalso는 T의 확장함수이고, 블럭 함수의 입력으로 람다 리시버를 받지 않고 this로 받았다. apply와 마찬가지로 T를 반환한다.\n```\nval person = Person(\"\", 0)\nval result = person.also {\n    it.name = \"James\"\n    it.age = 56\n}\n\nprintln(\"$person\")\n\n//Person(name=James, age=56)\n```\n\n블럭 함수의 입력으로 T를 받았기 때문에 it을 사용해 프로퍼티에 접근하는 것을 볼 수 있다. 그래서 객체의 속성을 전혀 사용하지 않거나 변경하지 않고 사용하는 경우에 also를 사용한다.\n\n객체의 데이터 유효성을 확인하거나, 디버그, 로깅 등의 부가적인 목적으로 사용할 때에 적합하다.\n```\nval numbers = arrayListOf(\"one\", \"two\", \"three\")\nnumbers\n    .also { println(\"add 하기 전에 print: $it\") }\n    .add(\"four\")\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkjpar0317%2Felectron-javalin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkjpar0317%2Felectron-javalin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkjpar0317%2Felectron-javalin/lists"}