-
Notifications
You must be signed in to change notification settings - Fork 0
1week_AOS_tech_post_2
์ด๋ฒ์ฃผ์๋ ์ฒซ์ฃผ๋ผ ๊ทธ๋ฐ์ง ๊ฐ๋ฐํ๋ ์๊ฐ๋ณด๋ค๋ ๊ท์น์ด๋ ๊ณํ์ ๋ ผ์ํ๋ ์๊ฐ์ด ๋ง์๋ ๊ฒ ๊ฐ๋ค.
๊ฐ๋ฐ์๊ฐ์ด ๋ง์ง ์์์ ํฌ๊ฒ ์ง๋๊ฐ ๋ง์ด ๋๊ฐ์ง๋ ๋ชปํ์ง๋ง, ์ด๋ฒ์ฃผ์ ๋ด๊ฐ ๋งก์๋ ์ปค์คํ ๋ค์ด์ผ๋ก๊ทธ ๊ตฌํ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ธฐ๋กํ๋ค.
๋์์ธ๋์ด์๋ ๋ค์ด์ผ๋ก๊ทธ๋ ์ด 3๊ฐ๋ก ์ผ๋ฐ์ ์ธ ๋ค์ด์ผ๋ก๊ทธ์ ๋ฏธ๋ฌํ๊ฒ ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ๋ ๋๊ฐ์ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๊ตฌํํด์ผํ๋ค.
์ฒ์์๋ ํ์์ ๋ฒํผ์ ์ปค์คํ ํ๋๊ฒ์ฒ๋ผ ์์ฑ์์ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ด ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๊ตฌํํ๋ค.
TwoButtonsDialog("์ ๋ชฉ", "์๋
").apply {
setOnPrimaryButtonClickListener {
//์ฐ์ธก ๋ฒํผ ํด๋ฆญ ์
}
setOnSecondaryButtonClickListener {
//์ข์ธก ๋ฒํผ ํด๋ฆญ ์
this.dismiss()
}
}.show(requireActivity().supportFragmentManager, "dialogTag")
์ด๋ ๊ฒ ์งฐ๋๋ ์์ฑ์์์ ๋ง์ ์ต์ ์ ์ค์ ํ๊ธฐ ํ๋ค๊ณ ์ค์ ํจ์๋ ๊ฝค๋ ๋ง์ด ๋์์ ์ด์ฉ์ ์์ด ์ธ๊ฐ์ ์ ์ฌํ ๋ค์ด์ผ๋ก๊ทธ์ ๋ํ ํด๋์ค ๋ถ๋ฆฌ๋ฅผ ์๊ฐํ๊ฒ ๋์๋๊ฒ๊ฐ๋ค.๐ฅฒ
์ธ ๋ค์ด์ผ๋ก๊ทธ๋ ์ ์ฌํ ๋ถ๋ถ์ด ๋ง์์ ์ด๋ถ๋ถ์ ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ํตํฉํ ์ ์์๊น์ ๋ํด์ ๊ณ ๋ฏผ์ด ๋ง์์๋๋ฐ ๋ง๋ ํ ๋ฐฉ๋ฒ์ด ์๊ฐ๋์ง ์์์ ์๋นํ ์ค๋์๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฏผํ๋๋ฐ ์ผ์๋ค.
๊ทธ๋ฌ๋ค ๊ธ์์ผ ์งํ์ํฉ ๋ณด๊ณ ์์ ํด๋น ์ฝ๋๊ฐ ์ฌ๋ผ๊ฐ pr์ ์์ด๋น๋๊ป ๋ณด์ฌ๋๋ฆฌ๊ณ ๋ค์ด์ผ๋ก๊ทธ ๊ตฌํ์ ๊ดํด์ ์ง๋ฌธ์ ๋๋ ธ๋๋ฐ โbuilder patternโ๊ณผ โnavigation componentโ๋ผ๋ ํค์๋๋ฅผ ์ป์ ์ ์์๋ค.
์ดํ builder pattern๋ถํฐ ๊ณ ๋ คํด๋ณด์๋ ์๊ฐ์ด ๋ค์ด์ ์ด๋ถ๋ถ๋ถํฐ ๊ณต๋ถํด๋ณด์๋ค.
builder pattern์ ์ฝ๊ฒ ๋งํด์ ๊ฐ์ฒด์ ์์ฑ๊ณผ์ ๊ณผ ํํ์ ๋๋๋ ๋ฐฉ๋ฒ์ด์๋๋ฐ, ๋ ํผ๋ฐ์ค ์ฝ๋๋ฅผ ๋ณด๋์๊ฐ ์๊ฐ๋ณด๋ค ์ต์ํ ๊ตฌ์กฐ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค!๐ฒ
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ํ๋ฒ์ฏค ๋ณด์์๊ฒ์ด๋ค.
๊ฐ์ฒด.Builder // ๋น๋๋ฅผ ์ฌ์ฉํด์ ์์ฑ ์ค์ !
.setTitle("")
.build() //์ฌ๊ธฐ์ ์ค์ ๊ฐ์ฒด๊ฐ ์์ฑ๋จ
.show()
๋๋ ์๋์ ์ฅ์ ์ด ๊ธฐ์กด๋ณด๋ค ์ฌ์ฉ์ฑ ์ธก๋ฉด์์ ์ฐ์ํ ๊ฒ์ด๋ผ๋ ์๊ฐ์ด ๋ค์ด์ builder pattern์ ์ ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
- ๊ด๋ก์ ์ผ๋ก dialog์ ๋ง์ด ์ฐ์ด๋ ํจํด์ด๋ผ ์ปค์คํ ๋ค์ด์ผ๋ก๊ทธ์๋ ์ต์ํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅ
- ์ต์ ์ค์ ๊ณผ์ ์ด ๊น๋ํด์ง
- ๋น๋์ ๊ตฌํ๋ถ์ ์ญํ ์ด ๋๋๋ฉด์ ๋น๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ค์ด์ผ๋ก๊ทธ ํด๋์ค๋ง ๋ณ๊ฒฝํ๋ ๋ฑ ์ ์ง๋ณด์๊ฐ ํธํด์ง
๋น๋ ํจํด์ ๋ง๋ค๊ธฐ ์ํด ์๋์ ๊ฐ์ด ํด๋์ค ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ์๋ค.
์ฒ์์ ๋ ํผ๋ฐ์ค๋ฅผ ๋ณด๋ฉด์ ์ Builderํด๋์ค๋ฅผ inner class
๋ก ์ค์ ํ์ง ์์์๊น? ํ๋ ์๊ฐ์ด ๋ค์๋ค.(์ด๋ถ๋ถ์ ์๋์ ์ถ๊ฐ๋ก ์ ๋ฆฌํด๋์๋ค!)
์ด์จ๋ ์๋์์ Builder
ํด๋์ค๋ ๋ค์ด์ผ๋ก๊ทธ์์ ์ฌ์ฉ๋๋ ์์ฑ์ ์ฒด์ด๋ ํํ๋ก ์ค์ ํ ์ ์๊ฒ ์ค๊ณ๋์๋ค.
์๋ฅผ ๋ค์ด setTitle
์ title์ ๋ํ ์ฌ๋ฌ ์์ฑ์ ์ค์ ํ๊ณ ์ดํ ๋ณธ์ธ์ธ Builder๋ฅผ ๋ฐํํด์ ๊ณ์ํด์ ์์ฑํจ์๋ฅผ ์ฐ๊ฒฐํ ์ ์๊ฒ๋๋ค.
๋ชจ๋ ์์ฑ์ ์ค์ ํ ๋ง์ง๋ง์๋ build()ํจ์๋ฅผ ํธ์ถํ์ฌ CaArtDialog๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํํ๊ฒ๋๋ค.
class CaArtDialog(private val builder: Builder) : DialogFragment() {
//...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.builder = builder
binding.dialog = this
//...
}
class Builder(
private val context: Context
) {
var title: String? = null
//...
fun setTitle(title: String, size: Int = 16): Builder = apply {
this.title = title
titleTextSize = size
}
//...
fun build() = CaArtDialog(this)
}
}
์์ ๊ตฌํ๋ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ์์ด๋ค.
CaArtDialog.Builder(requireContext())
.setTitle("hello",30)
.setDescription("android")
.setButtonType(CaArtDialog.SINGLE) //DOUBLE, SINGLE
.setPositiveButton(listener =
//...
})
.setNegativeButton(text = "์๋", listener = {
//...
})
.setContentText(
text = "abcd1234@email.com",
hint = "hi",
isEditable = true
)
//.setDialogContentView(view2)
.build()
.show(requireActivity().supportFragmentManager, "dialogTag")
๊ฒฐ๋ก ์ ์ผ๋ก ์๋๋ ๋ค์ด์ผ๋ก๊ทธ ์ข ๋ฅ์ ๋ฐ๋ผ ์ด 3๊ฐ๋ก ๋๋์์ด์ผ ํ ๋ค์ด์ผ๋ก๊ทธ ํด๋์ค๋ฅผ ํ๋๋ก ํต์ผํ ์ ์์๋ค!๐
์ฌ์ฉ์ฑ ์ธก๋ฉด์์ ์ผ๋ง๋ ๊ฐ์ ๋์๋์ง๋ ์ฐจ์ฐจ ์ง์ผ๋ด์ผ๊ฒ ์ง๋ง ์ง๊ธ๋ดค์๋๋ ๊ธฐ์กด๋ณด๋ค ํ์์ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๊น์์ง๊ฒ๊ฐ๋ค.
+) Builder๋ฅผ inner class๋ก ๋ง๋ค์ง ์๋์ด์ : inner class
vs class
- inner class๋ ๋ถ๋ชจ์ ํ๋กํผํฐ์ ๋ชจ๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
- ๋ฐ๋ฉด ํด๋์ค๋ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ฐ๋ผ์ ๋น๋ํจํด์ ํน์ฑ์ ๋น๋๊ฐ ๋ค์ด์ผ๋ก๊ทธ์ ํ๋กํผํฐ์ ์ ๊ทผํด์ผ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ํด๋์ค๋ก ์ ์ธํ๋๊ฒ ์ ํฉํ๋ค.
์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ์ ์ด 2๊ฐ์ง์ธ๊ฒ๊ฐ๋ค.
์ฒซ๋ฒ์งธ๋ก ์๋ก์ด ๋์ ๋ถ์กฑํจ์ ๋ํด ์๊ฒ๋์๋ค!
๋ณดํต ์ด๋ฐ ํ์ ์ํฉ์์ ์ปค์คํ ๋ทฐ๋ฅผ ๋ง๋ค๋๋ ๋ค๋ฅธ ์ฌ๋์ด ์ฌ์ฉํ ๊ฒ์ ๋๋นํด์ ์ฌ์ฉ์ฑ์ ๋จผ์ ์๊ฐํ๊ฒ ๋์ ์ด๋ฒ์๋ ๋๋ฆ๋๋ก ์ต๋ํ ์ฌ์ฉํ๊ธฐ ํธํ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
ํ์ง๋ง ๊ทธ ๋ ธ๋ ฅ์ ๋ด๊ฐ ๋ชฉํ๋ก ํ๋ ์ฌ์ฉ์ฑ์ ๊ดํ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ๋น ์ ธ์๋ค๋๊ฒ์ ๊นจ๋ซ๊ฒ ๋์๋ค๐
๊ตฌํ์ ๋ํ ๋ ํผ๋ฐ์ค๋ ํ์์ ๋ง์ด ์ฐพ์๋ณด๋ ํธ์ธ๋ฐ, ๋ทฐ์ ํ์ฉ์ ๋ํ ๋ถ๋ถ์ ํ์์ ํ์ฉํ๋๊ฒ ์๋๋ผ๋ฉด ์ ๋ชจ๋ฅด๊ณ ์๋๊ฒ ๊ฐ๋ค.
์ด๋ฒ ๊ธฐํ์ ์ด๋ฐ ๋ถ์กฑํ ๋ถ๋ถ์๊ฒ ๋์์ผ๋ ๋ ๋ค์ํ ๋ทฐ๋ฅผ ์ฌ์ฉํ๊ณ ๊ณต๋ถํ๋๋ก ๋ ธ๋ ฅํด์ผ๊ฒ ๋ค!
๋ ๋ค์์๋ ์ด๋ฐ ๋ถ๋ถ์ ๊ฐ์ ํด์ ๊ตฌ๊ธ์ด ๋ง๋ค์๋์ง ๋ด๊ฐ ๋ง๋ค์๋์ง ๊ตฌ๋ถํ๊ธฐ ์ด๋ ค์ธ ์ ๋๋ก ์ฌ์ฉ์ด ์ต์ํ ์ปค์คํ ๋ทฐ๋ฅผ ๋ง๋ค ์ ์์์ผ๋ฉด ์ข๊ฒ ๋ค!
๋๋ฒ์งธ๋ ์ง๋ฌธ์ ์ค์์ฑ์ด๋ค!
์ฌ์ค ๋๋ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ์ต์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๋ฐํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ์ด๋ฐ ๋ถ๋ถ์ ๊ฒฝ๊ณํ๋ ค๊ณ ํ๋๋ฐ ์ฝ์ง ์์๊ฒ๊ฐ๋ค.
์ด๋ฒ์๋ ์ฌ์ค ์ง๋ฌธ์ ๋๋ ค ์กฐ์ธ์ ๋ฐ์ง ๋ชปํ์ผ๋ฉด builder pattern์ ์กด์ฌ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ ๋์ด๊ฐ์๊ฒ๊ฐ๋ค.
์ด๋ฒ ๊ฒฝํ์์ ์ต์ํจ์ ๊ฒฝ๊ณํ๋ ์ข์ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ์ง๋ฌธ์ด๋ผ๋๊ฒ์ ์๊ฒ ๋์๋ค.
ํญ์ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋์ง ์ค์ค๋ก ์ง๋ฌธํ๊ณ ๋ค๋ฅธ์ฌ๋์๊ฒ๋ ์กฐ์ธ์ ๊ตฌํด์ ๋ ๋ฐ์ ๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ์ผ๋ฉด ์ข๊ฒ ๋ค!๐
๐ป [H6-CaArt] โDone is better than perfectโ ๐ป
- [์ต๊ทํ] Sentry ๋์ ๊ธฐ (feat. ๋ก๊ทธ ๊ด๋ฆฌ)
- [์ต๊ทํ] GPT3.5 ๋ชจ๋ธ์ ํ์ฉํด์ ์ถ์ฒ ๋ฌธ๊ตฌ ์์ฝํ๊ธฐ
- [์ต๊ทํ] ์คํ๋ง์์ OpenAI API ์ฑ๋ฅ ๊ฐ์ ๊ธฐ
- [๊ถ๋ฏผ์] CaArt CI/CD ๊ตฌ์ถ ๊ณผ์
- [๊ถ๋ฏผ์] ์ฑํ๋ฅ ๊ณ์ฐ ๋ก์ง ๊ฐ์ - Index tuning๊ณผ Batch processing
- [์ด์นํ] useReducer, useContext๋ฅผ ์ฌ์ฉํ ์ ์ญ ์ํ ๊ด๋ฆฌ with React, TS
- [์ด์นํ] ํ๋กํ ํ์ ํจํด์ด๋?
- [์ด์นํ] UX ๊ฐ์ ์ ์ํ ์ด๋ฏธ์ง ํ๋ฆฌ๋ก๋ฉ With Promise
- [์์ํ] ํ์ ์คํฌ๋ฆฝํธ ์ ๋ค๋ฆญ์ด๋?
- [๋ฐ์ธ์] Android์ Data Binding: DataBindingUtil vs Binding.inflate
- [๋ฐ์ธ์] DI, Hilt ๋ฝ๊ฐ๊ธฐ
- [๋ฐ์ธ์] Retrofit ๋์ ๊ธฐ
- [๋ฐ์ธ์] 360๋ Spin Image Touble Shooting
- [๊น์ ๋น] ์ปค์คํ ๋ค์ด์ผ๋ก๊ทธ ๊ตฌํ