Single Activity Architecture
2012๋ ๋ถํฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ์์ํ๊ณ ๊ฐ์ฅ ๋ง์ด ๊ณต๋ถํ ๊ฒ์ดย Fragmentย ์ ๋ํ ๊ฒ์ด์์ต๋๋ค. ์ฒ์ ์์ํ๋ ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๊ทธ ๋๊ตฌ๋ผ๋ย ์๋๋ก์ด๋ 4๋ ์ปดํผ๋ํธ์ ๋ํด ์ด์ฌํ ๊ณต๋ถํ๊ฒ ์ง๋ง, ์ ๊ฐ ์ฒ์์ผ๋ก ๋ง๋ ์ฑ์ด ํฐ๋ฒ์ , ํ๋ธ๋ฆฟ๋ฒ์ ๋ฐ๋ก ๋๋ ํ๋ก๋ํธ์๋ ์ง๋ผ ๋๋ฌด๋๋ ์์ฐ์ค๋ฝ๊ณ ๋น์ฐํ๊ฒ Fragment์ ๋ํ ๊ณต๋ถ์ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ ํ ์ ํ์ฃ .
ํนํ๋ ํ๋ธ๋ฆฟ์์๋ ํ๋์ย Activity์ ์ฌ๋ฌ Fragment๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ์์ฃผ ํ์์ต๋๋ค. ํฐ ํ์์ ๋ณด๋ฉด ๋ค์ํ ๋๋ฐ์ด์ค๋ฅผ ์ง์ํ๋ ๊ฒ์ด ๊ฐ๋ฐ์๋ ๋์์ด๋์ ์ค๋ ฅ ํฅ์์๋ ๋งค์ฐ ์ข๊ณ ์ฌ์ฉ์ ์ธก๋ฉด์์๋ ์ด๋งํผ ์ข์๊ฒ ์์ด์ ์๋ฆ๋ค์ด ์ผ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ด๋ ๋ง์ ์ง์๊ณผ ๋์ ์๊ฐ ๊ทธ๋ฆฌ๊ณ ๋ง์ ์๊ฐ์ ์๊ตฌ๋ก ํ๋๋ฐ ์ฐ๋ฆฌ์๊ฒ ๊ทธ๋ฐ ๊ฒ๋ค์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์(ํนํ๋ ์๊ฐ์โฆ) ์๊ฐ์ด ํ๋ฅด๊ณ ์ฌ๋ฌ๊ฐ์ง ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ํ๋ธ๋ฆฟ์ ๋ํ ์ง์์ ์ ์ ๋ ๋ฉ์ด์ ธ ๊ฐ๊ฒ ๋์ต๋๋ค. (์ ํ๋ก์ ํธ ๋ง๋ค๋ฉดย values-w820dpย ์ด๋ฐ ํฐ ๊ธฐ๊ธฐ์ฉ ํด๋๋ถํฐ ์ง์ฐ๊ฒ ๋จ..) ๊ทธ๋์ ์์ฐ์ค๋ฝ๊ฒ ํ๋์ Activity์ ๋ ๊ฐ ์ด์์ Fragment๋ฅผ ๋ค๋ฃจ๋(ViewPagerย ๋นผ๊ณ )์ผ์ด ๋๋ฌผ์ด ์ก์ต๋๋ค.
์ ์ Activity๋ ๊ป๋ฐ๊ธฐ ์ฉ์ผ๋ก ์ฐ์ด๋ ๊ฑธ ๋๋ผ๊ฒ ๋ฉ๋๋ค. ์ฌ์ฉ์์ ์๊ตฌ, ๊ธฐํ์ ์ธ ์๊ตฌ์ฌํญ์ ์ํด์ ๊ฐ์ ํ๋ฉด์ ๋ค๋ฅธ ์ํฉ์์ ๋ค๋ฅด๊ฒ ๋ณด์ฌ์ค์ผ ๋ ์ผ์ด ๋๋ฌด๋ ๋ง๊ธฐ ๋๋ฌธ์ Fragment๋ฅผ ์ ์ธ ์๋ ์๊ณ โฆ ๊ฒฐ๊ตญ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ์กฐ๊ธ์ฉ ์๊ธฐ๊ธฐ ์์ํฉ๋๋ค.
public class UserActivity ... { public void onCeate() { Intent intent = getIntent(); id = intent.getExtra("id"); name = intent.getExtra("name"); profile = intent.getExtra("profile"); sattus = intent.getExtra("status"); addFragment( UserFragment.newInstance(id, name, profile, status); // or UserFragment.newInstance(intent.getExtras); } } }
public class UserFragment { public void onViewCreated() { Bundle args = getArgument() args.getLong("id"); args.getLong("name"); args.getLong("profile"); args.getLong("status"); } }
๊ฐ์ ์ผ์ ๋๋ฒํ๊ฑฐ๋ Bundle๊ฐ์ฒด๊ฐ ๋๋ฒ์ ๊ฑฐ์ณ ์ ๋ฌ๋๋ค๋๊ฐ ๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐ์ด ๋ค์์ง๋ง ํ๋์ ๋๋ฉ์ธ์ ๋ํ ํ๋ฉด์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ์๋ํ ์๋๋ก์ด๋ 1๋ ์ปดํผ๋ํธ๊ฐ ํฐ ์ผ์ํ๊ณ ๊ป๋ฐ๊ธฐ๋ก์ ๋ญ๋น๋๋ ๊ฒ์ด ์์ฐ๋ฌ์ ์ต๋๋ค. ์ด์ธ์๋ ํธ์ฌ๋ ์คํค๋ง๋ฅผ ํตํด์ ๋ค์์ Activity๋ฅผ ๋์์ผ ํ๋ ์ํฉ, ๋ค์ํ ํ๋ฉด Transition์ ๋ํ ์๊ตฌ๋ค ๋ฑ ๋๋ฌธ์
ํ๋ฉด์ ์ ํ์ ๋ด๋นํ๋ ํ๋์ Activity ์ ์ฌ๋ฌ๊ฐ์งย View์ ์กฐํฉ์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ย Single Activity Architectureย ์ ๊ด์ฌ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
Conductorย ?
View์ ์ญํ ์ Fragment๋ฅผ ๋์ ํ๋ ๋ฐฉ์์ผ๋ก ์์ ์ ํ๋ ค๋คย Single Activity Architectureย ๋ฅผ ์ํ ์ฌ๋ฌ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์ต๋๋ค. ๊ทธ์ค์ ํ๋๊ฐ ์ง๊ธ ๋ค๋ฃฐย Conductor๋ ๊ฒ์ธ๋ฐ์.ย GoogleSampleย ์์ ์ด๊ฒ์ย ์กด์ฌ๋ฅผ ์๊ฒ ๋ฉ๋๋ค. 3์๊ฐ ์์ฑํ๊ธด ํ์ง๋ง ๊ตฌ๊ธ์์ ์ ๊ณตํด์ฃผ๋ ์ํ๋ ์๊ฒ ๋ค ์ ์ ๋ ํฅ๋ฏธ๋ก์์ง๊ณ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฌ์ฉ์ ํด๋ณด๊ธฐ ์์ํฉ๋๋ค.
(! ์์ ๋ ๋์ธ Kotlin์ผ๋ก ์ฐ์ฌ์ง๋๋ค.)
class RouterActivity : AppCompatActivity() { lateinit var router : Router override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_router)
routSingle Activity Architecture ?
2012๋ ๋ถํฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ์์ํ๊ณ ๊ฐ์ฅ ๋ง์ด ๊ณต๋ถํ ๊ฒ์ด Fragment ์ ๋ํ ๊ฒ์ด์์ต๋๋ค. ์ฒ์ ์์ํ๋ ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๊ทธ ๋๊ตฌ๋ผ๋ ์๋๋ก์ด๋ 4๋ ์ปดํผ๋ํธ์ ๋ํด ์ด์ฌํ ๊ณต๋ถํ๊ฒ ์ง๋ง, ์ ๊ฐ ์ฒ์์ผ๋ก ๋ง๋ ์ฑ์ด ํฐ๋ฒ์ , ํ๋ธ๋ฆฟ๋ฒ์ ๋ฐ๋ก ๋๋ ํ๋ก๋ํธ์๋ ์ง๋ผ ๋๋ฌด๋๋ ์์ฐ์ค๋ฝ๊ณ ๋น์ฐํ๊ฒ Fragment์ ๋ํ ๊ณต๋ถ์ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ ํ ์ ํ์ฃ .
ํนํ๋ ํ๋ธ๋ฆฟ์์๋ ํ๋์ Activity์ ์ฌ๋ฌ Fragment๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ์์ฃผ ํ์์ต๋๋ค. ํฐ ํ์์ ๋ณด๋ฉด ๋ค์ํ ๋๋ฐ์ด์ค๋ฅผ ์ง์ํ๋ ๊ฒ์ด ๊ฐ๋ฐ์๋ ๋์์ด๋์ ์ค๋ ฅ ํฅ์์๋ ๋งค์ฐ ์ข๊ณ ์ฌ์ฉ์ ์ธก๋ฉด์์๋ ์ด๋งํผ ์ข์๊ฒ ์์ด์ ์๋ฆ๋ค์ด ์ผ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ด๋ ๋ง์ ์ง์๊ณผ ๋์ ์๊ฐ ๊ทธ๋ฆฌ๊ณ ๋ง์ ์๊ฐ์ ์๊ตฌ๋ก ํ๋๋ฐ ์ฐ๋ฆฌ์๊ฒ ๊ทธ๋ฐ ๊ฒ๋ค์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์(ํนํ๋ ์๊ฐ์โฆ) ์๊ฐ์ด ํ๋ฅด๊ณ ์ฌ๋ฌ๊ฐ์ง ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ํ๋ธ๋ฆฟ์ ๋ํ ์ง์์ ์ ์ ๋ ๋ฉ์ด์ ธ ๊ฐ๊ฒ ๋์ต๋๋ค. (์ ํ๋ก์ ํธ ๋ง๋ค๋ฉด values-w820dp ์ด๋ฐ ํฐ ๊ธฐ๊ธฐ์ฉ ํด๋๋ถํฐ ์ง์ฐ๊ฒ ๋จ..) ๊ทธ๋์ ์์ฐ์ค๋ฝ๊ฒ ํ๋์ Activity์ ๋ ๊ฐ ์ด์์ Fragment๋ฅผ ๋ค๋ฃจ๋(ViewPager ๋นผ๊ณ )์ผ์ด ๋๋ฌผ์ด ์ก์ต๋๋ค.
์ ์ Activity๋ ๊ป๋ฐ๊ธฐ ์ฉ์ผ๋ก ์ฐ์ด๋ ๊ฑธ ๋๋ผ๊ฒ ๋ฉ๋๋ค. ์ฌ์ฉ์์ ์๊ตฌ, ๊ธฐํ์ ์ธ ์๊ตฌ์ฌํญ์ ์ํด์ ๊ฐ์ ํ๋ฉด์ ๋ค๋ฅธ ์ํฉ์์ ๋ค๋ฅด๊ฒ ๋ณด์ฌ์ค์ผ ๋ ์ผ์ด ๋๋ฌด๋ ๋ง๊ธฐ ๋๋ฌธ์ Fragment๋ฅผ ์ ์ธ ์๋ ์๊ณ โฆ ๊ฒฐ๊ตญ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ์กฐ๊ธ์ฉ ์๊ธฐ๊ธฐ ์์ํฉ๋๋ค.
public class UserActivity ... { public void onCeate() { Intent intent = getIntent(); id = intent.getExtra("id"); name = intent.getExtra("name"); profile = intent.getExtra("profile"); sattus = intent.getExtra("status"); addFragment( UserFragment.newInstance(id, name, profile, status); // or UserFragment.newInstance(intent.getExtras); } } public class UserFragment { public void onViewCreated() { Bundle args = getArgument() args.getLong("id"); args.getLong("name"); args.getLong("profile"); args.getLong("status"); } }
๊ฐ์ ์ผ์ ๋๋ฒํ๊ฑฐ๋ Bundle๊ฐ์ฒด๊ฐ ๋๋ฒ์ ๊ฑฐ์ณ ์ ๋ฌ๋๋ค๋๊ฐ ๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐ์ด ๋ค์์ง๋ง ํ๋์ ๋๋ฉ์ธ์ ๋ํ ํ๋ฉด์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ์๋ํ ์๋๋ก์ด๋ 1๋ ์ปดํผ๋ํธ๊ฐ ํฐ ์ผ์ํ๊ณ ๊ป๋ฐ๊ธฐ๋ก์ ๋ญ๋น๋๋ ๊ฒ์ด ์์ฐ๋ฌ์ ์ต๋๋ค. ์ด์ธ์๋ ํธ์ฌ๋ ์คํค๋ง๋ฅผ ํตํด์ ๋ค์์ Activity๋ฅผ ๋์์ผ ํ๋ ์ํฉ, ๋ค์ํ ํ๋ฉด Transition์ ๋ํ ์๊ตฌ๋ค ๋ฑ ๋๋ฌธ์
ํ๋ฉด์ ์ ํ์ ๋ด๋นํ๋ ํ๋์ Activity ์ ์ฌ๋ฌ๊ฐ์ง View์ ์กฐํฉ์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ Single Activity Architecture ์ ๊ด์ฌ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
Conductorย ?
View์ ์ญํ ์ Fragment๋ฅผ ๋์ ํ๋ ๋ฐฉ์์ผ๋ก ์์ ์ ํ๋ ค๋ค Single Activity Architecture ๋ฅผ ์ํ ์ฌ๋ฌ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์ต๋๋ค. ๊ทธ์ค์ ํ๋๊ฐ ์ง๊ธ ๋ค๋ฃฐ Conductor๋ ๊ฒ์ธ๋ฐ์. GoogleSample์์ ์ด๊ฒ์ ์กด์ฌ๋ฅผ ์๊ฒ ๋ฉ๋๋ค. 3์๊ฐ ์์ฑํ๊ธด ํ์ง๋ง ๊ตฌ๊ธ์์ ์ ๊ณตํด์ฃผ๋ ์ํ๋ ์๊ฒ ๋ค ์ ์ ๋ ํฅ๋ฏธ๋ก์์ง๊ณ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฌ์ฉ์ ํด๋ณด๊ธฐ ์์ํฉ๋๋ค.
(! ์์ ๋ ๋์ธ Kotlin์ผ๋ก ์ฐ์ฌ์ง๋๋ค.)
class RouterActivity : AppCompatActivity() { lateinit var router : Router override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_router) router = Conductor.attachRouter(this, container, savedInstanceState) if(!(router.hasRootController())) { router.setRoot(RouterTransaction.with(MainController())) } } override fun onBackPressed() { if (!router.handleBack()) { super.onBackPressed() } } }
์ฌ๋ฌ๊ฐ์ง ํ๋ฉด์ ๋ค๋ฃจ๋ Router ์ฉ Activity ๊ตฌ์ฑ์ด ๋๋ฌ์ต๋๋ค. ์ฝ๊ฒ ์๋ฅผ๋ค๋ฉด Fragment๋ Activity์ ๋์ฒด์ ๋ก Controller๋ผ๋ ๋ ์์ด ์ฐ์ด๊ฒ ๋๋๋ฐ์. ์ ์ฝ๋๋ฅผ ๋ณดํต ๋ฐฉ์์ผ๋ก ์นํํ๋ฉด SplashActivity(LauncherActivity)์์ MainActivity ๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋๊ฒ ์ต๋๋ค.
class MainController : Controller() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View { val view = inflater.inflate(R.layout.controller_main, conatiner, false) view.aButton.setOnClickListener { router.pushContrller(RouterTransaction.with(AController()) } view.bButton.setOnClickListener { router.popContrller(RouterTransaction.with(AController()) } view.cButton.setOnClickListener { getChildRouter(view.conatiner).pushContrller(RouterTransaction.with(CController()) } return view } }
Controller๋ Router์ ์ ๊ทผํด์ ๋ค๋ฅธ Controller๋ฅผ ๋ณด์ฌ์ค ์๋ ์๊ณ (Activity๊ฐ ๋ค๋ฅธ Activity๋ฅผ ํธ์ถํ๋ฏ), ViewGroup์ ํตํด ์๋ก์ด Router๋ฅผ ๋ง๋ค์ด์ ์์ Controller๋ฅผ ๋ณด์ฌ์ค ์๋ ์์ต๋๋ค.(Activity์์ Fragment๋ฅผ ๋ณด์ฌ์ฃผ๋ฏ) ์ ๋ฐ์ ์ธ ๋ฉ์๋ ๋ค์ด๋ฐ์ ๋ณด๋ฉด FragmentTransaction ์์ ์ ๊ณตํ๋ add, remove, show ๋ฑ๋ฑ๋ฑ ๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก๋ Activity์ Fragment์ ํน์ฑ์ ์ ๋ถ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด Controller๋ผ๊ณ ํ ์ ์๊ฒ ์ต๋๋ค.
Activity์ Fragment์ ๊ฒฝ๊ณ๋ฅผ ํ๋ฌผ๊ณ ํ๋ฉด์ ๋ํ ๋์์ธ์ด ๋์ค๊ณ ๊ฐ๋ฐ์ ์์ํ ๋ Activity๋ก ํ ์ง Fragment๋ก ํ ์ง ๊ณ ๋ฏผํ์ง ์์๋ ๋์ด์ ์ด๊ฒ์ผ๋ก Single Activity Architecture๋ฅผ ๊ตฌํํ๋ฉด ๋๊ฒ ๊ตฌ๋ ํ์ต๋๋ค๋ง, ์ ๋๋ก ์์ฐ์ฑ์๊ฒ ์ฌ์ฉํ ๋ผ๋ฉด ๋ช๊ฐ์ง ๊ณตํต ๋ฉ์๋ ๋ค์ ์ถ์ํ ์ํค๊ณ ์จ์ผ ํ ํ ๋ฐ ์ด๋ ๊ฒ ๋๋ฉด ๋์ฒด Fragment์ ๋ค๋ฅธ ์ ์ด ๋ญ๊ฐ ์ถ์ด์ง๋๋ค. ๊ทธ๋์ ๊ฐ๋ฐํ๋ ๋ง์ ํ๋ก๋ํธ๋ค ๊ฑฐ์ ์ ๋ถ BaseFragment, BaseActivity๋ค ๋ง๋ค์ด์ ๋ฐฑ๋ฒํผ์ ๋ํ ์ ์ด, FragmentTransaction.add, remove, replace, show, hide ๋ฑ์ ์ถ์ํํด์ ์ฌ์ฉํ๋๋ฐ ๊ตณ์ด Conductor ๋ด์ ๋ผ์ดํ์ฌ์ดํด, ๋ฉ์๋ ๋ฑ์ ๊ณต๋ถํ ํ์๊ฐ ์๋๊ฐ?
์ผ๋จ ๋ ๊ฐ์ง๋ฅผ Conductor๋ฅผ ์ฐ๊ธฐ ์ํ ํฉ๋ฆฌํ๋ก ๋ฝ์๋๋ฐ์. ์ฒซ๋ฒ์งธ๋ ์์ ๋ก์ด ํ๋ฉด Transition ๊ตฌํ์ ๋ํด์ Conductor๊ฐ ํจ์ฌ ์ฝ๋ค๋ ์ . Conductor์์๋ ํ๋ฉด ์ ํ์ ํ์ํ ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค ControllerChangeHandler๋ผ๊ณ ์ ์ํ๊ณ ์๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ChangeHandler๋ ์์ฒญ ๋ง์ด ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ธ๊ฒ ์ธ์ ํ์ฉ๊ฐ๋ฅํ ChanglHandler๋ค
์๋ก์ด ํ๋ฉด ์ง์ ์ ์๋์ ์๋ก, ์ด์ ํ๋ฉด์ผ๋ก ๋์๊ฐ์ ์์์ ์๋๋ก ์ ๋๋ฉ์ด์ ๋๋ Transition ์ค์ router.pushController(RouterTransaction.with(UserController()) .pushChangeHandler(VerticalChangeHandler()) .popChangeHandler(VerticalChangeHandler()))
๋๋ฒ์งธ๋ ๊ธฐ์กด ์ถ์ํ๋ ํด๋์ค๋ค์ ๋ ๊น์ด์๊ฒ(์ํ์ ์ฅ ๋ฑ) ์ฌ์ฉํ๊ธฐ ์ํด ์์ ํด์ผ ํ๋๋ฐย , Conductor์๋ ์ด๋ฏธ ๊ตฌํ๋์ด ์๋ ๊ฒ๋ค์ด ๋ง๋ค.
์ด ๋ ๊ฐ์ง ์ด์ ๋ฅผ ๋ค์ด ์๋ก์ด ํ๋ก์ ํธ์ ์ ์ฉ์ํค๊ณ ์๋๋ฐ์. ์กฐ๊ธ ๋ถ์ ์ ์ด์ง๋ง ์๋์ ๊ฐ์ ๊ฒฐ๋ก ๋ ๋์ถ ํ ์ ์์์ต๋๋ค.
Activity, Fragment ์ด๊ฒ๋ค๊ณผ ๊ด๋ จํ ์ฌ๋งํ ์ด์๋ค์ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ค์ ๊ธ๋ฐฉ ์ฐพ์ ์ ์๊ณ , ์ด๋์ ๋ ๋ ธํ์ฐ๊ฐ ์๊ฒจ์ ์๋๋ก์ด๋ 4๋ ์ปดํผ๋ํธ ์์ ์ํ ์ด ๋์ ์ฌ์ฉํ๋ ๊ฒ์ ์๊ตฌ์ฌ์ด ์๋ค๋ฉด ๊ตณ์ด Conductor๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
์ ๋๋ค. Conductor ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฑท๊ณ ๋ค์ ๋์๊ฐ๋๋ฐ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์์ โ๋ด๊ฐ ์ง๊ธ ์ ์ฌ์ ๊ณ ์์ ํ๊ณ ์๋๊ฐ, ๋นจ๋ฆฌ ๊ฑท์โ ๋ผ๊ณ ์๊ฐํ๋ฉด์๋ ์ด์ํ๊ฒ ๊ณ์ ์ฐ๊ฒ ๋๋๋ฐ์. ๋์ด์ผ๋ณด๋ฉด ์ ๊ฐ ๊ฐ์ง ๋ถ์ ์ ์ธ ํฌ์ธํธ๋ค์ด Conductor ์ ๋ํ ๊ฒ์ด ์๋๋ผ Single Activity Architecture๋ฅผ ํฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ์ ๊ณ ์์ด๊ฑฐ๋ ๊ณ ๋ฏผ์ค์ธ ํฌ์ธํธ ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Theme ์ง์ - ๋จ์ผ Activity๊ฐ ์๋๋ผ๋ฉด styles.xml์ ๊ฐ Activity๋ง๋ค ํ์๋ก ํ๋ ์์๊ฐ๊ณผ ๊ฐ์ ํ๋ฉด์ฑ๊ฒฉ์ ๊ธฐ์ ํด ๋์ผ๋ฉด ์ฝ๊ฒ ์ ์ฉ ๊ฐ๋ฅํ๋ฐ, Single Activity Architecture๋ฅผ ์ ์ฉ์ํค๋ฉด ํ๋ ํ๋์ View๋ง๋ค ์ผ์ผํ theme ์ค์ ์ด ํ์ํจ.
StatusBar - 1๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ ํ๋ฉด๋ง๋ค ํ์ํ ์ํ๋ฐ ๊ด๋ จ ์ค์ ๋ค์ ์ฝ๊ฒ ํ์ง ๋ชปํ๋ค. ์์๊ฐ์ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค ํ๋๋ผ๋ ์ด๋ค ํ๋ฉด์์๋ ์์ ์ค๋ฒ๋ ์ด๋ ์ํ๋ฐ๊ฐ ํ์ํ๊ณ ์ด๋ค ํ๋ฉด์ ๋ถํฌ๋ช ์ผ๋ก ์ค๋ฒ๋ ์ด๋ ์ํ๋ฐ๊ฐ ํ์ํ ๋, ์ ์ฐํ๊ฒ ์ ์ฉ์ํค๊ธฐ ์ด๋ ต๋ค. (RouterActivity๋ฅผ ์์ ์ค๋ฒ๋ ์ด ์์ผ๋๊ณ ๊ฐ Controller ์์ ๋์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํํผ ์ค)
SoftInput - ํค๋ณด๋๊ฐ ์ฌ๋ผ์ด์ ๋ฐ๋ผ ์ด๋ค ํ๋ฉด์์ resize ๊ฐ ์๊ตฌ๋๊ณ ์ด๋ค ํ๋ฉด์์ ํ์ฌ ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์๊ตฌ๋๋ ๊ฒฝ์ฐ๋ ์๊ธธํ ๋ฐ, ์ด๊ฒ๋ ์ ์ฐํ๊ฒ ๋์ํ๊ธฐ ํ๋ค ๋ฏ(๋๋ถ๋ถ์ ๊ฒฝ์ฐ resize ๊ฐ ์๊ตฌ๋๊ธฐ ๋๋ฌธ์ ์ดโฆ์โฆ)
Kotlin - Kotlin์ ๋ฉ์ธ ์ธ์ด๋ก ์ฌ์ฉ์ค์ธ๋ฐ android-extensions๋ anko๋ฑ์ด Activity,Fragment์์ ํธ๋ฆฌํ ๋ฉ์๋๋ค์ ์ ๊ณตํด์ฃผ๊ณ ์๋๋ฐ, Conductor๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ทธ ์ข์ ๋ฉ์๋๋ค์ ์ฌ์ฉํ๋๋ฐ ์ ์ฝ์ฌํญ์ด ์๊ธธ ์ ๋ฐ์ ์์.
๊น๋๊ธฐ. Learning curve - ๊ทธ๋ ๊ฒ๊น์ง ๋๋ค๊ณ ์๊ฐ๋์ง ์์ง๋ง, ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ์์ ๊ฐ์ฅ ์ค์ํ ํ๋ฉด์ ์ ์ดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ ๋งํผ Conductor์ ๋ผ์ดํ์ฌ์ดํด ์ด๋ ๋ฉ์๋๋ค์ ๊ณต๋ถํ ํ์๊ฐ ์์
์ด ์ ๋๋ฅผ ๋จ์ ์ผ๋ก ๊ผฝ๊ณ ์๋๋ฐ์. ์ด ๋จ์ ๋ค์ด Activity์ Task ์ Stack ์ ๋ํ ๊ณ ๋ฏผ์ ํด์ํด์ฃผ๊ณ , ํ๋ฉด์ ๋ํ ๊ตฌ์ฑ์ ํ๋์ ๊ฐ๋ ์ผ๋ก ํต์ผํํด์ ๊ฐ๋ฐํ๊ณ , ๋ฌด๋ถ๋ณํ Activity ์ฌ์ฉ์ผ๋ก ์ธํ ๋ณต์ก๋๋ฅผ ์ค์ฌ์ฃผ๋ ๋ฑ์ ์ฅ์ ๋ค์ ์์ํ ๋งํผ์ผ๋ก ๋ณด์ด์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก๋ ์ถฉ๋ถํ ์๋ํด๋ณผ๋งํ ๊ฐ์น๋ ์๋ค๋ผ๊ณ ํ๋จํ๊ณ ์์ต๋๋ค.
์ค์ํ ๊ฒ์ ๊ฐ๋ฐ๊ณผ ๊ด๋ จ๋ ์ด๋ค ์ธ์ด, ์ด๋ค ๊ฐ๋ , ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ ์ฅ๋จ์ ์์ผ๋, ๋งน๋ชฉ์ ์ด์ง ์๊ณ ์ ์ฐํ ์ฌ๊ณ ๋ฅผ ํ๋ ๊ฒ์์ ์ธ์งํ๊ณ , ๋ฉ๋๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด ์๋ ํํผ๋ก์ง์ ๋ง๋ค ๋๋ โ๋จ์ผโ ์ด๋ ๊ฐ๋ ์ ์๊ฐํ์ง ์๋๋ก ํด์ผ๊ฒ ์ฃ .
Conductor์ ํจ๊ปํ๋ Single Activity Architecture ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๊ณ์ ๋ ๊ฒ์ด๊ณ , ๊ฒฐ๊ณผ๋ฌผ์ด ๋์จ ํ ํ๊ณ ์ ๋ํ ๋ธ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋๋ก ํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
ps. ์์ฆ ์ฌ์ฉ์ค์ธ BasePage, Controller๋ผ๋ ์ด๋ฆ์ด ๋ฏ์ค๊ณ , MVP ํจํด ์ด์ฉ์ค์ ๋ค์ด๋ฐ์ด ์ข ๊ฒน์ณ์ Page๋ก ํ๋ฉด๋จ์ ๋ค์ด๋ฐ ์ค์ ๋๋ค.














