[꼼꼼한 개발자] 꼼코더

[JAVA] - DAO, DTO, VO, Entity 간단하고 쉽게 이해하기 본문

간단하고 쉽게/JAVA

[JAVA] - DAO, DTO, VO, Entity 간단하고 쉽게 이해하기

꼼코더 2022. 12. 20. 01:11
반응형

👨🏻‍🏫 간단정리

DAO :  Database에 접근하는 역할을 하는 객체.

DTO : 데이터를 전달하기 위한 객체

VO : 값 자체를 표현하는 객체.

Entity : 실제 DB 테이블과 매핑이 되는 클래스.

 

👀 자세한 내용은 아래에.


🔌 DAO

  • Data Access Object 의 약자로, Database에 접근하는 역할을 하는 객체.
  • 프로젝트의 서비스 모델에 해당하는 부분과 데이터베이스를 연결하는 역할
  • 데이터의 CRUD 작업을 시행하는 클래스. 즉, 데이터에 대한 CRUD 기능을 전담하는 오브젝트

 

👀사용이유

그렇다면, DAO를 사용하는 이유가 무엇일까?

  • 효율적인 커넥션 관리와 보안성.
  • DAO는 비즈니스 로직을 분리하여 도메인 로직으로부터 DB와 관련한 메커니즘을 숨기기 위해 사용.

👨🏻‍💻 예재코드(DAO)

public class TestDao {
public void add(TestDto dto) throws ClassNotFoundException, SQLException {
		private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/dao_Db";
    private static final String USER = "root";
    private static final String PASSWORD = "1234";   
		
		String sql = "SELECT * FROM vouchers";

        try {
            con = DriverManager.getConnection(URL, USER, PASSWORD);
            stmt = con.createStatement();
            res = stmt.executeQuery(sql);
            while (res.next()) {
                System.out.println(res.getString("id") + " ");
                System.out.println(res.getString("value") + " ");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

    preparedStatement.setString(1, dto.getName());
    preparedStatement.setInt(2, dto.getValue());
    preparedStatement.setString(3, dto.getData());
    preparedStatement.executeUpdate();
    preparedStatement.close();

    connection.close();

	}
}


🚚 DTO

  • Data Transfer Object의 약자로, 데이터를 전달하기 위한 객체
  • DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스).
  • 여러 레이어(Layer)간 데이터를 주고 받을 때 사용할 수 있고 주로 View와 Controller 사이에서 활용.
  • DTO는 getter / setter 메소드를 포함한다. 하지만, 이외의 다른 비즈니스 로직은 포함하지 않는다.
  • DTO는 어떻게 구현하느냐에 따라 가변 객체로 활용할 수도 있고 불변 객체로 활용할 수도 있다.
  • DTO는 데이터 전달 만을 위한 객체라는 게 핵심 정의이다. 그렇기 때문에 완전히 데이터 전달 용도로만 사용하는게 목적이라면, getter/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]
// 불변 객체 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

  • VO는 Value Object의 약자로 값 자체를 표현하는 객체.
  • DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있다.
  • VO는 getter() 메소드를 포함해서, 이외의 비즈니스 로직도 포함할 수 있다.
  • 사용하는 도중에 변경 불가하여 setter() 메소드는 가지지 않아. **오로지, 읽기 기능만 가능하다.(**read-Only)
  • VO는 두 객체의 모든 필드 값들이 동일하면 두 객체는 같다! 가 핵심 정의이다. 그렇기 때문에 완전히 값 자체 표현 용도로만 사용하는 게 목적이라면, 두 객체의 모든 필드 값들이 모두 같으면 같은 객체이도록 만드는 것(equals() 와 hashCode()의 오버라이딩)이 중요하지, 메소드는 어떤 메소드가 있든 말든 상관 없다.

👨🏻‍💻 예재코드(VO)

  • [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 + "원";
        }
					
	// 두 객체의 모든 필드 값들이 모두 같으면 같은 객체이도록 만들기 위한 오버라이딩
		@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;
        }
    }
}

🧾 Entity

  • Entity는 실제 DB 테이블과 매핑이 되는 클래스.
  • Entity를 데이터를 전달하는 클래스로 사용하면 안된다.
  • Entity를 기준으로 테이블이 형성되고, 칼럼이 변경되곤 한다.
  • Entity는 비즈니스 로직을 포함할 수도, setter() 메소드를 포함할 수도 있습니다.

 

👨🏻‍💻 예재코드(Entity)

  • [Entity 예제]
public class EntityEx {
    private final Long id;
    private final String name;
    private final int value;

    public EntityEx(Long id, String name, int value) {
        this.id = id;
        this.name = name;
        this.value = value;
    }
}

 

참고 : https://today-retrospect.tistory.com/142

Comments