-
@abstractmethod๋ฅผ ํตํ SOLID ์์น ์ ์ฉํ๊ธฐProgramming Language/Python 2022. 2. 27. 17:06
๐ ๊ฐ์
db์๋ ์ฌ๋ฌ ์ข ๋ฅ์ table์ด ์กด์ฌํ๋ค.
์๋น์ค์ business layer์์๋ ํ์์ ๋ฐ๋ผ ๊ฐ table์ ์ ๊ทผํ์ฌ query๋ฅผ ์ํํด์ผ ํ ๊ฒ์ด๋ค.ORM๊ฐ์ ํ๋ ์์ํฌ ํด์ ์ฌ์ฉํ์ง ์๊ณ raw query๋ฅผ ์ ๋ถ ์ ์ธํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ด query๋ค์ ์ด๋ป๊ฒ ์์ฑํ๋๊ฒ ์ข์๊น?
์ ๋ถ ํ๋์ class์ method๋ก์ ์ ์ธํ๊ธฐ? create, update๋ฑ ์ฉ๋์ ๋ฐ๋ผ ๋ถ๋ฆฌํ๊ธฐ?entity, interface, repository, ๊ฐ๊ฐ layer๋ฅผ ์ถ์ํํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ๋ด๊ฐ ๊ทธ๋ฆฌ๊ณ ์ ํ๋ ํ์ด์ architecture๊ฐ ์ด๋ค ๋ชจ์ต์ด์๋์ง ๊ธฐ๋กํด๋ณด๋ ค ํ๋ค.
๐ SOLID ์์น: ๊ฐ์ฒด์งํฅ์ค๊ณ 5์์น
๋ก๋ฒํธ ๋งํด์ด 2000๋ ๋ ์ด๋ฐ์ ๋ช ๋ช ํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐ ์ค๊ณ์ ๋ํ 5์์น์ด๋ค. ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์น์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
SRP ๋จ์ผ ์ฑ ์ ์์น (Single Responsibility Principle) ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค OCP ๊ฐ๋ฐฉ-ํ์ ์์น (Open-Closed Principle) ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liskov Substitution Principle) ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ณ๊ฒฝํ ์ ์์ด์ผ ํ๋ค ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface Segregation Principle) ํด๋์ค๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กดํ์ง ์์์ผ ํ๋ค DIP ์์กด๊ด๊ณ ์ญ์ ์์น (Dependency Inversion Principle) ๊ตฌ์ฒดํ๊ฐ ์๋ ์ถ์ํ์ ์์กดํด์ผ ํ๋ค ๐ ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(ISP)๋?
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(ISP, Interface Segregation Principle)์ด๋,
ํ๋์ ํด๋์ค(์ธํฐํ์ด์ค)๋ ๊ทธ '์ฑ ์'์ ์ ํฉํ ๋ฉ์๋๋ง์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค๋ ์์น์ด๋ค.
์๋ฅผ ๋ค์ด๋ณด์. ์ด ํด๋์ค์๋ config์ user. ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ table์ ์ ๊ทผํ๋ method๋ค์ด ์ ์ธ๋์ด ์๋ค.์ด ๊ฒฝ์ฐ, ์ฐ์ ์ ์ผ๋ก ํ์ํ config์ ๋ํ query method ๋ฟ๋ง ์๋๋ผ, config์ ๋ฌด๊ดํ user์ ๋ํ method๊น์ง ๊ตฌํํด์ผ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฆ, ์์ ์ด ์ด์ฉํ์ง ์๋ method์ ์์กดํ๋ ๋ชจ์ต์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ฌผ๋ก ๊ตฌํํ์ง ์๊ณ , ์ ์์ ์ฒ๋ผ pass๋ก ๋๋ ค๋ฒ๋ ค๋ ์๋ฌ๋ฅผ ๋ฑ์ง ์์ง๋ง.. ISP๋ฅผ ์ค์ํ๋ค๊ณ ๋ณผ ์๋ ์๋ค.๋ ๊ฐ์ ํด๋์ค๋ก ์ฑ ์์ ๋ถ๋ฆฌํด์ฃผ์๋ค. ์ฐ๋ฆฌ๋ ์ด์ table์ ๋ํ ๋ ๋ฆฝ์ ์ธ query class๋ฅผ ๊ตฌํํ ์ ์๊ฒ ๋์๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์์ง ๋ง์์ผ ํ ํฌ์ธํธ๋,
ISP๋ ํ๋์ interface์ ํ๋์ '๊ธฐ๋ฅ(method)'๋ง ์กด์ฌํด์ผ ํ๋ค๋ ๊ฒ์ด ์๋๋ผ, ํ๋์ '์ผ(TASK)'๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ชจ๋ '๊ธฐ๋ฅ(method)'๊ฐ ํฌํจ๋๋๋ก ๊ตฌ์ฑ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.๐ abc.ABCMeta๋ฅผ ํตํด ์ถ์ ํด๋์ค ์ ์ธํ๊ธฐ
๊ทธ๋ ๋ค๋ฉด ์ด์ ์์์ ์ ์ธํ ํด๋์ค๋ฅผ ์ถ์ํ์์ผ์ interface๋ก์ ๋์ํ๋๋ก ๋ง๋ค์ด๋ณด์.
interface๋ก์ ๋์ํ ์ถ์ ํด๋์ค์ entity์ ์ข ์์ ์ธ query method๋ค์ ์ถ์ ๋ฉ์๋๋ก ์ ์ธํด์ค ๊ฒ์ด๋ค.ABCMeta
๋ ํ์ด์ ์์ ์ง์ํ๋ ์ถ์ metaclass์ด๋ค.
์์ฑํ ์ถ์ ํด๋์ค์metaclass=abc.ABCMeta
๋ฅผ ์ง์ ํ๊ณ ,@abstractmethod
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ถ์ฌ์ ์ถ์ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.๐ ์ถ์ ํด๋์ค(interface)๋ฅผ ์์ํ๋ ๊ตฌํ ํด๋์ค ์์ฑํ๊ธฐ
interface๋ฅผ ์์ํ๋ repository๋ฅผ ๊ตฌํํ๊ณ ,
โ๏ธ ์์ค์ฝ๋
ํ๋ก๊ทธ๋จ์ main์์ ์ด repository ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ service layer์์๋ ์ด ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ค.
์ฆ ํ๋ก๊ทธ๋จ์์, ํด๋น entity์ ๋ํด ์กด์ฌํ๋ '์ ์ผํ' repository๋ก์ ๋์ํ๋๋ก ํ๋ ๊ฒ์ด๋ค.์๋ฅผ ๋ค์ด๋ณด์.
๋ด๊ฐ config table์ ์ ๊ทผํ์ฌ, ๊ฐ์ ์์ ํ๋ update method๋ฅผ ์ํํ๊ณ ์ถ๋ค๋ฉด?
๋ฐ๋์database.config_repository.__method__
๋ฅผ ํตํด์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ค์ ๋ก ์ด update์ ๊ด๋ จ๋__method__
์์ ์ด๋ค ๋์๋ค์ด ์ํ๋๋์ง๋ ์ method๋ช ์ผ๋ก ์ถ์ํ๋์ด ์๊ธฐ ๋๋ฌธ์ service layer๋จ์์ ๋ณผ ์ ์๋ค.์๋ ์์ค์ฝ๋ ์์์ฒ๋ผ ์ ๊ทผํ์ฌ ์ฌ์ฉํ์๋ค.
์ํคํ ์ณ์ ๊ด์ฌ์ด ๋ง์์ ์ฑ ์ด๋ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๊ณ , ํผ์ ์ด์ฌํ ๊ณ ๋ฏผํ๋ฉฐ ์ฝ๋๋ฅผ ๊ตฌ์ํ๊ณ ๋๋ฆ์ ๊ธฐ์ค์ ๊ฐ์ง๊ณ ์ค๊ณํ๋ค.
ํผ์ A๋ถํฐ Z๊น์ง ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ณธ๊ฒ ์ฒ์์ด๋ผ..๐คฏ ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ ์ฆ๊ฐ์ํค๊ณ ์ ๊ทผ์ฑ์ ์ฉ์ดํ๊ฒ ํ์ ๋ผ๋ ์๊ฐ์์ ์์๋ ์ํคํ ์ณ ์ค๊ณ๊ฐ ์คํ๋ ค ๋จ์ํ ์ฝ๋๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ๊ฒ์ ์๋๊น ๊ณ ๋ฏผํ๊ธฐ๋ ํ๋ค.๊ณ์ ์ค์ค๋ก์๊ฒ ๋์ก๋ ์ง๋ฌธ์ด๋ค.
"What do we get for this? And what does it cost us?
๐ Reference
'Programming Language > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ด์ ์ isinstance ํ์ฉํ๊ธฐ (1) 2021.12.29