This tutorial is about Spring Boot.
The tutorial includes an introduction to Spring Boot, key features of Spring Boot, prototyping using CLI, managing profiles aka environment in Grails, using GORM and using GSP. The tutorial begins with a section which is an introduction to Spring Boot. It includes an introduction to Spring Boot, the benefits of using Spring Boot.
Following is a features section which includes the key features of Spring Boot like embedded servers, security, metrics etc. Next is a section about prototyping. It includes prototyping using CLI, getting started, the things that happen during prototyping, starter POMs and a demo, building Gradle, using plugin and adding dependencies, and hot reloading.
Consecutively there is a section about managing profiles. It includes managing profiles aka managing environment in Grails like binding properties and its examples, using spring data to add dependency. Moreover, there's also a section which includes using GORM for next level persistence and also includes server side view template libraries like JSP, velocity, tiles, GSP etc.
The last section of this tutorial is about GSP. It includes using GSP with Spring Boot as it has limited tags, adds dependency and helps in packaging executable JAR and WAR files.
This tutorial is about Spring Boot.
The tutorial includes an introduction to Spring Boot, key features of Spring Boot, prototyping using CLI, managing profiles aka environment in Grails, using GORM and using GSP. The tutorial begins with a section which is an introduction to Spring Boot. It includes an introduction to Spring Boot, the benefits of using Spring Boot.
Following is a features section which includes the key features of Spring Boot like embedded servers, security, metrics etc. Next is a section about prototyping. It includes prototyping using CLI, getting started, the things that happen during prototyping, starter POMs and a demo, building Gradle, using plugin and adding dependencies, and hot reloading.
Consecutively there is a section about managing profiles. It includes managing profiles aka managing environment in Grails like binding properties and its examples, using spring data to add dependency. Moreover, there's also a section which includes using GORM for next level persistence and also includes server side view template libraries like JSP, velocity, tiles, GSP etc.
The last section of this tutorial is about GSP. It includes using GSP with Spring Boot as it has limited tags, adds dependency and helps in packaging executable JAR and WAR files.
마이크로서비스 스타일로 만들어진 시스템을 모노리틱 스타일로 이관한 사례와 함께 스프링을 이용해 모듈형 모노리스(modular monoliths)를 만든 경험을 바탕으로 모노리틱/마이크로서비스 보다 본질적인 문제를 제기하고, 문제 해결을 위한 아이디어와 코드를 공유합니다.
https://github.com/arawn/building-modular-monoliths-using-spring
이 자료는 2019년 KSUG 세미나에서 진행한 "잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다"를 기반으로 몇가지 내용을 추가하고, 전개 방식을 다듬어 조금 더 친절하게 만들어졌습니다.
마이크로서비스 스타일로 만들어진 시스템을 모노리틱 스타일로 이관한 사례와 함께 스프링을 이용해 모듈형 모노리스(modular monoliths)를 만든 경험을 바탕으로 모노리틱/마이크로서비스 보다 본질적인 문제를 제기하고, 문제 해결을 위한 아이디어와 코드를 공유합니다.
https://github.com/arawn/building-modular-monoliths-using-spring
이 자료는 2019년 KSUG 세미나에서 진행한 "잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다"를 기반으로 몇가지 내용을 추가하고, 전개 방식을 다듬어 조금 더 친절하게 만들어졌습니다.
본 장표는 인프콘 2022 / 코틀린 멀티플랫폼, 미지와의 조우 세션에 대한 강연 자료입니다.
코틀린은 멀티플랫폼을 지원하는 언어로 Server-side와 Android뿐만이 아니라 JavaScript 엔진이 있는 브라우저나 Node.js도 지원하며, Native 등 다양한 플랫폼에서 쓸 수 있습니다. 이를 이용해 코틀린 코드를 공유하는 단일 코드베이스로 모바일부터 웹과 데스크톱, 서버에 이르기까지 다중 플랫폼 애플리케이션을 작성할 수 있습니다.
본 핸즈온 세션을 통해 코틀린 멀티플랫폼과 함께 리액트, 스프링부트로 웹 애플리케이션의 프론트엔드부터 백엔드까지 직접 개발하며 친해져 보는 시간을 가져보세요. 참가자는 코틀린 멀티플랫폼 프로젝트를 이해하고, 더 나아가 프론트엔드와 백엔드 간의 공유 로직 작성, Kotlin/JS 기반 리액트 및 스프링 웹 프로그래밍을 경험할 수 있습니다.
https://github.com/arawn/building-fullstack-webapp-with-kotlin-multiplatform
https://infcon.day/speaker/박용권-김지헌-코틀린-멀티플랫폼/
멀티 모듈을 이용한 안드로이드 프로젝트 개발이 늘어나고 있습니다.
하지만 모듈을 만들 때 마다 build.gradle의 중복 코드가 생기고 있다는 사실을 아시나요?
이러한 문제를 해결하기 위해 빌드 로직을 효율적으로 관리하는 Gradle Kotlin 컨벤션 플러그인을 소개합니다.
*페이지 마지막에 코드 링크 첨부되어 있습니다.
GitHub: https://github.com/gsk120/UnityAutoBuild_iOS
유니티 빌드 자동화에 대한 설명을 다룬 ppt 입니다.
빌드 자동화에대해 고민이 많으신 분들을 위해 조금이나마 도움이 되고자 이렇게 자료를 공유합니다.
루비 Rakefile을 이용하여 Unity build -> Xcode 수정 -> Xcode build -> ipa 추출까지 한번에 진행하는 과정을 설명하였습니다.
Xcode 빌드가 안드로이드에 비해 상당히 느리기 때문에 수동으로 빌드하는 경우 신경써야 하는 일이 상당히 많습니다. 이 시간을 절약하여 개발에 좀더 투자할 수 있다면 개발자는 더욱 높은 퀄리티의 프로그램을 구현할 수 있을 것입니다. 하지만 빌드 자동화에 대한 정보가 많이 부족하고, 매뉴얼 형식의 자료가 별로 없어 구축하는데 꾀나 많은 조사와 분석이 필요합니다.
수동으로 빌드하며 고생하시는 분이나, 자동화 구축을 위해 고생하시는 분들께 같은 고민을 한 입장으로써, 부족하지만 도움이 되고자 이렇게 빌드 자동화 ppt를 공유합니다.
Lablupconf session8 "Paving the road to AI-powered world"Lablup Inc.
Lablup Conf 1st (Session4/Core)
"Paving the road to AI-powered world" - 김준기
- 발표내용
* Recap of Backend.AI history
* Future roadmap of Backend.AI for next 2 years
- 영상보러가기 : https://youtu.be/kAGSl99U0Bo
디자인에 이어 코딩까지 AI가 프로그램 개발을 척척?: GitHub Copilot, 어디까지 알아보셨나요Ian Choi
* 본 세션은 2022년 11월 15일, Microsoft Ignite Spotlight on Korea 오프라인 행사에서 진행된 세션의 녹화본 발표 자료입니다.
- 제목: "디자인에 이어 코딩까지 AI가 프로그램 개발을 척척?: GitHub Copilot, 어디까지 알아보셨나요"
- 스피커: 최영락 (한국마이크로소프트, Territory Channel Mgr.) & 변정훈 (GitHub Star(aka., Outsider)
- 설명: AI가 많은 부분을 바꾸고 있는 세상에서 GitHub은 2021년 AI 페어 프로그래머인 GitHub Copilot을 발표하고 올해 유료 모델로 공개했습니다. GitHub Copilot과 함께 코딩할 때 어떤 부분을 도와주고 얼마나 유용한 지 설명합니다.
- 영상 보기: https://info.microsoft.com/KO-DevOps-VDEO-FY23-01Jan-10-From-design-to-coding-AI-drives-program-development-GitHub-Copilot-how-far-have-you-found-out-SRGCM8854_LP01-Registration---Form-in-Body.html
- 참고: 지난 Ignite 2022에서서 등장하신 사티야 및 OpenAI CEO 두 분께서 대화한 ChatGPT 및 Codex에 대한 자세한 내용은 https://youtu.be/EDsGm-3OEOY 를 통해서도 보실 수 있습니다.
5. 5
K2 컴파일러의 압도적인 프론트엔드 향상
https://blog.jetbrains.com/ko/kotlin/2023/04/kotlinconf-2023-opening-keynote/
6. 6
프론트엔드와 백엔드가 무엇인가요?
프론트
엔드
파서와 시멘틱 애널라이저로 구성.
소스코드를 읽어 구문 트리를 만들고 의미 정보를
추가함.
백엔드
중간 코드 생성 & 최적화기와 머신 코드 생성 최적
화로 나누어짐.
최적화를 하고 기계어 코드나 타겟 코드를 생성.
코틀린의 경우에는 자바 Bytecode나 LLVM의
Bitcode가 타겟.
코틀린
코틀린의 경우에 (1.3까지) 중간 코드 생성 & 최적
화기가 없었음.
효율보다는 코틀린 언어의 발전이 더 중요했음.
(기술부채)
https://twitter.com/kotlin
7. 7
백엔드에 IR의 도입
IR 백엔드에서 공유하는 중간 수준의 언어
IR
generator
& optimizer
IR을 만들고 최적화 하는 파트.
코틀린 네이티브를 만들며 새롭게 추가. 이
후 JVM(1.5)과 JS(1.6)을 IR을 쓰도록 재
작성.
공통적인 최적화를 할 수 있다. (그전까지
는 백엔드마다 별도로 작성.)
의도하지는 않았지만 새 백엔드의 성능이
향상!
https://twitter.com/kotlin
8. 남은 것은 프론트엔드
레거시 PSI (Program Structure Interface)
PSI
Program Structure Interface
코틀린 코드를 파싱한 결과 트리. IntelliJ에서 먼저 쓰던 구조를 코틀린 컴파일러도 차용.
소스 코드와 거의 대응되는 단순한 형태.
13. PSI + BindingContext가 문제가 있나요?
최적화
프론트엔드 수준에서 PSI에서 최적화를 하는 것이 쉽지 않음.
문맥이 별도의 BIndingContext에 있는 것도 최적화에 좋지 못함.
캐쉬 미스 BindingContext가 거대한 Map이어서 캐쉬 효율에 좋지 못함.
17. 프론트엔드
왜 FIR이 두개가 있나요?
파서 Raw FIR 빌더 Analyze
체커
파스트리 FIR FIR
진단
Lowering
단순화(simplify)라고 설명. 디슈거링(Desugraing)이라고도 표현.
비구조화 (Desctructure)를 연속된 대입으로 변경.
for 등을 while으로 변경. 연산자(+, +=, in, …)등을 명시적인 호출로 변형.
기타 프론트엔드 수준에서의 최적화도 수행.
18. 18
FIR 기반의 프론트엔트의 장점
컴파일러 성능 FIR 기반으로 만든 프론트엔드는 PSI + BindingContext 기반의 프론트엔드 보다 훨신 빠름.
IDE
IDE도 프론트엔드를 공유. 인텔리제이에서 의미를 파악하고 코드 하이라이팅, 분석하는 속도가 빨라짐.
Kotlin IDE 플러그인 재작성중.
19. 19
가장 많이 요청받은 기능
Static Extensions 인스턴스가 아니더라도 확장 함수를 만들 수 있음.
Collection Literals listOf, mapOf, setOf 가 아닌 리터럴로 컬렉션.
Name-based Destructuring 비구조화(구조분해)를 위치 기반이 아니라 이름 기반으로.
Explicit Fields 같은 컨셉의 private, public 프로퍼티를 만들지 않아도 됨.
Context Receivers 멤버 확장 함수 이외에 Context를 지정할 방법의 추가.
20. 20
정적 확장 (Static Extensions)
https://youtrack.jetbrains.com/issue/KT-11968
File.open("data.txt")
21. 21
정적 확장 (Static Extensions)
https://youtrack.jetbrains.com/issue/KT-11968
File.open("data.txt")
fun File.Companion.open(name: String)
22. 22
정적 확장 (Static Extensions)
https://youtrack.jetbrains.com/issue/KT-11968
File.open("data.txt")
fun File.Companion.open(name: String)
23. 23
정적 확장 (Static Extensions)
https://youtrack.jetbrains.com/issue/KT-11968
File.open("data.txt")
fun File.Static.open(name: String)
29. 29
이름 기반 비구조화 (Name-Based Restructuring)
https://youtrack.jetbrains.com/issue/KT-19627
data class Person(
val
fi
rstName: String,
val lastName: String
)
30. 30
이름 기반 비구조화 (Name-Based Restructuring)
https://youtrack.jetbrains.com/issue/KT-19627
data class Person(
val
fi
rstName: String,
val lastName: String
)
val (
fi
rstName, lastName) = person
31. 31
이름 기반 비구조화 (Name-Based Restructuring)
https://youtrack.jetbrains.com/issue/KT-19627
data class Person(
val
fi
rstName: String,
val lastName: String
)
val (lastName,
fi
rstName) = person
32. 32
컨택스트 수신자 (Context Receivers)
https://youtrack.jetbrains.com/issue/KT-10468
fun process(
context: ServiceContext,
request: ServiceRequest
) {
val data = request.loadData(context)
}
33. 33
컨택스트 수신자 (Context Receivers)
https://youtrack.jetbrains.com/issue/KT-10468
fun process(
context: ServiceContext,
request: ServiceRequest
) {
val data = request.loadData(context)
}
context(ServiceContext)
fun processRequest(request: ServiceRequest)
34. 34
컨택스트 수신자 (Context Receivers)
https://youtrack.jetbrains.com/issue/KT-10468
context(ServiceContext)
fun processRequest(request: ServiceRequest) {
val data = request.loadData()
//
}
35. 35
컨택스트 수신자 (Context Receivers)
https://youtrack.jetbrains.com/issue/KT-10468
context(ServiceContext)
fun processRequest(request: ServiceRequest) {
val data = request.loadData()
//
}
context(ServiceContext)
fun ServiceRequest.loadData(): Data
36. 36
명시적 필드 (Explicit Fields)
https://youtrack.jetbrains.com/issue/KT-14663
private val _applicationState =
MutableStateFlow(State())
val applicationState: StateFlow<State>
get() = _applicationState
37. 37
명시적 필드 (Explicit Fields)
https://youtrack.jetbrains.com/issue/KT-14663
private val _applicationState =
MutableStateFlow(State())
val applicationState: StateFlow<State>
get() = _applicationState
val applicationState: StateFlow<State>
fi
eld = MutableStateFlow(State())
61. 61
버전 처리는 어떻게 했을까요?
expect와 actual
shared/src/
commonMain
iOS와 Android에서 모두 사용할 인터페이스를 expect 키워드로 만듬.
62. 62
버전 처리는 어떻게 했을까요?
expect와 actual
shared/src/
androidMain
Android의 구현을 actual 키워드를 붙여 구현
63. 63
버전 처리는 어떻게 했을까요?
expect와 actual
shared/src/
iOSMain
iOS의 구현을 actual 키워드를 붙여 구현
64. 64
KMM for iOS에서 만나게 되는 상황들
ObjC
현재 Kotlin은 ObjC만 지원해서 제너릭 클래스만 지원하고 인터페이스를 지원하지 못함. Abstract
class를 대신 사용해야 함.
@HinddenFromObjC, @ObjcName 키워드를 적극적으로 활용하자.
@ObjcName(swiftName=“_”) _는 특수한 키워드.
plane.fuel(volume: .Gallos(gallos: 12.5)) 대신 plane.fuel(.Gallons(12.5))
장기적으로는 코트린이 Swift를 바로 타게팅할 것임. Swift를 ObjeC를 제외하고 바인드할 수 없었기에 발
생한 문제.
SourceKitten와 같은 도구들로 중간 코드를 생성하자.
라인 데메에카이 겪은 어려움
Suspend
suspend는 콜백(completion handler)이 되고 콜백은 Swift에서 async로 호출 가능하지만 취소가 불
가능함. Flow도 잘 지원되지 않음.
KMP-NativeCoroutines 라이브러리를 활용해야 함.
https://github.com/rickclephas/KMP-NativeCoroutines
코틀린 예외가 스위프트 핸들러 전달 되지 않을 수 있어 @Throws 키워드로 Error를 지정해야 함.
65. 65
KMM for iOS에서 만나게 되는 상황들
CocoaPods
아직 공식적으로 SPM(Swift Package Manager)를 지원하지 않음. Gradle API 수준에서 정리된 이후
에 지원한다고 함. (언제?)
CocoaPods는 의존성을 소스로 가져와 같이 빌드에 사용하기에 매우 비효율적.
TouchLab의 라이브러리 KMMBridge를 사용합시다.
https://github.com/touchlab/KMMBridge
SPM을 대응하기 위해서는 Git 리포지토리와 스태틱 파일 저장소가 필요하다. (AWS?)
Frozen
Global Object는 기본으로 frozen. 접근할 수 있지만 변경할 수 없음.
@ThreadLocal을 붙이면 freeze 호출 안함. Atomic한 자료구조의 사용이 필요할 수 있다.
freeze() 확장 함수를 이용해 데이터를 얼릴 수 있고 풀 수는 없음.
Global 프로퍼티는 메인스레드에서만 볼 수 있음.
66. 66
KMM for iOS에서 만나게 되는 상황들
Memory
Management
스택 트레이스 디버깅 어렵고, 메모리 매니지먼트가 아직 안정적이지는 않음.
https://youtrack.jetbrains.com/issue/KT-55512
참고
Kotlin Multiplatform Mobile을 활용한 데마에칸 드라이버앱 개발 이야기
Kotlin/Multiplatform for iOS developers : state & future by Salomon Brys
68. 68
Compose Multiplatform mobile application
템플릿을 이용해서 시작해야
템플릿 https://github.com/JetBrains/compose-multiplatform-ios-android-template
69. 69
Compose for iOS를 위해 필요한 것
Android
Studio
Android 앱과 iOS 앱를 실행할 수 있는 개발 환경.
Xcode
Xcode는 백그라운드에서 수행 됨.
Kotlin/Native가 의존하는 버전을 설치해야 함.
Kotlin
Multiplatform
Mobile
안드로이드 스튜디오에서 Kotlin Multiplatform Mobile 플러그인 설치.
CocoaPods Compose for iOS도 SPM(SwiftPackageManager)를 지원하지 않음.
78. 78
Compose for Desktop의 특징
Cross-
Platform
멀티플랫폼이 아닌 크로스플랫폼으로 분류.
JVM이 타겟이고 JVM 덕에 여러 플랫폼에서 도는 것을 크로스플랫폼으로 설명.
SKIKO
SKIA의 코틀린 바인딩 SKIKO에 의해 렌더링. https://github.com/JetBrains/skiko
SKIA의 폰트 렌더링이 운영체제 마다 달라 스크린 샷 테스트를 하지 말자.
Compose
Multiplatform
IDE support
인텔리제이 아이디어나 안드로이드 스튜디오에 설치.
https://plugins.jetbrains.com/plugin/16541-compose-multiplatform-ide-support
IntelliJ IDEA 인텔리제이 아이디어 2020.3 이상에서 사용가능.
79. 79
Compose for Desktop의 특징
참고영상 You can do desktop too! By Victor Kropp
https://www.youtube.com/watch?v=Mgf_9kxM1BA
JDK 15 JDK11으로 프로젝트 생성 가능. 네이티브 배포 패키징을 위해서는 15 이상.
84. 84
Compose for Web의 특징
WebAssembly
JavaScript를 쓰지 않고 WebAssembly로 실행.
Kotlin/WASM이 타겟.
Compose
HTML
HTML을 생성하는 Kotlin/JS의 라이브러리도 있음.
Compose for Web과 무관.
Compose
Multiplatform
IDE support
인텔리제이 아이디어나 안드로이드 스튜디오에 설치.
https://plugins.jetbrains.com/plugin/16541-compose-multiplatform-ide-support
IntelliJ IDEA 인텔리제이 아이디어 2020.3 이상에서 사용가능.