๋ก๊ทธ์ธ ์ฑ
์ด๋ฒ ํ๋ก์ ํธ์์๋ Flutter(ํ๋ฌํฐ)์ Spring Boot(์คํ๋ง ๋ถํธ)๋ฅผ ํ์ฉํ์ฌ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด ํฌํจ๋ ์ฑ์ ๋ง๋ค์ด๋ณผ ๊ฒ์
๋๋ค.
ํ๋ก์ ํธ ๊ฐ์
โข
Frontend: Flutter๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ฐ์ผ ์ฑ UI๋ฅผ ๊ฐ๋ฐํฉ๋๋ค.
โข
Backend: Spring Boot๋ฅผ ์ด์ฉํ์ฌ ํ์๊ฐ์
, ๋ก๊ทธ์ธ, JWT ์ธ์ฆ ๋ฑ ์๋ฒ ๊ธฐ๋ฅ์ ๊ตฌ์ถํฉ๋๋ค.
โข
Database: MySQL ๋๋ PostgreSQL์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ์ฅํฉ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ
Github
ํ๋ฌํฐ ์ฑ ๊ฐ๋ฐ ์์
1.
ํ๋ก์ ํธ ์์ฑ
2.
ํ๋ก์ ํธ ์ค์
3.
ํ๋ฉด UI ๊ฐ๋ฐ
โข
ํ
โข
ํ์๊ฐ์
โข
๋ก๊ทธ์ธ
โข
๋ง์ดํ์ด์ง
4.
๊ธฐ๋ฅ ๊ฐ๋ฐ
a.
ํ์๊ฐ์
b.
๋ก๊ทธ์ธ
c.
๋ก๊ทธ์์
d.
ํ์์ ๋ณด ์์
e.
ํ์ ํํด
ํ๋ก์ ํธ ์์ฑ
ํ๋ก์ ํธ ์ค์
โข
์์กด์ฑ ํจํค์ง ์ค์
โข
์๋๋ก์ด๋ ์ค์
์์กด์ฑ ํจํค์ง ์ค์
pubspec.yaml
name: login_app
description: "A new Flutter project."
publish_to: 'none'
version: 1.0.0+1
environment:
sdk: ^3.6.1
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.8
# ์ถ๊ฐํ ํจํค์ง
dio: ^5.8.0+1
flutter_secure_storage: ^9.2.4
shared_preferences: ^2.5.1
provider: ^6.1.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^5.0.0
flutter:
uses-material-design: true
YAML
๋ณต์ฌ
์๋๋ก์ด๋ ์ค์
โข
android/gradle.properties
โข
android/app/build.gradle
android/gradle.properties
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
org.gradle.java.home=C:/Program Files/Java/jdk-17
Java
๋ณต์ฌ
android/app/build.gradle
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
}
android {
namespace = "com.example.login_app"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17
}
defaultConfig {
applicationId = "com.example.login_app"
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
buildTypes {
release {
signingConfig = signingConfigs.debug
}
}
}
flutter {
source = "../.."
}
Java
๋ณต์ฌ
ํ๋ฉด UI ๊ฐ๋ฐ
โข
ํ
โข
ํ์๊ฐ์
โข
๋ก๊ทธ์ธ
โข
๋ก๊ทธ์์
โข
๋ง์ดํ์ด์ง
๋ก๊ณ ์ด๋ฏธ์ง
ํ
ํ์๊ฐ์
๋ก๊ทธ์ธ
๋ก๊ทธ์์
๋ง์ดํ์ด์ง
๊ธฐ๋ฅ ๊ฐ๋ฐ
1.
ํ์๊ฐ์
2.
๋ก๊ทธ์ธ
a.
์์ด๋ ์ ์ฅ
b.
์๋ ๋ก๊ทธ์ธ
3.
๋ก๊ทธ์์
4.
ํ์์ ๋ณด ์์
5.
ํ์ ํํด
ํ์๊ฐ์
ํ์๊ฐ์
์ ๋ณด(์์ด๋, ๋น๋ฐ๋ฒํธ, ์ด๋ฆ, ์ด๋ฉ์ผ)๋ฅผ ์
๋ ฅํ๊ณ , ์๋ฒ ์ธก์ ํ์ ์ ๋ณด๊ฐ ๋ฑ๋ก ๋๋๋ก ์์ฒญํ๋ ๊ธฐ๋ฅ์
๋๋ค.
ํญ๋ชฉ | ๋ด์ฉ |
์์ฒญ URL | |
์์ฒญ ๋ฉ์๋ | POST |
์์ฒญ ๋ณธ๋ฌธ (body) | {
โusernameโ : โalohaโ,
โpasswordโ : โ123456โ,
โnameโ : โ์๋กํโ,
โemailโ : โaloha@aloha.comโ
} |
์ํ ์ฝ๋ | 200 |
์ํ ์ฝ๋ | 400 |
๋ก๊ทธ์ธ
์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ์ฌ ์๋ฒ๋ก ์์ฒญํ์ฌ ์ธ์ฆ๋ฐ๊ณ , JWT์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์๋ต๋ฐ๋ ๊ธฐ๋ฅ์
๋๋ค.
๊ด๋ จ ๊ธฐ๋ฅ
โข
์์ด๋ ์ ์ฅ
โข
์๋ ๋ก๊ทธ์ธ
ํญ๋ชฉ | ๋ด์ฉ |
์์ฒญ URL | |
์์ฒญ ๋ฉ์๋ | POST |
์์ฒญ ๋ณธ๋ฌธ (body) | {
โusernameโ : โalohaโ,
โpasswordโ : โ123456โ,
} |
์ํ ์ฝ๋ | 200 |
์ํ ์ฝ๋ | 401 |
์์ด๋ ์ ์ฅ
1.
์์ด๋ ์ ์ฅ ์ฒดํฌ ๋ฐ์ค ์ฒดํฌ ์, SecureStorage ์ ์์ด๋ ์ ์ฅ
2.
๋ก๊ทธ์ธ ํ๋ฉด์์ SecureStorage ์ ์ฅ๋ ์์ด๋๊ฐ ์์ผ๋ฉด ์์ด๋ ์
๋ ฅ์ ์ถ๋ ฅ
์๋ ๋ก๊ทธ์ธ
1.
์๋ ๋ก๊ทธ์ธ ์ฒดํฌ ์,
a.
SecureStorage ์ JWT ์ ์ฅ
b.
์๋ ๋ก๊ทธ์ธ ์ฌ๋ถ ์ ์ฅ
2.
์ฑ ์ฌ์คํ ์, SecureStorage ์ ์ฅ๋ JWT ๋ก ์๋ฒ์ ์ฌ์ฉ์ ์ ๋ณด ์์ฒญ
3.
์๋ต ๋ฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ Provider ์ ๋ฑ๋ก
๋ก๊ทธ์์
๋ก๊ทธ์ธ ์ํ์์ ๋ก๊ทธ์์์ ์์ฒญํ๋ฉด ๋ก์ปฌ ์ ์ฅ์์ ์ ์ฅ๋ JWT์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ญ์ ํ์ฌ ๋ก๊ทธ์์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์
๋๋ค.
ํ์์ ๋ณด ์์
๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ํ์ ์ ๋ณด(์ด๋ฆ, ์ด๋ฉ์ผ)๋ฅผ ์์ ํ๋ ๊ธฐ๋ฅ์
๋๋ค. ์์ ๋ ์ ๋ณด๋ ์๋ฒ์ ๋ฐ์๋ฉ๋๋ค.
ํญ๋ชฉ | ๋ด์ฉ |
์์ฒญ URL | |
์์ฒญ ๋ฉ์๋ | PUT |
์์ฒญ ํค๋ | Authorization: Bearer {JWT ํ ํฐ} |
์์ฒญ ๋ณธ๋ฌธ (body) | {
โusernameโ: โuserโ,
"name" : "์๋กํ2",
"email" : "aloha2@aloha.com"
} |
์ํ ์ฝ๋ | 200 |
์ํ ์ฝ๋ | 401, 403 |
ํ์ ํํด
๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ํ์ ์ ๋ณด๋ฅผ ์ญ์ ํ๋ ๊ธฐ๋ฅ์
๋๋ค. ํ์ ํํด ์ ํด๋น ์ฌ์ฉ์์ ๋ชจ๋ ์ ๋ณด๊ฐ ์๋ฒ์์ ์ญ์ ๋ฉ๋๋ค.
ํญ๋ชฉ | ๋ด์ฉ |
์์ฒญ URL | |
์์ฒญ ๋ฉ์๋ | DELETE |
์์ฒญ ํค๋ | Authorization:Bearer {JWT ํ ํฐ} |
์ํ ์ฝ๋ | 200 |
์ํ ์ฝ๋ | 401, 403 |