SOPT 25๊ธฐ ๊ฒจ์ธ ์ฑ์ผ : ์๋๋ก์ด๋
์ ๋ณด๋ฅผ ๊ณต์ ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ
๊ธฐ์
์์ ์ด๋ค ์ ๋ณด๋ค์ ๊ณต์ ํ๋์ง ์๊ณ ์ถ์ง ์๋์?
ํ๋ฌ๋๋ ๊ธฐ์
์์ ์ด๋ค ์ ๋ณด๋ค์ ๊ณต์ ํ๋์ง ์๊ฐํ๋ ์๋ฃ๋ก ์ฌ๋ฌ๋ถ๊ป ๋ณด์ฌ๋๋ฆฝ๋๋ค.
-
data : ui์์ ํ๋ฉด์ ๊ทธ๋ฆด ๋ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์๋์ ํจํค์ง
-
ui
- ๊ธฐ๋ฅ๋ณ ํ๋ฉด
- adapter : ํด๋น ํ๋ฉด์์ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ๋ Adapter๋ค์ ๋ชจ์๋์ ํจํค์ง
- ๊ธฐ๋ฅ๋ณ ํ๋ฉด
-
util : Util๊ณผ ๊ด๋ จํ class ๋ชจ์
- ์๋๋ก์ด๋ ์คํ๋์ค 3.4.2
- Kotlin
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation "androidx.cardview:cardview:1.0.0"
implementation 'de.hdodenhof:circleimageview:3.0.1'
RecyclerView, CardView, Circled ImageView ์ปค์คํ ์ ์ํด ์ฌ์ฉ
implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
์ด๋ฏธ์ง ๋ก๋ฉ์ ์ํด ์ฌ์ฉ
implementation 'com.github.Deishelon:RoundedBottomSheet:1.0.1'
BottomSheet ๋ค์ด์ผ๋ก๊ทธ ์ปค์คํ ์ ์ํด ์ฌ์ฉ
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:retrofit-mock:2.6.2'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
REST API๋ฅผ ์ด์ฉํ ์๋ฒ ํต์ ์ ์ํด ์ฌ์ฉ
implementation "gun0912.ted:tedpermission:2.1.0"
๊ถํ ์ฒดํฌ๋ฅผ ์ํด ์ฌ์ฉ
- util package > OnSingleClickListener.kt
Debounce
๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํ์ฌ ํน์ ์๊ฐ์ด ์ง๋ ํ ํ๋์ ์ด๋ฒคํธ๋ง ๋ฐ์ํ๋๋ก ํ๋ ๊ธฐ์ ์ด๋ค. ์ฆ, ์์ฐจ์ ํธ์ถ์ ํ๋์ ๊ทธ๋ฃน์ผ๋ก "๊ทธ๋ฃนํ"ํ ์ ์๋ค.
์ฌ๋ฌ๋ฒ ํด๋ฆญ๋๋ฉด ์ด๋ฒคํธ๊ฐ ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ค๋ณต ํด๋ฆญ ๋ฐฉ์ง ์๊ฐ(0.6์ด)์ ์ค์ ํ ํ, ์ค๋ณตํด๋ฆญ์ธ ๊ฒฝ์ฐ ์๋ฌด ์ด๋ฒคํธ๋ฅผ ๋ฐ์ํ์ง ์๊ฒ ํ๊ณ , ์ค๋ณต ํด๋ฆญ์ด ์๋๋ผ๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋๋ก ํ๋ค.
- util package > RetrotiExt.kt
ํ์ฅํจ์๋ ํด๋์ค ๋ฐ์์๋ ์ฌ์ฉํ ์ ์๋ ํจ์๋ก์ ํด๋น๋๋ ์ฌ๋ฌ ํด๋์ค์ ์ถ๊ฐ์ ์ผ๋ก ํจ์๋ฅผ ๋ฃ๋ ๊ธฐ๋ฅ์ ํ๋ค. ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ํด๋์ค์์ ๊ฐ ํด๋์ค์ ํ์ํ ๋ฐ์ดํฐ ํ์ ๋ง๋ค ์๋ฒ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ฒญ์ ํด์ฃผ์ด์ผ ํ๋ค. ์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณต๋์ด ํด๋น ํด๋์ค๋ค์ ์ฝ๋ ๊ธธ์ด๋ฅผ ๋๋ ค ๊ฐ๋ ์ฑ์ ์ ํ์ํจ๋ค.
์ด์ util ํจํค์ง ๋ด RetrotiExt.kt ํ์ผ์ ์์ฑํ์ฌ ํต์ ์ด ์คํจํ์์ ๋์ ์๋ต์ด ํต์ ์ด ์ฑ๊ณต์ ์ด์ง ์์ ๋, ํต์ ์ด ์ฑ๊ณตํ๊ณ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋์ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ๊ฐ๊ฐ์ ๋ํด ๊ณตํต์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค. ์ด๋ฅผ ํตํด ๊ธฐ๋ฅ๋ง๋ค ๋๋ ๋ฐ์ดํฐ ํด๋์ค ์์ดํ ์ ๋ํ ํตํฉ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ 20์ค ์ด์์ฉ์ ์ค์ผ ์ ์์๋ค.
๊ธฐ๋ฅ | ์ฐ์ ์์ | ๋ด๋น |
---|---|---|
๋ก๊ทธ์ธ | 2์์ | ์ฒญํ |
ํ์๊ฐ์ | 2์์ | ์งํฌ |
๋ด์คํผ๋ | 1์์ | ํ์ฃผ |
๋ถ๋งํฌ | 2์์ | ์ฒญํ |
๊ฒ์๊ธ ์์ฑ | 1์์ | ์ฒญํ |
์๋ฆผ | 3์์ | - |
๋ง์ดํ์ด์ง | 2์์ | ์งํฌ |
-
RetrotiExt
fun <T> Call<T>.safeEnqueue( onFailure: (Throwable) -> Unit = {}, onSuccess: (T) -> Unit = {} ) { this.enqueue(object : Callback<T> { override fun onFailure(call: Call<T>, t: Throwable) { onFailure(t) } override fun onResponse(call: Call<T>, response: Response<T>) { if (response.isSuccessful) { response.body()?.let { onSuccess(it) } ?: Log.e("retrofitExt", "error") } else{ Log.v("Postygyg", "fail") } }
}) }
/**
* ๊ฒ์๋ฌผ ์ฌ๋ฆฌ๊ธฐ POST ํต์
*/
var fail: (Throwable) -> Unit = {
Log.v("PostActivity", it.toString())
}
var temp: (PostPostResponse) -> Unit = {
Log.v("PostActivity", it.message)
startActivity(Intent(this, MainActivity::class.java))
}
private fun postPost(
token: String,
images: ArrayList<MultipartBody.Part>?,
url: RequestBody,
category: RequestBody,
content: RequestBody
) {
val postPostResponse = ApplicationController.networkServiceFeed
.postPostResponse(token, images, url, category, content)
postPostResponse.safeEnqueue(fail, temp)
}
- ์์ RetrotiExt์ ๊ธธ์๋ ํจ์๋ฅผ ํ์ฅํจ์๋ ๋ง๋ค์ด์ ํต์ ํ ๋๋ง๋ค ์ฌ์ฉํ๋ค. onFail๊ณผ OnSuccess๋ก ๋๋์๊ณ , ํจ์๋ฅผ ๋ณ์๋ก ๋ง๋ค์ด ๋๊ฒจ์ฃผ์ด ํต์ ์ Response์ ๋ํ ํจ์๊ฐ ์๋ํ๋๋ก ํ์๋ค.
-
ContextExt.kt
fun Fragment.toast(msg: String) { Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() } fun Context.toast(msg: String) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() }
-
toast ํ์ฅํจ์ ์ฌ์ฉ์
if ("text/plain".equals(type)) { websiteUrl = intent.getStringExtra(Intent.EXTRA_TEXT) if (SharedPreferenceController.getAuthorization(this@LoginActivity).toString() == ""){ toast("๋ก๊ทธ์ธ์ ํด์ฃผ์ธ์") } else { val intent = Intent(this@LoginActivity, PostActivity::class.java) intent.putExtra("websiteUrl", websiteUrl) startActivity(intent) finish() } }
๋ชจ๋ ๋ทฐ์ Constraint Layout์ ์ฌ์ฉํ์๋ค. ๊ฐ ๋ทฐ์ ํน์ฑ์ ๋ฐ๋ผ Constraint Layout ์์ Constraint Layout์ ๋ง๋ค์ด ์ฃผ์๋ค. Constraint Layout์ ํน์ฑ์ธ TopOfTop, TopOfBottom ๋ฑ์ ์์ฑ์ ์ฌ์ฉํด ๊ฐ View๋ค์ ๊ด๊ณ๋ฅผ ์๊ฐํ์ฌ View๋ฅผ ์งฐ๋ค.
- ํ ์ํฉ
Web์์ ๊ณต์ ํ๊ธฐ ๋ฒํผ์ ๋๋ฌ url์ ๊ฐ์ ธ์ Activity ๋ด์ TextView์ ๋์์ค์ผ ํ๋ค.
- ๋ฌธ์ ์
๊ณต์ ํ๊ธฐ ๋ฒํผ์ ํตํด ํ๋ฒ url์ ๊ฐ์ ธ์ ์ ๋ ฅํ ํ, app์ ์ข ๋ฃํ์ง ์๊ณ ํํค๋ฅผ ๋๋ฌ ๋๊ฐ ๊ฒฝ์ฐ, ๋ค์ ๊ณต์ ํ๊ธฐ๋ฅผ ๋๋ฌ๋ url์ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ค
- ์์ ํด๊ฒฐ๋ฒ
onUserLeaveHint() ๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์์
void Activity.onUserLeaveHint ()
์ด ๋ฉ์๋๋ ์ฌ์ฉ์์ ์ํด ์กํฐ๋นํฐ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ํ๋๊ธฐ ์ง์ ์ onPause ๋ฐ๋ก ์์ ํธ์ถ๋๋ค. Home ํค๋ฅผ ๋๋ฅด๊ธฐ ์ง์ ์ ํธ์ถ๋๋ฉฐ Backํค๋ฅผ ๋๋ฅด๊ฑฐ๋ ์ ํ ํตํ ์ฑ์ด ์ฌ๋ผ์ฌ ๋, ํ์ด๋จธ์ ์ํด ์ข ๋ฃ๋ ๋๋ ํธ์ถ๋์ง ์๋๋ค. Homeํค๋ ํค์ ๋ ฅ ์ด๋ฒคํธ๋ก ์ ๋ฌ๋์ง ์์ ๊ฒ์ถ์ด ์ด๋ ค์ด๋ฐ ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ Homeํค์ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋๊ฐ ๋จ์ ์ ์ ์๋ค. ์ด ๋ ๋ฉ์๋๋ ์ํ๋์ ํต์ง๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ ์กํฐ๋นํฐ๊ฐ ํต์ง๋ฅผ ์ทจ์ํ ์์ ์ ๊ฒฐ์ ํ๋๋ฐ ๋์์ ์ค๋ค. ๋ค์ ์์ ๋ ์ฌ์ฉ์๊ฐ 5์ด ์ด์ ๊ด์ฌ์ ๋ณด์ด์ง ์์ผ๋ฉด ์ฆ์ ์ข ๋ฃํ๋ค.
- ํ ์ํฉ
recyclerview์์ ํ item์ ์ ํํ์ ๋ ๋๋จธ์ง itemView๋ค์ textColor๊ฐ ํ์์ผ๋ก ๋ฐ๋์ด์ผํ๊ณ , ์ ํํ itemView๋ง ๊ฒ์์์ผ๋ก ๋์ด์ผ ํ๋ค.
- ๋ฌธ์ ์
๊ฐ itemView๋ค์ ํ๋ํ๋ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง, ๊ทธ ๋๋จธ์ง itemVeiw๋ค์ ์ ๊ทผํ๊ธฐ๊ฐ ์ด๋ ค์ ๋ค.
- ์ผ๋จ ํด๊ฒฐ๋ฒ
Adapter์ itemClick์ด๋ผ๋ interface๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ์ด interface๋ฅผ Dialog์์ ํธ์ถํด์ ์ด๊ธฐํํด์ค๋ค.
ํต์ ์์ ๋ฐ๋ list์ ๋ณ๊ฐ๋ก check๋ผ๋ arrayList๋ฅผ ๋ฐ๋ก ํ๋ค. itemClick์ ํตํด ์ ํํ selectIdx์ ๋ฐ์ ํ, ๊ทธ idx๊ฐ ์๋ ๊ฒฝ์ฐ์ ํ์์ผ๋ก ๋ง๋ค์ด์ฃผ๊ณ , ์ ํ ๋ itemView๋ง ๊ฒ์ ์์ผ๋ก ๋ฐ๊พธ์ด ์ค๋ค.
- ํ ์ํฉ
๋ทฐ๋ฅผ ์์์ ์๋๋ก ์ค์์ดํ(pull down)ํ์ ๋, ๋์์ด๋๊ฐ ๋ง๋ gif๋ก ๋ก๋ฉ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ค.
- ๋ฌธ์ ์
ํน์ ์ด๋ฏธ์ง๋ก ๋ฆฌํ๋ ์ ๋ก๋ฉ ์ด๋ฏธ์ง๋ฅผ ์ปค์คํ ํ๊ธฐ ์ด๋ ต๋ค
๐โโ๏ธ ์ ์งํฌ
์ด๋ฒ ์ฑ์ผ์ ํตํด ์๋๋ก์ด๋์ ์ ๋ฐ์ ์ธ ํจ์ ์ฌ์ฉ ๋ฐ ๋ทฐ ๊ตฌํ ๋ฑ์ ์ตํ๋ค๋ฉด,
์์ผ๋ก๋ ์ข ๋ ์๊ฐ์ ์ธ ์ฌ์ ๋ฅผ ๊ฐ์ง๊ณ ๊ณต๋ถํ์ฌ ์ปดํฉํธํ๊ณ ๊นจ๋ํ, ์ฝํ๋ฆฐ์ค๋ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ฌ๋ ์๋ ๋๋ฌด ๊ณ ์ ๋ง์๊ตฌ ์ฌ...๋...ใ ...โฅ
+ ๋ค์๋ ์์ ์ข์ ๋ฉค๋ฒ๋ค๊ณผ ํจ๊ป ํด์ ์๊ด์ด์๊ณ , ํ๋์บ๋ฆฌํด์ค ํ์ฃผ๋ ์ฒญํ ๋ค์ ํ๋ฒ ๋๋ฌด ๊ณ ๋ง์! ๋ฐฅ์ฌ์ผ์ง ๋ฃฐ๋ฃจ
๐โโ๏ธ ์ฑ์ฒญํ
SOPT ์๋๋ก์ด๋ ํํธ 25๊ธฐ OB ํํธ์์ ๋๋ค.
๋ ๋ฒ์งธ ์ฑ์ผ์ ํ๋ฌ๋์ ํจ๊ป ํ ์ ์์ด์ ๋๋ฌด ์ข์์๋๋ค์ฐ~!
ํ๋ฌ๋ ๊ธฐํ, ๋์์ธ, ์๋, iOS, ์๋ฒ ํ์๋ค ๋ค ์ ๋ง๊ณ ์ด์ฌํ ํด์ ์ข์์ ><
๐โโ๏ธ ์ดํ์ฃผ
SOPT25๊ธฐ ์๋๋ก์ด๋ OBํํธ์์ด์ ์๋๋ก์ด๋ ๋ฆฌ๋ ๊ฐ๋ฐ์๋ก ๊ฐ๋ฐ์ ์ฐธ์ฌํ๊ฒ ๋์์ต๋๋ค.
ํ๋ฌ๋๋ผ๋ ์ข์ ๊ธฐํ์ผ๋ก ์ข์ ํ์๋ค ๋ง๋ ์ข์ ๊ฒฐ๊ณผ๋ฌผ ๋ผ ์ ์์ด์ ํ๋ณตํ์ต๋๋ค :)
Flood ์ต๊ณ ~~ โค๏ธ