Kotlinκ³Ό Spring Bootλ₯Ό νμ©ν μ€μ νλ‘μ νΈ νμ΅ Repository
μ΄ νλ‘μ νΈλ Kotlin & SpringBoot μ€μ λ§μ€ν° 3λ¨κ³ λ‘λλ§΅μ 첫 λ²μ§Έ λ¨κ³ νλ‘μ νΈμ λλ€. κ°λ¨ν Hello APIμ Todo CRUD κΈ°λ₯μ ꡬννμ¬ Kotlinκ³Ό Spring Bootμ κΈ°λ³ΈκΈ°λ₯Ό μ΅ν μ μμ΅λλ€.
- Language: Kotlin
- Framework: Spring Boot 3.x
- Build Tool: Gradle (Kotlin DSL)
- Database: H2 (In-memory)
- Dependencies:
- Spring Web
- Spring Data JPA
- H2 Database
- Kotlin Coroutines
src/main/kotlin/com/example/hellokotlin/
βββ HelloKotlinApplication.kt # λ©μΈ μ ν리μΌμ΄μ
βββ controller/ # REST 컨νΈλ‘€λ¬
β βββ HelloController.kt # Hello API
β βββ TodoController.kt # Todo CRUD API
βββ entity/ # JPA μν°ν°
β βββ Todo.kt # Todo μν°ν°
βββ repository/ # JPA λ ν¬μ§ν 리
β βββ TodoRepository.kt # Todo λ ν¬μ§ν 리
βββ kotlin_learning/ # Kotlin νμ΅ μμ
βββ 01_basics.kt # κΈ°λ³Έ λ¬Έλ²
βββ 02_oop.kt # κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
βββ 03_functional.kt # ν¨μν νλ‘κ·Έλλ°
βββ 04_advanced.kt # κ³ κΈ κΈ°λ₯
βββ 05_practice_missions.kt # μ€μ΅ λ―Έμ
βββ KOTLIN_LEARNING_GUIDE.md # νμ΅ κ°μ΄λ
βββ notebooks/ # μΈν°λν°λΈ νμ΅μ© λ
ΈνΈλΆ
βββ 01_basics_notebook.ipynb
βββ 02_oop_notebook.ipynb
βββ 03_functional_notebook.ipynb
βββ 04_advanced_notebook.ipynb
βββ 05_practice_missions_notebook.ipynb
- κ°
.ktνμΌμλmain()ν¨μκ° μμ΄ λ 립μ μΌλ‘ μ€ν κ°λ₯ - IntelliJ IDEAμμ νμΌ μ΄κ³ main ν¨μ μΌμͺ½μ βΆ λ²νΌ ν΄λ¦
- SpringBoot Runnerλ‘ μ€ν:
./gradlew bootRun --args="basics" # κΈ°λ³Έ λ¬Έλ² ./gradlew bootRun --args="oop" # κ°μ²΄μ§ν₯ ./gradlew bootRun --args="functional" # ν¨μν ./gradlew bootRun --args="advanced" # κ³ κΈ κΈ°λ₯ ./gradlew bootRun --args="practice" # μ€μ΅
- κ° κ°λ μ λ¨κ³λ³λ‘ μ€ννλ©° νμ΅
- μ¦μ κ²°κ³Ό νμΈ κ°λ₯
- μ½λ μμ ν μ¬μ€ν μ©μ΄
Jupyter μ€μΉ λ° μ€ν:
# Kotlin Kernel μ€μΉ
pip install jupyter
conda install -c jetbrains kotlin-jupyter-kernel
# λ
ΈνΈλΆ μ€ν
jupyter notebook
# λΈλΌμ°μ μμ .ipynb νμΌ μ΄κΈ°-
κΈ°λ³Έ λ¬Έλ² (
01_basics.kt/01_basics_notebook.ipynb)- λ³μ μ μΈ (val, var) - Javaμ finalκ³Ό λΉκ΅
- ν¨μ μ μμ νΈμΆ - Pythonμ κΈ°λ³Έκ° λ§€κ°λ³μ μ§μ
- 쑰건문 (if, when) - Javaμ switchλ³΄λ€ κ°λ ₯
- λ°λ³΅λ¬Έ (for, while) - Pythonμ rangeμ μ μ¬
- Null Safety - NullPointerException λ°©μ§
-
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° (
02_oop.kt/02_oop_notebook.ipynb)- ν΄λμ€μ μμ±μ - Javaλ³΄λ€ κ°κ²°ν λ¬Έλ²
- λ°μ΄ν° ν΄λμ€ - Pythonμ @dataclassμ μ μ¬
- μμκ³Ό λ€νμ± - κΈ°λ³Έμ μΌλ‘ final, open ν€μλλ‘ μμ νμ©
- μΈν°νμ΄μ€ - Java 8+μ²λΌ κΈ°λ³Έ ꡬν κ°λ₯
- Sealed ν΄λμ€ - νμ μμ ν μν νν
- μ±κΈν€ κ°μ²΄ - μΈμ΄ λ 벨 μ±κΈν€ μ§μ
-
ν¨μν νλ‘κ·Έλλ° (
03_functional.kt/03_functional_notebook.ipynb)- λλ€ ννμ - Java 8 λλ€λ³΄λ€ κ°κ²°
- κ³ μ°¨ ν¨μ - ν¨μλ₯Ό λ§€κ°λ³μλ‘, λ°νκ°μΌλ‘
- 컬λ μ μ°μ° (filter, map, reduce) - Java Stream APIμ μ μ¬
- μνμ€μ μ§μ° νκ° - λμ©λ λ°μ΄ν° ν¨μ¨μ μ²λ¦¬
- ν¨μ ν©μ± - μμ ν¨μλ€μ μ‘°ν©
-
κ³ κΈ κΈ°λ₯ (
04_advanced.kt/04_advanced_notebook.ipynb)- νμ₯ ν¨μ - κΈ°μ‘΄ ν΄λμ€μ λ©μλ μΆκ°
- κ° ν΄λμ€ (Inline Classes) - λ°νμ μ€λ²ν€λ μλ λνΌ
- μμ (Delegation) - by ν€μλλ‘ μμ ν¨ν΄ ꡬν
- μ½λ£¨ν΄ - λΉλκΈ° νλ‘κ·Έλλ°
- DSL κ΅¬μΆ - λλ©μΈ νΉν μΈμ΄ λ§λ€κΈ°
-
μ€μ΅ λ―Έμ (
05_practice_missions.kt/05_practice_missions_notebook.ipynb)- Todo μ± κ΅¬ν - κΈ°λ³Έ CRUDμ μν κ΄λ¦¬
- κ³μ°κΈ° ꡬν - Sealed ν΄λμ€λ‘ νμ μμ ν μ°μ°
- κ°κ³λΆ μ± κ΅¬ν - λ°μ΄ν° λΆμκ³Ό 리ν¬νΈ μμ±
μμΈν νμ΅ κ°μ΄λλ KOTLIN_LEARNING_GUIDE.mdλ₯Ό μ°Έκ³ νμΈμ.
git clone https://github.com/gd452/hello-kotlin.git
cd hello-kotlin./gradlew bootRun- URL: http://localhost:8080/h2-console
- JDBC URL:
jdbc:h2:mem:testdb - Username:
sa - Password: (λΉμ΄μμ)
- GET
/hello- κ°λ¨ν μΈμ¬ λ©μμ§ λ°ν
- Response:
"Hello, SpringBoot + Kotlin!"
-
GET
/todos- λͺ¨λ Todo λͺ©λ‘ μ‘°ν (μ΅μ μ μ λ ¬)
-
GET
/todos/{id}- νΉμ Todo μ‘°ν
-
POST
/todos- μλ‘μ΄ Todo μμ±
- Request Body:
{ "title": "ν μΌ μ λͺ©", "description": "ν μΌ μ€λͺ ", "completed": false }
-
PUT
/todos/{id}- Todo μμ
- Request Body:
{ "title": "μμ λ μ λͺ©", "description": "μμ λ μ€λͺ ", "completed": true }
-
DELETE
/todos/{id}- Todo μμ
curl -X POST http://localhost:8080/todos \
-H "Content-Type: application/json" \
-d '{"title":"Kotlin 곡λΆνκΈ°","description":"Spring Bootμ ν¨κ»"}'curl http://localhost:8080/todos- β Kotlin κΈ°λ³Έ λ¬Έλ² νμ΅
- β SpringBoot κΈ°μ΄ (Hello API, CRUD)
- β H2 μΈλ©λͺ¨λ¦¬ DB μ°λ
- β μΈν°λν°λΈ νμ΅ μλ£ μ 곡 (Jupyter Notebook)
- μ€μ μ 무 μλν νλ‘μ νΈ
- μ λ ₯κ° κΈ°λ° μ΄νκΈ°λ‘ μλ μμ±
- κ·μΉ κΈ°λ° λ°μ΄ν° μ²λ¦¬
- CSV/Excel μΆλ ₯ κΈ°λ₯
- μ’ λͺ©/κ±°λ κ΄λ¦¬
- ν¬μ μ§ν λΆμ
- 리ν¬νΈ μμ±
- νμ₯ κ°λ₯ν μν€ν μ² μ€κ³
κ° λ¨κ³λ³λ‘ μ μ§μ μΌλ‘ 볡μ‘λκ° μ¦κ°νλ©°, μ€μ μμ μ¬μ©ν μ μλ κΈ°μ λ€μ μ΅ν μ μμ΅λλ€.
- Java κ°λ°μ: Kotlinμ null safetyμ νμ₯ ν¨μμ μ£Όλͺ©νμΈμ
- Python κ°λ°μ: μ μ νμ μ μ₯μ μ νμ©νλ©΄μλ κ°κ²°ν λ¬Έλ² μ¦κΈ°κΈ°
- C/C++ κ°λ°μ: λ©λͺ¨λ¦¬ κ΄λ¦¬ μμ΄ μμ ν νλ‘κ·Έλλ° κ²½ννκΈ°
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
μ΄ νλ‘μ νΈλ νμ΅ λͺ©μ μΌλ‘ λ§λ€μ΄μ‘μ΅λλ€.
Built with β€οΈ using Kotlin and Spring Boot