DAO, DTO, VO, Entity

     

    DAO(Data Access Object)

    • 데이터베이스의 data에 접근하기 위한 객체이다.
    • 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.
    • DataBase에 접근하기 위한 로직과 비지니스 로직을 분리하기 위해 사용한다.
    • PA, Hibernate, Mybatis 등의 Persistence Framework를 통해 접근
    • DAO를 사용하는 이유
      • 효율적인 커넥션 관리 보안성
      • 비지니스 로직을 분리하며 도메인 로직으로부터 DB와 관련된 메커니즘을 숨기기 위해 사용한다.
    public class TestDao {
    
        public void add(TestDto dto) throws ClassNotFoundException, SQLException {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");
    
            PreparedStatement preparedStatement = connection.prepareStatement("insert into users(id,name,password) value(?,?,?)");
    
    
            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)

    • 계층간(Controller, View, Business Layer) 데이터 교환을 위한 자바 빈즈(Java Beans)를 의미한다.
      • DB의 데이터를 Service나 Controller 등으로 보낼 때 사용하는 객체를 말한다.
      • DB의 데이터가 Presentation Logic Tier로 넘어올때는 DTO로 변환되어 오고가는 것이다.
    • DTO는 데이터 전송 (이동) 객체라는 의미를 가진다.
    • 로직을 가지지 않는 순수한 데이터 객체이고 getter/setter메소드만 가진 클래스를 의미한다.
    • 주로 비동기 처리를 할 때 사용한다.

     

    +) Java Beans

    Java로 작성된 소프트웨어 컴포넌트를 지칭하는 단어

    비즈니스 로직 부분을 담당하는 Java 프로그램 단위

    (장점) JSP페이지가 복잡한 자바 코드로 구성되는 것을 피할 수 있음

    (장점) 재사용 가능한 컴포넌트를 만들 수 있음

     

    public class MemberDTO {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
     

    VO(Value Object)

    • DTO와 달리 VO는 Read-Only속성을 지닌 값 오브젝트이다.
    • 자바에서 단순히 값 타입을 표현하기 위해 불변 클래스(Read-Only)를 만들어 사용한다.
    • 핵심 역할은 equals()와 hashcode() 를 오버라이딩 하는 것이다.
    • 내부에 선언된 속성(필드)의 모든 값들이 VO 객체마다 값이 같아야, 똑같은 객체라고 판별한다.
    • getter 메소드만 가진 클래스
    • 여러 테이블에 대한 공통 속성을 모아서 만든 BaseVO 클래스를 상속받아서 사용할 수 있다.

     

    // Money.java
    public class MoneyVO {
        private final String currency;
        private final int value;
    
        public MoneyVO(String currency, int value) {
            this.currency = currency;
            this.value = value;
        }
    
        public String getCurrency() {
            return currency;
        }
    
        public int getValue() {
            return value;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            MoneyVO money = (MoneyVO) o;
            return value == money.value && Objects.equals(currency, money.currency);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(currency, value);
        }
    }
    
    // MoneyTest.java
    public class MoneyTest {
        @DisplayName("VO 동등비교를 한다.")
        @Test
        void isSameObjects() {
            MoneyVO money1 = new MoneyVO("원", 10000);
            MoneyVO money2 = new MoneyVO("원", 10000);
    
            assertThat(money1).isEqualTo(money2); // true
        }
    }
     

    Entity

    • 실제 DataBase의 테이블과 1 : 1로 매핑 되는 클래스
    • DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야 한다.
    • 상속을 받거나 구현체여서는 안되며, 테이블내에 존재하지 않는 컬럼을 가져서도 안된다.
    • 최대한 외부에서 Entity 클래스의 getter/setter를 사용하지 않도록 클래스 내부에서 필요한 로직을 구현해야 한다.
    • 구현 메소드는 주로 Service Layer에서 사용한다.
    • Presentation Logic을 가지면 안된다.
    public class MemberEntity {
        private final Long id;
        private final String email;
        private final String password;
        private final Integer age;
    
        public MemberEntity() {
        }
    
        public MemberEntity(Long id, String email, String password, Integer age) {
            this.id = id;
            this.email = email;
            this.password = password;
            this.age = age;
        }
    }
     

     

     

    '공부 > Spring' 카테고리의 다른 글

    스프링 패키지 구조  (0) 2023.06.22
    스프링 객체 주입  (0) 2023.02.03
    Session  (0) 2023.01.16
    Spring의 대표적인 Annotation의 역할  (0) 2023.01.10
    Spring Bean  (0) 2023.01.06

    댓글