java spring

DAO, DTO, Service

윤돌_99 2021. 7. 29. 21:09

DAO(Data Access Object)

DB를 사용해 데이터를 조회하거나 조작하는 기능을 담당하는 것들을 DAO라고 부른다. 

domain logic (비즈니스 로직이나 DB와 관련없는 코드들)을 persistence mechnism과 분리하기 위해 사용한다.

 - persistence mechnism: Database에 data를 CRUD(Create, Read, Update, Drop)하는 계층

 

DAO를 만들지 안흥면 비즈니스 로직이 DB로부터 데이터를 얻어오기 위해 매번 Driver를 로드하고 Connection 객체를 생성하게 되면 엄청 많은 커넥션이 발생하게 되기 때문이다. 

 

Spring에서 DAO는 @Repository annotation으로 정의한다. 

 

DTO(Data Transfer Object)

VO(Value Object)라고도 표현한다. 계층간 데이터 교환을 위한 자바빈즈(Java Beans)이다. 

이 객체는 데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체를 말한다. DTO는 보통 로직을 가지고 있지 않고 그 data에 접근하기 위한 getter와 setter만 가지고 있다. 

정리하면 DTO는 Database에서 Data를 얻어 Service나 Contoller 등으로 보낼 때 사용하는 객체를 말한다.

DAO가 Database로부터 Data를 얻은 뒤 List를 담아서 보내주고 있다. 

 

public class User {
    private String name;
    private int age;

    public String getName() {
        return this.name;
    }

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

    public void getAge() {
        return this.age;
    }

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

    @Override
    public String toString() {
        return "name='" + name + "', age=" + age;
    }
}

 

Service

Service는 비즈니스 로직이 들어가는 부분이다. Controller가 Request를 받으면 적절한 Service에 전달하고, 전달받은 Service는 비즈니스 로직을 처리한다. DAO로 데이터베이스에 접근하고, DTO로 데이터를 전달받은 다음, 적절한 처리를 해 반환한다. 

 

public interface UserService {
    /**
     * 유저 정보를 텍스트 파일로 저장한다.
     * 
     * @param path 저장할 파일의 경로
     * @return 저장한 유저의 개수
     */
    public int saveUsersAsTextFile(String path);
}
@Service("userService")
public class UserServiceImpl implements UserService {
    private static final Logger LOGGER = Logger.getLogger("UserServiceImpl");

    @Autowired
    private UserDao userDao;

    @Override
    public int saveUsersAsTextFile(String path) {
        List<User> users = userDao.getUsers();

        // 비즈니스 로직
        try (FileOutputStream fileOutputStream = new FileOutputStream(path)) {
            StringBuilder result = new StringBuilder();
            for(User user : users) {
                result.append(user);
                result.append('\n');
            }

            fileOutputStream.write(result.toString().getBytes());
        } catch (IOException exception) {
            LOGGER.log(Level.SEVERE, "파일을 쓸 수 없습니다.");
            throw new IllegalStateException(String.format("Can't write a file. path: %s", path));
        }

        return users.size();
    }
}

 

 

<참고>

https://lazymankook.tistory.com/30

 

DAO, DTO, Service

Spring Framework의 MVC에서 Model은 Service, DAO, DTO로 나눌 수 있다. 한 번 살펴보자. DAO Data Access Object의 줄임말이다. DB를 사용해 데이터를 조회하거나 조작하는 기능을 담당하는 것들을 DAO라고 부른..

lazymankook.tistory.com

 

DTO 중첩 클래스

1. 꼭 내부 클래스로 유지하지 않아도 됩니다. 같은 패키지에 클래스를 꺼내두어도 됩니다.

2. 여러 조회 API를 제공해도, 변경 시점에 같이 변해야 하는 DTO는 같이 사용하면 됩니다.

3. 변경 시점에 함께 변하면 안되는 DTO는 모양이 똑같더라도, 별도의 클래스로 생성합니다.

중요한 것은 함께 변해야 하는 것은 같이 묶고, 함께 변하면 안되는 것은 아무리 코딩량이 많아져도 따로 만들어야 합니다. 이게 중요합니다^^!

 

 

https://velog.io/@ausg/Spring-Boot%EC%97%90%EC%84%9C-%EA%B9%94%EB%81%94%ED%95%98%EA%B2%8C-DTO-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0