Home [Android] Clean Architecture
Post
Cancel

[Android] Clean Architecture

๐Ÿค”ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ž€?

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋Š” ใ€Žํด๋ฆฐ ์ฝ”๋“œ(Clean Code)ใ€๋ฅผ ์ €์ˆ ํ•œ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด(Robert C.Martin)์ด ์ œ์•ˆํ•œ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜๋กœ, ๊ธฐ์กด์˜ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ฐ€์ง€๋˜ ์˜์กด์„ฑ์—์„œ ๋ฒ—์–ด๋‚˜๋„๋ก ํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค. ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด์€ ๊ฒฝ๊ณ„์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•œ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋Š” ์„ ์„ ๊ธ‹๋Š” ๊ธฐ์ˆ ์ด๋ฉฐ, ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์„ ์„ ๊ฒฝ๊ณ„(boundary)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ฒฝ๊ณ„๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋ฅผ ์„œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฒฝ๊ณ„ ํ•œํŽธ์— ์žˆ๋Š” ์š”์†Œ๊ฐ€ ๋ฐ˜๋Œ€ํŽธ์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๋Š”๋‹ค. Robert C. Martin, Clean Architecture

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฒฝ๊ณ„๋Š” ๊ณ„์ธต์„ ๋งํ•œ๋‹ค.

๊ทธ๋Ÿผ ๊ณ„์ธต์ด ๋ฌด์—‡์ผ๊นŒ?

</img>

์‚ฌ์ง„์„ ๋ณด๋ฉด ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ์˜์—ญ์„ ์„ธ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์žˆ๋‹ค.

๋„๋ฉ”์ธ ๊ณ„์ธต(Domain Layer)

์•ฑ์˜ ์ค‘์‹ฌ๋ถ€๋กœ์จ ์ด ๊ณ„์ธต์— ํฌํ•จ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์•ฑ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ง์ณ์„œ๋Š” ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ณ„์ธต์€ ์–ด๋– ํ•œ ๊ณ„์ธต์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค. Domain ๊ณ„์ธต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค.

  • Entity : ํŠน์ • ์˜์—ญ์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด. ex) Pojo, VO, DTO ๋“ฑ
  • UseCase : Entity์™€ ํ•จ๊ป˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • Repository ์ธํ„ฐํŽ˜์ด์Šค : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์›๊ฒฉ ์„œ๋ฒ„์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ์ ‘๊ทผํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ๊ณ„์ธต(Data Layer)

Data ๊ณ„์ธต์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค(DB, ์„œ๋ฒ„ ๋“ฑ)์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ณณ์ด๋‹ค. Data ๊ณ„์ธต์€ Domain ๊ณ„์ธต์— ์˜์กดํ•œ๋‹ค.

์•ฑ์€ ์•„๋งˆ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ํ…๋ฐ, ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋˜ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด REST ์„œ๋ฒ„๋ฅผ GraphQL ์„œ๋ฒ„๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” Realm DB๋ฅผ RoomDB๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์˜ค๋กœ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๊ด€๋ จ๋œ ๋กœ์ง์ผ ๋ฟ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์ฝ”๋“œ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

Data ๊ณ„์ธต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์ฑ…์ž„์„ ๊ฐ–๋Š”๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๊ณ„์ธต์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์†Œ์Šค๋“ค๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๋‹ค๋ฅธ ๊ณ„์ธต๊ณผ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋‘”๋‹ค.

Data ๊ณ„์ธต์—์„œ๋Š” Domain ๊ณ„์ธต์—์„œ ์ •์˜ํ•œ Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. </img> ๊ทธ๋ฆผ์„ ๋ณด๋ฉด Domain๊ณผ Data๊ฐ„์˜ ๋ถ„๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ˜น์‹œ๋‚˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ Domain ๊ณ„์ธต์—๋Š” ์˜ํ–ฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ํ”ผํ•ด์—†์ด ์•ˆ์ „ํ•˜๋‹ค.

ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต(Presentation Layer)

Presentation ๊ณ„์ธต์€ Domain, Data ๊ณ„์ธต์— ์˜์กดํ•˜๊ณ  UI์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค. ๋ชจ๋“  UI์™€ ๊ด€๋ จ๋œ ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ์ด ๊ณ„์ธต์—์„œ ๋‹ค๋ฃจ๊ฒŒ ๋œ๋‹ค.


๊ณ„์ธต์„ ํšก๋‹จํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๋‚ด๋ถ€์˜ ์›์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ฒ„์— ์ €์žฅ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•ด๋ณด์ž.

  • ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • Domain ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” User๋ผ๋Š” ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
  • Presentation ๊ณ„์ธต์—์„œ View์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚  ๋•Œ๋Š” UserUiModel๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
  • Data ๊ณ„์ธต์—์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต๋ฐ›์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” UserDto๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐฑ์‹  API ํ˜ธ์ถœ์„ ์œ„ํ•ด Activity์—์„œ ์œ ์ฆˆ์ผ€์ด์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ UserUiModel์€ User๋กœ ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ Retrofit์„ ํ†ตํ•ด API์š”์ฒญ์— ๋”ฐ๋ฅธ ์‘๋‹ต UserDTO๋ฅผ ๋ฐ›์•˜๊ณ , ์ด๋ฅผ ๋‹ค์‹œ ์œ ์ฆˆ์ผ€์ด์Šค๋กœ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” User๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ํ๋ฆ„์ด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์ผ ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ Mapper๋ผ๊ณ  ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.

์ฐธ์กฐ https://www.charlezz.com/?p=45391 https://velog.io/@ashwon1218/Android-Clean-Architecture

This post is licensed under CC BY 4.0 by the author.

[TIL] 2022-11-03

[TIL] 2022-11-04