간단한 코드와 함께 자세히 알아보도록 하겠습니다.
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 |