MVC구조 & Controller, Service, DAO, VO

 

간단한 코드와 함께 자세히 알아보도록 하겠습니다.

 

MVC

MVC(Model-View-Controller) 는 소프트웨어를 설계할 때 사용되는 구조적인 디자인 패턴 입니다.


MVC 에 대한 설명

Model

모델은 프로그램의 데이터와 로직을 담당하는 부분입니다.
즉 실제로 저장하거나 처리해야 하는 정보를 다루는 곳입니다.
예를 들어, 회원가입 시스템이라면, 사용자 정보를 저장하고 관리하는 역할을 합니다.
데이터 추가, 수정, 삭제하는 기능도 모델에서 처리합니다.

 

Model 은 아래에서 설명하는 VO, DAO 가 포함되는 개념입니다.

View

뷰는 사용자에게 보여지는 화면을 담당합니다.
HTML, CSS, JavaScript 같은 걸 이용해서 사용자에게 데이터를 어떻게 보여줄지 결정합니다.
예를 들어, 웹사이트에서 로그인 화면, 버튼, 입력창 같은 것들입니다. 중요한 점은, 뷰는 데이터를 보여주는 역할만 하고, 계산이나 로직은 하지 않습니다.

 

// 사용자 목록 페이지

<!DOCTYPE html>
<html>
<head>
    <title>User List</title>
</head>
<body>
    <h1>User List</h1>
    <table border="1">
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Email</th>
        </tr>
        <c:forEach var="user" items="${users}">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.email}</td>
            </tr>
        </c:forEach>
    </table>
    <a href="/users/add">Add New User</a>
</body>
</html>

 

// 사용자 추가 페이지

<!DOCTYPE html>
<html>
<head>
    <title>Add User</title>
</head>
<body>
    <h1>Add User</h1>
    <form action="/users/add" method="post">
        <label for="name">Name:</label>
        <input type="text" id="name" name="name" required>
        <br>
        <label for="email">Email:</label>
        <input type="email" id="email" name="email" required>
        <br>
        <button type="submit">Add User</button>
    </form>
</body>
</html>

Controller 

컨트롤러는 사용자의 요청을 처리하고, 모델과 뷰를 연결해주는 역할을 합니다.
사용자가 어떤 행동을 했을 때, 그걸 모델이나 뷰에게 전달합니다.
예를 들어, 사용자가 로그인 버튼을 눌렀다고 하면, 컨트롤러가 이 정보를 모델에 전달해서 데이터베이스에서 사용자 정보를 확인하고, 그 결과를 다시 뷰로 보냅니다.

 

@Controller
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserDAO userDAO;

    // 사용자 목록 보기
    @GetMapping
    public String getAllUsers(Model model) {
        List<UserVO> userList = userDAO.getAllUsers();
        model.addAttribute("users", userList); // 뷰에 전달할 데이터 설정
        return "userList"; // userList.jsp로 이동
    }

    // 사용자 추가 화면 표시
    @GetMapping("/add")
    public String showAddUserForm() {
        return "addUser"; // addUser.jsp로 이동
    }

    // 사용자 추가 처리
    @PostMapping("/add")
    public String addUser(@ModelAttribute UserVO user) {
        userDAO.addUser(user);
        return "redirect:/users"; // 사용자 목록 페이지로 리다이렉트
    }
}

 

MVC 를 사용하는 이유

역할 분담

각 역할이 독립적이기 때문에 문제가 생겼을 대 수정하기 쉽습니다.

유지보수 용이

뷰를 수정해도 모델이나 컨트롤러에 영향을 주지 않습니다.

재사용성

모델과 컨트롤러는 여러 다른 뷰에서 사용할 수 있습니다.

 

DAO & VO

DAO

DAO 는 데이터베이스와 연결해서 데이터를 가져오거나, 추가 / 수정 / 삭제하는 작업을 처리하는 전문가 역할을 합니다.
주로 SQL 쿼리를 작성하고 실행해서 데이터를 처리하고, 데이터베이스와 직접 대화하는 역할이라고 생각하시면 됩니다.
이러한 DAO 는 데이터베이스와의 작업을 코드의 다른 부분과 분리해서 더 깨끗하고 체계적인 코드를 작성할 수 있습니다.
또한 데이터를 어떻게 저장하고 불러오는지 숨길 수 있기 때문에 보안에도 유리합니다.

 

@Repository
public class UserDAO {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 모든 사용자 정보 가져오기
    public List<UserVO> getAllUsers() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(UserVO.class));
    }

    // 사용자 추가
    public int addUser(UserVO user) {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        return jdbcTemplate.update(sql, user.getName(), user.getEmail());
    }
}

 

VO

VO 는 프로그램에서 사용하는 데이터를 담는 그릇입니다.
데이터베이스에서 가져온 데이터를 저장하거나, 데이터를 다른 계층에 전달할 때 사용합니다.
에를 들어, "사용자" 라는 개념이 있다면 이름, 이메일, 나이 같은 정보를 VO 객체에 담아서 관리합니다.

 

public class UserVO {
    private int id;
    private String name;
    private String email;

    // 기본 생성자
    public UserVO() {}

    // 매개변수 생성자
    public UserVO(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // Getter와 Setter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "UserVO [id=" + id + ", name=" + name + ", email=" + email + "]";
    }
}



DAO 와 VO 를 사용하는 이유

1. 분업화
DAO 는 데이터베이스와 대화만 하고, VO 는 데이터를 보관하고 전달하는 역할만 하므로 서로의 역할이 명확합니다.

2. 유지보수 편리
데이터를 처리하는 로직과 데이터를 저장하는 구조가 분리되니 수정할 때 한쪽만 고치면 됩니다.

3. 재사용성
VO 는 여러 군데에서 데이터를 전달할 때 사용할 수 있고, DAO 는 다양한 데이터베이스 작업을 처리하는 데 재사용이 가능합니다.

정리하자면 DAO 는 데이터베이스와 대화하는 "주방장". 데이터를 가져오거나 저장하는 일을 담당이며, VO 는 데이터를 저장하고 전달하는 "그릇". 데이터를 담고 다른 곳으로 전달합니다.

'Java' 카테고리의 다른 글

제어자  (0) 2024.12.04
로깅(Logging)  (0) 2024.11.30
해시맵(HashMap)  (1) 2024.11.29
MyBatis  (0) 2024.11.21
웹 서버와 WAS 의 차이  (0) 2024.11.17