DAO / DTO / VO

niireymikยท2024๋…„ 2์›” 23์ผ


๐Ÿ› ๏ธ DAO (Data Access Object)

DAO๋Š” Data Access Object์˜ ์•ฝ์ž๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. (ํ”„๋กœ์ ํŠธ์˜ ์„œ๋น„์Šค ๋ชจ๋ธ์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• )

์ฆ‰, DB์— ์ ‘์†ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ CRUD(์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ) ์ž‘์—…์„ ์ „๋‹ดํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

์‚ฌ์šฉ ์ด์œ 

DAO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ?

  • ํšจ์œจ์ ์ธ ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ์™€ ๋ณด์•ˆ์„ฑ
  • DAO๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋„๋ฉ”์ธ ๋กœ์ง์œผ๋กœ๋ถ€ํ„ฐ DB์™€ ๊ด€๋ จํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

DAO ์˜ˆ์‹œ



๐Ÿงบ DTO (Data Transfer Object)

Data Transfer Object์˜ ์•ฝ์ž๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด(Java Bean)์ด๋‹ค.

Controller (Web Layer)์™€ VIew (Service Layer) ์‚ฌ์ด์—์„œ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ "๋ฐ”๊ตฌ๋‹ˆ"๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. Entity Class๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋งคํ•‘๋˜์–ด ์žˆ๋Š” ํ•ต์‹ฌ ํด๋ž˜์Šค์ด๋‹ค. Entity Class๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํด๋ž˜์Šค๋กœ Entity Class๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— DTO ํด๋ž˜์Šค๋ฅผ ๋‘ฌ View์˜ ๋‹ค์–‘ํ•œ ๋ณ€ํ™”์— Entity ํด๋ž˜์Šค๊ฐ€ ์ง์ ‘์ ์œผ๋กœ (์›ํ•˜์ง€ ์•Š๋Š”) ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ DTO๋Š” ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์ด๋ฉฐ getter, setter ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
( DTO๋Š” ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๋งŒ์„ ์œ„ํ•œ ๊ฐ์ฒด๋ผ๋Š” ๊ฒŒ ํ•ต์‹ฌ ์ •์˜์˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ชฉ์ ์ด๋ผ๋ฉด, gettet/setter๋งŒ ํ•„์š”ํ•˜์ง€, ์ด์™ธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๊ตณ์ด ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. )

DTO๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋กœ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Š” ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

DTO ์˜ˆ์‹œ

// ๊ฐ€๋ณ€ ๊ฐ์ฒด DTO
// ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑ ํ›„ ๊ฐ’์„ ์œ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ 
public class DtoEx {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// ๋ถˆ๋ณ€ ๊ฐ์ฒด DTO
// ์ƒ์„ฑ์‹œ ์ง€์ •ํ–ˆ๋˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๊ณ  getter() ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
public class DtoEx {
    private final String name;
    private final int age;

    public DtoEx(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
  • ๊ฐ€๋ณ€ ๊ฐ์ฒด๋กœ DTO๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” setter() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ DTO๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ ์‹œ getter() ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    (์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.)


๐Ÿ’ธ VO (Value Object)

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

์ •์˜์— ๋งž๊ฒŒ, VO๋Š” ๊ฐ’ ์ž์ฒด๋ฅผ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๊ธฐ์— ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๊ณ , setter๋Š” ์—†๋Š” Read-Only ์†์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

DTO๋Š” '์ „๋‹ฌ'๋งŒ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๊ธฐ์— getter, setter๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด, VO๋Š” ์ด์™ธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

VO๋Š” ๋‘ ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ•„๋“œ ๊ฐ’๋“ค์ด ๋™์ผํ•˜๋ฉด ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ™๋‹ค! ๊ฐ€ ํ•ต์‹ฌ ์ •์˜์˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ๊ฐ’ ์ž์ฒด ํ‘œํ˜„ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ชฉ์ ์ด๋ผ๋ฉด, ๋‘ ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ•„๋“œ ๊ฐ’๋“ค์ด ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ๊ฐ์ฒด์ด๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ(equals()์™€ hashCode()์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ)์ด ์ค‘์š”ํ•˜๋‹ค.

equals()์™€ hashCode()?

์œ„์ฒ˜๋Ÿผ, ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ ๋‘ ๊ฐ์ฒด์˜ hashCode() ๋ฆฌํ„ด๊ฐ’์ด ๊ฐ™๊ณ , ๋™์‹œ์— equals() ๋ฆฌํ„ด๊ฐ’์ด true์ผ ๊ฒฝ์šฐ ๋‘ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ผ๊ณ  ํŒ๋‹จํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ VO๋Š” '๋‘ ๊ฐ์ฒด์˜ ๋ชจ๋“  ๊ฐ’๋งŒ ๊ฐ™์œผ๋ฉด ๊ฐ™๋‹ค(ํ•˜๋‚˜๋กœ ๋ณธ๋‹ค)'๊ฐ€ ๊ทธ ์ •์˜์ด๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ (์˜ˆ์‹œ) ํด๋ž˜์Šค Money๋ฅผ VO๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” hashCode()์™€ equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ตฌํ˜„์€ ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

VO ์˜ˆ์‹œ

// VO์˜ˆ์ œ
// ๊ฐ’์„ ํ‘œํ˜„๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— setter()๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
public class VoEx {
    static class Money{
        private final int value;

        Money(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
				
	// ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฉ”์„œ๋“œ์ด์ง€๋งŒ setterํ˜•ํƒœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ฌด๊ด€ํ•จ
        public String printMoney(){
            return this.value + "์›";
        }
					
	// ๋‘ ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ•„๋“œ ๊ฐ’๋“ค์ด ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ๊ฐ์ฒด์ด๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ โ†’ ์ด๋กœ์จ Money ๊ฐ์ฒด๊ฐ€ ์™„์ „ํ•œ VO๊ฐ€ ๋œ๋‹ค!
		@Override
        public int hashCode() {
            return Objects.hash(value);
        }

        @Override
        public boolean equals(Object obj) {
            if(this == obj)
                return true;
            if(obj == null || getClass() != obj.getClass())
                return false;
            Money money = (Money) obj;
            if(value == money.value)
                return true;
            else
                return false;
        }
    }
}

DTO์™€ VO ๋น„๊ต ์ •๋ฆฌ

0๊ฐœ์˜ ๋Œ“๊ธ€