Skip to content

1week_AOS_tech_post_2

sey2 edited this page Jan 9, 2024 · 3 revisions

์ด๋ฒˆ์ฃผ์—๋Š” ์ฒซ์ฃผ๋ผ ๊ทธ๋Ÿฐ์ง€ ๊ฐœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„๋ณด๋‹ค๋Š” ๊ทœ์น™์ด๋‚˜ ๊ณ„ํš์„ ๋…ผ์˜ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋งŽ์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๊ฐœ๋ฐœ์‹œ๊ฐ„์ด ๋งŽ์ง€ ์•Š์•„์„œ ํฌ๊ฒŒ ์ง„๋„๊ฐ€ ๋งŽ์ด ๋‚˜๊ฐ€์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์ฃผ์— ๋‚ด๊ฐ€ ๋งก์•˜๋˜ ์ปค์Šคํ…€ ๋‹ค์ด์–ผ๋กœ๊ทธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ธฐ๋กœํ–ˆ๋‹ค.

๋””์ž์ธ๋˜์–ด์žˆ๋Š” ๋‹ค์ด์–ผ๋กœ๊ทธ๋Š” ์ด 3๊ฐœ๋กœ ์ผ๋ฐ˜์ ์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ์™€ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋œ ๋‘๊ฐœ์˜ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ–ˆ๋‹ค.

๐Ÿ’ฌย ์ปค์Šคํ…€ ๋‹ค์ด์–ผ๋กœ๊ทธ ๊ตฌํ˜„

(๊ด€๋ จ pr)

์ฒ˜์Œ์—๋Š” ํ‰์†Œ์— ๋ฒ„ํŠผ์„ ์ปค์Šคํ…€ ํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž์™€ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

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์„ ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

  1. ๊ด€๋ก€์ ์œผ๋กœ dialog์— ๋งŽ์ด ์“ฐ์ด๋Š” ํŒจํ„ด์ด๋ผ ์ปค์Šคํ…€ ๋‹ค์ด์–ผ๋กœ๊ทธ์—๋„ ์ต์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ
  2. ์˜ต์…˜ ์„ค์ •๊ณผ์ •์ด ๊น”๋”ํ•ด์ง
  3. ๋นŒ๋”์™€ ๊ตฌํ˜„๋ถ€์˜ ์—ญํ• ์ด ๋‚˜๋‰˜๋ฉด์„œ ๋นŒ๋”๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋‹ค์ด์–ผ๋กœ๊ทธ ํด๋ž˜์Šค๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธํ•ด์ง

๐Ÿš€ Builder patten ์ ์šฉ

(๊ด€๋ จ pr)

๋นŒ๋” ํŒจํ„ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ํด๋ž˜์Šค ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜์˜€๋‹ค.

์ฒ˜์Œ์— ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ณด๋ฉด์„œ ์™œ 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์˜ ์กด์žฌ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋„˜์–ด๊ฐ”์„๊ฒƒ๊ฐ™๋‹ค.

์ด๋ฒˆ ๊ฒฝํ—˜์—์„œ ์ต์ˆ™ํ•จ์„ ๊ฒฝ๊ณ„ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ ์งˆ๋ฌธ์ด๋ผ๋Š”๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•ญ์ƒ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์Šค์Šค๋กœ ์งˆ๋ฌธํ•˜๊ณ  ๋‹ค๋ฅธ์‚ฌ๋žŒ์—๊ฒŒ๋„ ์กฐ์–ธ์„ ๊ตฌํ•ด์„œ ๋” ๋ฐœ์ „๋œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค!๐Ÿ˜Š

๐Ÿ’ป Projects

๐Ÿค Rules

โ˜€๏ธ Meetings

๐ŸŒต Reviews

1์ฃผ์ฐจ
2์ฃผ์ฐจ
3์ฃผ์ฐจ
4์ฃผ์ฐจ

๐ŸŒˆ Scrums

1์ฃผ์ฐจ
2์ฃผ์ฐจ
3์ฃผ์ฐจ
4์ฃผ์ฐจ

๐Ÿ›  Tech Posts & Mini seminar

๐Ÿ’ช๐Ÿผ [BE]

๐Ÿ›ค [FE]

๐Ÿ›ธ [AOS]


Clone this wiki locally