๐คํด๋ฆฐ ์ํคํ ์ฒ๋?
ํด๋ฆฐ ์ํคํ ์ฒ๋ ใํด๋ฆฐ ์ฝ๋(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