안녕하세요~ F4의 프린스초이입니다. 이번 파이널 프로젝트를 진행하던 중! 스프링 패키지 구조와 흐름에 있어서 초반에 감을 잡기 어려운 부분이 있었는데요. 프로젝트의 흐름을 파악하고 구조에서 사용되는 개념들에 대해 학습하고 공유하고자 이번 글을 작성하게 되었습니다. 부족한 부분이 있거나 이해가 가지 않는 부분이 있으시다면! glqkfl7845@gmail.com 으로 말씀해주시면 감사하겠습니다 😉


📌프로젝트 패키지 구조

흐름

  • 이렇게 계층을 나누어 관리하는 것이 유지 보수하기에 용이하며 디버깅하기도 쉽기 때문에 대중적으로 사용되는 스프링 프로젝트의 구조입니다. 구조에서 사용되는 개념들에 대해서 살펴보도록 하겠습니다.

📌DTO란?

  • 클라이언트와 서버 간의 통신을 위한 객체로 로직을 가지지 않는 순수한 데이터 객체이다. 프로젝트에서는 RequestDto, ResponseDto로 요청과 응답에 대한 DTO를 작성하였습니다.

📌DTO 왜 사용할까?

  • 중요한 정보를 노출시키지 않고 클라이언트와 서버 간의 통신을 원활하게 해주기 때문입니다. 예를 들어서 유저 객체를 꺼냈다면 비밀번호 같은 정보가 들어있을텐데, 이렇게 외부에 노출되어서는 안 될 정보 말고 필요한 것만 담아서 보내줄 수 있습니다.
  • View Layer와 DB Layer의 역할을 분리하기 위해서도 사용됩니다, 객체를 표현하기 위한 계층(DTO)과 저장하는 계층의 역할(Entity)을 분리하기 위해서 사용합니다.

📌DTO와 Entity간에 변환을 하는 이유?

  • DTO는 클라이언트와의 데이터 통신을 위한 객체이고, Entity는 데이터 저장을 위한 객체입니다.
  • Entity는 데이터베이스의 테이블과 1:1로 매핑됩니다. 따라서 모든 정보를 담고 있는데, DTO를 사용해서 클라이언트가 필요로 하는 최소한의 데이터를 전송하여 네트워크 부하를 줄일 수 있습니다.

📌DAO란?

  • DB에 접근하는 객체로 DAO는 Service와 DB를 연결하는 역할을 합니다.DB에서 데이터를 꺼내고, 넣는다고 생각하시면 될 것 같습니다.
  • JPA에서는 Repository가 DAO의 역할을 한다고 볼 수 있습니다.

📌Controller란?

  • 이 패키지 구조에서 컨트롤러는 client의 요청을 DTO의 형태로 받아 Service의 기능을 호출하고 서비스 계층에서 비즈니스 로직이 처리되면 적절한 응답을 DTO의 형태로 반환하는 역할을 합니다.

📌Service란?

  • Service 계층은 DTO를 통해 받은 데이터를 이용해 비즈니스 로직을 처리하고, DAO(혹은 Repository)를 통해 DB에 접근하여 데이터를 관리하는 역할을 합니다.

📌예시

  • 다음은 위에서 설명한 패키지 구조를 이용하여 User정보를 생성하는 예시입니다. 클라이언트에서 UserControllercreateUser 메서드를 호출하면, UserDTO를 기반으로 User 엔티티를 생성하고 이를UserRepository를 통해 저장하는 과정입니다.

public class UserDTO {
    private String username;
    private String email;
    private String password; // 중요한 정보: 비밀번호
}
/*
UserDTO 클래스는 클라이언트로부터 전달받은 사용자 정보를 담는 데이터 전송 객체입니다.
username과 email 필드를 가지고 있습니다.
*/


public class UserController {
    private UserService userService = new UserService();

    public User createUser(UserDTO userDTO) {
        return userService.createUser(userDTO);
    }
}
/*
UserController 클래스는 UserService 객체를 생성하고,
클라이언트로부터 받은 UserDTO를 이용하여 UserService의 createUser 메서드를 호출하여
새로운 사용자를 생성하고 생성된 사용자 정보를 반환합니다.
*/


public class UserService {
    private UserRepository userRepository = new UserRepository();

    public User createUser(UserDTO userDTO) {
        User newUser = new User(userRepository.getNextId(), userDTO.getUsername(), userDTO.getEmail());
        return userRepository.save(newUser);
    }
}
/*
UserRepository를 이용하여 새로운 사용자를 생성하고 저장하는 역할을 수행합니다.
클라이언트가 보낸 UserDTO 정보를 활용하여 새로운 User 객체를 생성하고,
해당 객체를 UserRepository의 save 메서드로 저장한 후, 생성된 사용자 정보를 반환합니다.

*/


import java.util.ArrayList;
import java.util.List;

public class UserRepository {
    private List<User> users = new ArrayList<>();
    private int nextId = 1;

    public User save(User user) {
        user.setId(nextId);
        users.add(user);
        nextId++;
        return user;
    }
}
/*
UserRepository 클래스는 사용자 정보를 메모리에 저장하고 관리하는 역할을 합니다.
save(User user) 메서드를 통해 사용자 정보를 리스트에 추가하고 저장합니다.
*/


public class User {
    private int id;
    private String username;
    private String email;
}
/*
User 클래스는 실제 사용자 정보를 나타내는 엔티티입니다.
id, username, email 필드를 가지고 있습니다.
엔티티는 데이터베이스에 저장되거나 관리될 수 있는 개체입니다.
*/



📌정리

  • DTO : 데이터를 정리해서 운반하는 역할로 클라이언트와 서버 간에 데이터 교환을 위해 사용
  • Controller : 클라이언트와 서버 소통의 역할로 요청과 응답을 조율
  • Service : 비즈니스 로직을 처리하고 데이터 관리를 수행하는 역할로 데이터 처리 과정에서 필요한 작업을 수행
  • Repository(DAO) : 데이터베이스 접근을 관리하는 역할
  • Entity : 데이터를 담는 역할로 데이터베이스의 테이블과 매핑되는 객체

앞으로도 프로젝트를 진행하면서 학습한 부분을 포스팅 할 예정이니 관심 있게 지켜봐주셨으면 좋겠습니다! 저의 글을 읽어주셔서 감사합니다. 또 만나요😉



📌참고

https://code-lab1.tistory.com/201