728x90

Python์—์„œ DAO, DTO, VO๋ž€? ๊ฐœ๋…๊ณผ ์˜ˆ์ œ

Python์„ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๊ตฌ์กฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋””์ž์ธ ํŒจํ„ด๊ณผ ๊ฐ์ฒด ์œ ํ˜•์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ DAO(Data Access Object), DTO(Data Transfer Object), VO(Value Object)์™€ ๊ฐ™์€ ๊ฐœ๋…์ด ์ž์ฃผ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ฐœ๋…๊ณผ ํŠน์ง•, ๊ทธ๋ฆฌ๊ณ  Python์—์„œ์˜ ๊ตฌํ˜„ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. DAO (Data Access Object)

DAO๋ž€?

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

DAO์˜ ์—ญํ• 

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฐ ์ข…๋ฃŒ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • CRUD ์ž‘์—… ๊ด€๋ฆฌ: Create, Read, Update, Delete์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌ: ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ๊ด€๋ฆฌ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

Python์—์„œ DAO ๊ตฌํ˜„ ์˜ˆ์ œ

์•„๋ž˜๋Š” User ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” UserDAO ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” SQLite๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

import sqlite3

class UserDAO:
    def __init__(self, db_name):
        self.db_name = db_name

    def connect(self):
        return sqlite3.connect(self.db_name)

    def create_table(self):
        with self.connect() as conn:
            cursor = conn.cursor()
            cursor.execute('''
                CREATE TABLE IF NOT EXISTS users (
                    id INTEGER PRIMARY KEY,
                    name TEXT,
                    age INTEGER
                )
            ''')
            conn.commit()

    def insert_user(self, name, age):
        with self.connect() as conn:
            cursor = conn.cursor()
            cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))
            conn.commit()

    def get_user_by_id(self, user_id):
        with self.connect() as conn:
            cursor = conn.cursor()
            cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
            return cursor.fetchone()

์‚ฌ์šฉ ์˜ˆ์ œ

# DAO ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ
user_dao = UserDAO('test.db')
user_dao.create_table()
user_dao.insert_user('Alice', 25)

user = user_dao.get_user_by_id(1)
print(user)  # ์ถœ๋ ฅ ์˜ˆ์‹œ: (1, 'Alice', 25)

2. DTO (Data Transfer Object)

DTO๋ž€?

DTO๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†กํ•˜๊ฑฐ๋‚˜ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ „์†กํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠน์ • ์ปฌ๋Ÿผ ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์“ฐ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ, ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•  ๋ฟ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

DTO์˜ ์—ญํ• 

  • ๋ฐ์ดํ„ฐ ์ „๋‹ฌ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ๋‹ค๋ฅธ ๊ณ„์ธต์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€: ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœํžˆ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ ๋กœ์ง์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํฌํ•จํ•˜์ง€ ์•Š์Œ: DTO๋Š” ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด๋กœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์ง€๋งŒ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Python์—์„œ DTO ๊ตฌํ˜„ ์˜ˆ์ œ

Python์—์„œ DTO๋Š” ์ฃผ๋กœ dataclass๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด๋Š” UserDTO ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

from dataclasses import dataclass

@dataclass
class UserDTO:
    id: int
    name: str
    age: int

์‚ฌ์šฉ ์˜ˆ์ œ

# DTO ๊ฐ์ฒด ์ƒ์„ฑ
user_dto = UserDTO(id=1, name='Alice', age=25)
print(user_dto)  # ์ถœ๋ ฅ ์˜ˆ์‹œ: UserDTO(id=1, name='Alice', age=25)

3. VO (Value Object)

VO๋ž€?

VO๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์บก์Аํ™”ํ•˜์—ฌ ๋ถˆ๋ณ€์˜ ๊ฐ์ฒด๋กœ ๋‹ค๋ฃจ๋Š” ๊ฐ’ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ํŠน์ • ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ๋“ค์˜ ์ง‘ํ•ฉ์ด๋ฉฐ, ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋ฉด ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

VO์˜ ์—ญํ• 

  • ๊ฐ’ ์ž์ฒด๋กœ ๋™๋“ฑ์„ฑ ์ •์˜: VO๋Š” ์†์„ฑ ๊ฐ’์ด ๋™์ผํ•˜๋ฉด ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ: VO๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ํ‘œํ˜„: VO๋Š” ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ํ•„์š”ํ•œ ์ƒํƒœ๋‚˜ ๊ฐ’๋“ค์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Python์—์„œ VO ๊ตฌํ˜„ ์˜ˆ์ œ

VO๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐ’ ๋ณ€๊ฒฝ์„ ๋ง‰๊ธฐ ์œ„ํ•ด @dataclass(frozen=True)๋ฅผ ์‚ฌ์šฉํ•ด ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” AddressVO ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

from dataclasses import dataclass

@dataclass(frozen=True)
class AddressVO:
    street: str
    city: str
    zipcode: str

์‚ฌ์šฉ ์˜ˆ์ œ

# VO ๊ฐ์ฒด ์ƒ์„ฑ
address1 = AddressVO(street="123 Main St", city="Springfield", zipcode="12345")
address2 = AddressVO(street="123 Main St", city="Springfield", zipcode="12345")

print(address1 == address2)  # ์ถœ๋ ฅ: True (๊ฐ’์ด ๋™์ผํ•˜๋ฏ€๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ)

DAO, DTO, VO์˜ ์ฐจ์ด์  ์ •๋ฆฌ

๊ตฌ๋ถ„ DAO (Data Access Object) DTO (Data Transfer Object) VO (Value Object)
๋ชฉ์  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๊ด€๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ๊ฐ์ฒด ๋ถˆ๋ณ€์˜ ๊ฐ’ ๊ฐ์ฒด
์—ญํ•  CRUD ์ž‘์—… ์ˆ˜ํ–‰ ๋ฐ์ดํ„ฐ ๊ณ„์ธต ๊ฐ„ ์ „๋‹ฌ ๊ฐ’ ์ž์ฒด๋กœ ๋™๋“ฑ์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด
์˜ˆ์‹œ UserDAO, ProductDAO UserDTO, ProductDTO AddressVO, MoneyVO
ํŠน์ง• ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์šฉ ๊ฐ’์ด ๋™์ผํ•˜๋ฉด ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ

๊ฒฐ๋ก 

Python์—์„œ DAO, DTO, VO๋Š” ๊ฐ๊ฐ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ, ์ „์†ก, ๊ฐ’ ๊ฐ์ฒด ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด๋“ค ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • DAO๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, CRUD ์ž‘์—…์„ ๋ถ„๋ฆฌํ•ด ์ฝ”๋“œ๋ฅผ ๋ชจ๋“ˆํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • DTO๋Š” ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•œ ๊ฐ์ฒด๋กœ์„œ, ์ฃผ๋กœ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • VO๋Š” ๊ฐ’ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ, ๊ฐ’์— ๊ธฐ๋ฐ˜ํ•œ ๋™๋“ฑ์„ฑ์„ ๊ฐ€์ง€๋ฉฐ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด Python ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์™€ ์ „์†ก์„ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90
728x90

1. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ, ์›๋ณธ ํ•จ์ˆ˜์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Python์—์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” @ ๊ธฐํ˜ธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

@๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
def ํ•จ์ˆ˜์ด๋ฆ„():
    pass

 

์œ„ ๊ตฌ๋ฌธ์€ ํ•จ์ˆ˜์ด๋ฆ„ = ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(ํ•จ์ˆ˜์ด๋ฆ„)๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

def simple_decorator(func):
    def wrapper():
        print(f"Calling function: {func.__name__}")
        func()
    return wrapper

@simple_decorator
def say_hello():
    print("Hello!")

say_hello()

# ์ถœ๋ ฅ:
# Calling function: say_hello
# Hello!

 

์ฆ‰ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

2. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

1. func ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
2. ํ•จ์ˆ˜ wrapper๋Š” ์›๋ž˜ ํ•จ์ˆ˜์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ func()๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
3. ์ตœ์ข…์ ์œผ๋กœ, wrapper ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋œ ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ wrapper ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

3. ๋‹ค์–‘ํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์˜ˆ์ œ

์˜ˆ์ œ 1: ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Execution time of {func.__name__}: {end_time - start_time:.4f} seconds")
        return result
    return wrapper

@timer_decorator
def slow_function():
    time.sleep(2)
    print("Function complete.")

slow_function()

# ์ถœ๋ ฅ:
# Function complete.
# Execution time of slow_function: 2.0001 seconds

 

์˜ˆ์ œ 2: ํ•จ์ˆ˜์— ์ธ์ž ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

์œ„ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก *args์™€ **kwargs๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค.

def check_permission(permission_required):
    def decorator(func):
        def wrapper(user_permission, *args, **kwargs):
            if user_permission == permission_required:
                return func(*args, **kwargs)
            else:
                print("Permission Denied")
        return wrapper
    return decorator

@check_permission("admin")
def delete_file():
    print("File deleted.")

# ์˜ˆ์ œ ์‹คํ–‰
delete_file("admin")   # Permission granted
delete_file("guest")   # Permission Denied

# ์ถœ๋ ฅ:
# File deleted.
# Permission Denied

 

์˜ˆ์ œ 3: ์—ฌ๋Ÿฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ

์—ฌ๋Ÿฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ•œ ํ•จ์ˆ˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฐจ๋ก€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

def make_upper(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

def print_stars(func):
    def wrapper(*args, **kwargs):
        print("*****")
        result = func(*args, **kwargs)
        print("*****")
        return result
    return wrapper

@print_stars
@make_upper
def greet():
    return "hello"

print(greet())

# ์ถœ๋ ฅ:
# *****
# HELLO
# *****

 

4. ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, staticmethod๋‚˜ classmethod๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์  ๋˜๋Š” ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y
    
    @classmethod
    def multiply(cls, x, y):
        return x * y

# ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
print(MathOperations.add(5, 7))         # ์ถœ๋ ฅ: 12
print(MathOperations.multiply(5, 7))    # ์ถœ๋ ฅ: 35

 

๊ฒฐ๋ก : ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์žฅ๋‹จ์ ๊ณผ ํ•„์š”์„ฑ

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋กœ๊น…, ๊ถŒํ•œ ๊ด€๋ฆฌ, ์„ฑ๋Šฅ ์ธก์ • ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜์— ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  1. ์žฌ์‚ฌ์šฉ์„ฑ: ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜์— ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ€๋…์„ฑ: ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ํ•ต์‹ฌ ๋กœ์ง๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ(๋กœ๊น… ๋“ฑ)์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์œ ์—ฐ์„ฑ: ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  1. ๋””๋ฒ„๊น… ์–ด๋ ค์›€: ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ค‘์ฒฉ๋˜๋ฉด ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ณต์žก์„ฑ ์ฆ๊ฐ€: ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” Python์˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ดํ•ดํ•˜๊ณ  ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”์™€ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด๋ฏ€๋กœ, ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90
728x90

์ฝ”๋“œ๋“ค์„ ์‚ดํŽด๋ณด๋‹ค๊ฐ€ VO ๊ฐ€ ๋ฐœ๊ฒฌ๋๋‹ค. ์ด๊ฒƒ์ด ๋ฌด์—‡์ธ๊ณ .. ํ•˜๋‹ˆ value object ๋ž€๋‹ค. ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. DAO DTO VO impl ... ์•„์ฃผ ๋ชจ๋ฅด๊ฒ ๋Š”๊ฒƒ๋“ค ํˆฌ์„ฑ์ด์ด๋‹ค. ๋””์ž์ธํŒจํ„ด์„ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋งˆ์Œ๋จน์€ ์ˆœ๊ฐ„์ด์—ˆ๋‹ค. ์ž๊ฒฉ์ฆ ์‹œํ—˜ ๋ณผ ๋•Œ ์žˆ์—ˆ๋˜ ์—„์ฒญ ๋งŽ์€ ๋””์ž์ธํŒจํ„ด๋“ค์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์ง€๋งŒ ์ผ๋‹จ ๋‚ด ์—…๋ฌด์˜ ๋””์ž์ธํŒจํ„ด์€ ์•Œ์•„์•ผ๊ฒ ๋‹ค. ์–ด์ฐจํ”ผ ๊ฐ๋™์—†๋Š” ๋ฐฐ์›€์€ ๊ธˆ๋ฐฉ ์žŠํ˜€์ง€๊ธฐ ๋•Œ๋ฌธ..

1. VO( Value Obejct ) ๋Š” ๋ฌด์—‡์ผ๊นŒ

VO ์˜ ๊ทธ ์‚ฌ์ „์ ์ธ ์˜๋ฏธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

VO(Value Object)๋Š”  ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. VO๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹๋ณ„๋  ํ•„์š” ์—†์ด, ๊ทธ ๋‚ด๋ถ€ ๊ฐ’๋งŒ์œผ๋กœ ์ •์˜ ๋˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‘ VO ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋ฉด ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— VO๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๋„๋ฉ”์ธ๋ชจ๋ธ๋ง์€ ๋ญ๊ณ  ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ์ฒด๋Š” ๋ญ˜๊นŒ. ์ด๊ฑด ๋‹ค์Œ์— ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ณ , ์•Œ์•„์•ผ ํ•  ๊ฒƒ์€ 

 

1. VO๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.

2. VO๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹๋ณ„ ๋  ํ•„์š” ์—†์ด, ๊ทธ ๋‚ด๋ถ€ ๊ฐ’๋งŒ์œผ๋กœ ์ •์˜ ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

 

์ด ๋‘๊ฐœ ์ธ๊ฒƒ ๊ฐ™๋‹ค. ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹๋ณ„ ๋  ํ•„์š” ์—†์ด ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋ฉด ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋˜๋Š”๋ฐ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ (1) ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”์ง€๋Š” ์‚ฌ์‹ค ์ž˜ ์™€๋‹ฟ์ง€ ์•Š๋Š”๋‹ค. 

 

(2) ์˜ ์ •์˜๊ฐ€ ๋‚ด๋ถ€ ๊ฐ’์ด ๊ฐ™๋‹ค๊ณ  ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค. ๋ผ๋Š” ์„ค๋ช…์—์„œ ๋งˆ์น˜์ง€๋งŒ, ์‚ฌ์‹ค ์—ฌ๊ธฐ์—๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹๋ณ„ ๋  ํ•„์š” ์—†๋‹ค. ๊ฐ€ ๋” ์ค‘์š”ํ•˜๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์ง์œก๋ฉด์ฒด๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด

int sidelength_1

int sidelength_2

int sidelength_3

int sidelength_4

int sidelength_5

int sidelength_6 

 

์ฒ˜๋Ÿผ primitive type ์œผ๋กœ ํ•˜๋‚˜์”ฉ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ. ๊ทธ๊ฒƒ์„ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ์ฒด์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์—ฌ๊ธฐ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ฐ’์„ ์œ„ํ•œ ๊ฐ์ฒด์ธ ๊ฒƒ์ด๋‹ค. 


2. VO( Value Obejct ) ์™œ ์“ฐ๋Š”๊ฑธ๊นŒ ?

VO ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์ด์œ ๋Š” primitive type ์ด ์–ด๋–ค ๋„๋ฉ”์ธ์˜ ๊ฐ์ฒด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, primitive type ์œผ๋กœ ๋‹ค๊ฐํ˜•์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ง์‚ฌ๊ฐํ˜•์„ ์œ„ํ•œ primitive type ์˜ ์†์„ฑ์ด ํ•„์š”ํ•˜๊ณ , ์ •์˜ค๊ฐํ˜•์˜ primitive type ์†์„ฑ์ด ํ•„์š”ํ•˜๊ฒŒ ๋  ๊ฒƒ ์ด๋‹ค. ๋‹ค๊ฐํ˜•์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋งค๋ฒˆ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ๊ฒƒ์ธ๊ฐ€ ? ์šฐ๋ฆฌ๋Š” ๊ฐ์ฒด๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿดํ•„์š”๊ฐ€ ์—†๋‹ค.

 

์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ์‚ฌ๋ก€์ฒ˜๋Ÿผ VO ๊ฐ€ primitive type ๋ณด๋‹ค ์ž˜ ์“ฐ์ธ๋‹ค๋Š” ์ฆ‰ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ณด์ž.

 

2.1 ) primitive type ์„ ๊ฐ์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 

public class Ladder {

    private final int width;
    private final int height;

    public void Ladder(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

 

์ด๋•Œ Ladder ์ƒ์„ฑ์ž ์ธ์ˆ˜๋Š” int ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ง„์งœ Ladder ๊ฐ์ฒด๊ฐ€ width ์™€ heigth ๋ฅผ ์ž˜ ์‚ฌ์šฉํ–ˆ์„๊นŒ ? 

 

์•„๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ž๋ฃŒํ˜•์˜ ์†์„ฑ์„ ์ œ๋Œ€๋กœ ๊ณ ๋ คํ•˜์ง€ ์•Š์€๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹จ์ ์œผ๋กœ

1. ์‚ฌ๋‹ค๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋”ํ•ด์ง€๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ๊ฐ€ ?
2. ์‚ฌ๋‹ค๋ฆฌ์˜ ๋†’์ด๋ฅผ ๊ณฑํ•˜๊ฑฐ๋‚˜ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?
3. ์‚ฌ๋‹ค๋ฆฌ์˜ ๋†’์ด๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?

์˜ ์งˆ๋ฌธ์—์„œ "์˜ˆ"๋Š” ์—†๋‹ค. integer ๋Š” ์œ„์˜ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒํ˜•์ธ๋ฐ ์™œ integer ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ• ๊นŒ ? ์ด ์ ์ด ๊ฐ์ฒด๊ฐ€ primitive ๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

 

์ด๋ ‡๊ฒŒ ๋ณ„ ์ƒ๊ฐ์—†์ด ๋„๋ฉ”์ธ์˜ ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ primitive type ์„ ์“ฐ๋Š” ๊ด€์Šต์„ primitive obsession์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

[์ฐธ์กฐ] https://ksh-coding.tistory.com/83

 

VO(Value Object)๋Š” ๋ฌด์—‡์ผ๊นŒ? ์™œ ์‚ฌ์šฉํ• ๊นŒ?

1. VO(Value Object)๋ž€? VO์˜ ์˜๋ฏธ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. * VO๋ž€ ๋„๋ฉ”์ธ์—์„œ ํ•œ ๊ฐœ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ์†์„ฑ๋“ค์„ ๋ฌถ์–ด์„œ ํŠน์ • ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. * ํ•ด๋‹น ์†์„ฑ๋“ค์„ primitive ํƒ€์ž…์ด๋‹ค! (int, boolean, ...

ksh-coding.tistory.com

 

2.2 ) ํ•œ ๊ณณ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ณณ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 

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

๊ทธ๋ž˜์„œ ๋†’์ด์™€ ๋„ˆ๋น„๊ฐ€ ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋˜์–ด ํ—ค๋ฉ”์ง€ ์•Š๋„๋ก  ์„ค๊ณ„๋ฅผ ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. 

 

 

2.3 )  ํ•œ ๊ณณ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ ๋ถˆ๋ณ€์„ ํ•œ ๋ฒˆ์— ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. 

2-2 ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์‚ฌ๋‹ค๋ฆฌ ๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋„ํ˜•์˜ ๊ฐ์ฒด๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ ‘๊ทผํ–ˆ๋˜ ๊ฐ์ฒด์˜ ๋„ˆ๋น„๊ฐ€ ์ง์‚ฌ๊ฐํ˜•์ธ์ง€ ์‚ฌ๋‹ค๋ฆฌ๊ผด์ธ์ง€ ๋ณด์ฆํ•  ์ˆ˜ ์žˆ๋‚˜? ์—†๋‹ค. ์ด๊ฒƒ์„ ์œ„ํ•ด์„œ๋Š” ๊ฐ ๊ฐ์ฒด ์„ ์–ธ ๋‹จ๊ณ„์—์„œ final ์ด ๋ถ™์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค ๊ทธ๋งˆ์ €๋„ ์—†์œผ๋ฉด ๋‚ด๊ฐ€ ์–ด๋–ค ๋„ˆ๋น„์— ์ ‘๊ทผํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.  ๋”ฐ๋ผ์„œ VO ๋ฅผ ํ†ตํ•ด ์ด ๋ฌธ์ œ์ ๋“ค์„ ์ ์ ˆํ•œ ์„ค๊ณ„๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

โœ… VO ๊ฐ€ ์ง„์งœ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ด์œ  

1. primitive ํƒ€์ž…์˜ ๊ธฐ๋Šฅ๋“ค์„ '๊ฐ’'์ด ๋‹ค ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
2. '๊ฐ’'์ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๋ฉด ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ์—ฌ๋Ÿฌ ๊ณณ์— ํผ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋‚˜ ๋ถˆ๋ณ€ ์ฒดํฌ ๋“ฑ์„ ํ•ด๋‹น '๊ฐ’'์ด ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค.

 

 

3.  VO( Value Obejct ) ์ƒ์„ฑ ์ œ์•ฝ์กฐ๊ฑด/ํŠน์ง•

1. ๋ถˆ๋ณ€์„ฑ (Immutability)

VO๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ํ•œ ๋ฒˆ ์ƒ์„ฑ๋œ ํ›„ ๊ทธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ถˆ๋ณ€์„ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, Money๋ผ๋Š” VO ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ, amount์™€ currency๋ผ๋Š” ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋œ ์ดํ›„์—๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๊ฒƒ์ดใ…ใ„ท.

2. ๋™๋“ฑ์„ฑ_๊ฐ’์œผ๋กœ๋น„๊ต๋œ (Equality by Value)

VO๋Š” ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด VO๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๊ฐ’์— ๋”ฐ๋ผ ๋™์ผ์„ฑ์„ ํŒ๋‹จํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ Address ๊ฐ์ฒด๊ฐ€ street, city, state, postalCode๊ฐ€ ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค.

3. ์ž๊ฐ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (Self -Validation)

primitive type ์„ ์‚ฌ์šฉ ํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ ํ•  ๋ชจ๋“  ๊ณณ์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค. VO ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฒฉ๋ฆฌ๋œ ๊ฐ์ฒด ์•ˆ์—์„œ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

4.  VO( Value Obejct ) ์‚ฌ์šฉ ์˜ˆ์‹œ

์•ž์„œ ๋„ˆ๋น„์™€ ๋†’์ด์˜ ์‚ฌ๋‹ค๋ฆฌ๋กœ VO ๋ฅผ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ, primitive type ์ด ์•„๋‹Œ VO ํŠน์„ฑ์„ ์ง€์ผœ์„œ ๋งŒ๋“ค์–ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

public class ShapeProperty {
		
    // ๋ถˆ๋ณ€์„ฑ (Immutable)
    private final int width;
    private final int height;

    public Shape(final int width, final int height) {
        // ์ž๊ฐ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (Self-Validation)
        validateWidth(width);
        validateHeight(height);
        
        this.width = width;
        this.height = height;
    }

    // ๋™๋“ฑ์„ฑ (Equality)
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ShapeProperty that = (ShapeProperty) o;
        return width == that.width && height == that.height;
    }

    @Override
    public int hashCode() {
        return Objects.hash(width, height);
    }
}

 

VO ๋ฅผ ํ†ตํ•ด์„œ width ์™€ height ๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ์ฒด์—๋Š” ShapeProperty ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ ๊ฐ’์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋ž˜๋Š” VO ๋ฅผ ํ™œ์šฉํ•ด ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ์„ ์–ธํ•œ ๊ฒƒ์ด๋‹ค. 

// ์›์‹œ ํƒ€์ž… ์‚ฌ์šฉ
public class Ladder {
		
    private final int width;
    private final int height;

    public void Ladder(int width, int height) {
    	validateWidth(width);
        validateHeight(height);
        
        this.width = width;
        this.height = height;
    }
}

// VO๋กœ ๋ณ€๊ฒฝ
public class Ladder {
		
    private final ShapeProperty shapeProperty;

    public void Ladder(final ShapeProperty shapeProperty) {
        this.shapeProperty = shapeProperty;
    }
}

 

๋. 

728x90

+ Recent posts