java 공부를 하게 되면 보통 게시판을 만들게 되는데, mvc 패턴이라는게 책이나, 수업 자료에 꼭 있기 마련이다.
사람이 받아쓰기를 할 때 음성이 들리면 종이에 문자를 적어서 보여주는 것 처럼
이런 행동들을 순서, 양식에 맞게 패턴을 만드는 것
다시 말해 개발 패턴이 Model , View, Controller 3개로 패턴이 흘러간다는 것이다.
MVC 패턴
Model-View-Controller 의 약자
처음 배우는 입장에서 패턴은 익숙치 않고, 거부감이 들었다.
돌이켜보면, 리마인드 하는게 좋을 듯 하여 글을 쓰게 되었다.
MVC 모델은 2가지로 나뉘는데 MVC MODEL 1 은 예전 모델이다.
View 의 역할이 불분명하여 비지니스 로직이 view의 영역에 침범하는 경우가 있다.
예를 들어서 JSP 가 있다.
<body>
<h1>상품 목록</h1>
<table border="1">
<tr>
<th>상품 ID</th>
<th>상품 이름</th>
<th>가격</th>
</tr>
<%
// 비즈니스 로직: 데이터베이스 연결 및 데이터 조회
String jdbcUrl = "jdbc:mysql://localhost:3306/shop";
String dbUser = "root";
String dbPassword = "password";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPassword);
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT id, name, price FROM products");
while (rs.next()) {
%>
<tr>
<td><%= rs.getInt("id") %></td>
<td><%= rs.getString("name") %></td>
<td><%= rs.getDouble("price") %></td>
</tr>
<%
}
} catch (Exception e) {
out.println("데이터를 불러오는 중 오류가 발생했습니다: " + e.getMessage());
} finally {
if (rs != null) try { rs.close(); } catch (SQLException e) {}
if (stmt != null) try { stmt.close(); } catch (SQLException e) {}
if (conn != null) try { conn.close(); } catch (SQLException e) {}
}
%>
</table>
</body>
이렇게 VIEW 만 해줘도 어지러울 판에 DB 연결부터 데이터 호출까지...
유지 보수도 어렵고, 인수 인계도 어려운 이 모델을 언제까지 사용할 순 없었던 것 같다.
그렇게 MVC MODEL 2가 나오게 되는데...
MVC MODEL 2 흐름도
(Servlet -> JSP 이렇게 역할이 나뉜 것 밖에 바뀐 건 없다)
바뀐 점 :
1. Controller 는 명령만 내리는 구조로 변경
2. View 는 보여주는 역할만.
의문점
1. JSP 는 MODEL 2 에 적합하지 않은건가? MVC 2 패턴으로 개발할거면 mustache 만 사용해야하나 ?
-> 그냥 비지니스 로직을 포함하지 않고, view에 충실하면 jsp도 상관 없다.
2. 그럼 View를 제외한 녀석들은 mvc2 패턴을 지키려면 어떻게 해야하지 ?
-> 위와 같은 맥락으로, view 역할만 할 수 있게끔 해주면 된다.
예를 들어서 jsp 를 사용한다고 했을 때
isActive 를 붙여서 나오기보다는
DTO에서 데이터 가공을 마친 후 View 단에 던져주는 것이 좋다는 것!
<body>
<h1>사용자 목록</h1>
<table border="1">
<tr>
<th>사용자 ID</th>
<th>이름</th>
<th>가입 상태</th>
</tr>
<%
// Controller가 전달한 users 목록을 처리
List<Map<String, Object>> users = (List<Map<String, Object>>) request.getAttribute("users");
for (Map<String, Object> user : users) {
int userId = (int) user.get("id");
String name = (String) user.get("name");
boolean isActive = (boolean) user.get("isActive");
// 비즈니스 로직: 가입 상태를 조건에 따라 가공
String status = isActive ? "활성" : "비활성";
%>
<tr>
<td><%= userId %></td>
<td><%= name %></td>
<td><%= status %></td>
</tr>
<%
}
%>
</table>
</body>
결론
MVC 2 는 각자 역할이 정확히 분리되어있기 때문에
특정 로직을 변경하거나, VIEW 의 디자인 수정이 필요할 때 등등
명확히 고쳐야 할 부분을 쉽게 찾을 수 있다.
이건 결국 유지 보수에 용이하고, 협업에도 큰 도움이 된다.
결국 현업에서 사용하기 좋은 개발 패턴이고
결국 결국 결국 회사 가서 쓰기 때문에 중요하고 공부해놔야 하는 가장 기본적인 내용이였던 것이다...!
또 전체적인 흐름을 알아야 개발이 되니까...
근데.......일하면서 MVC 패턴 1 으로 (또는2) 개발 할건가요? 뭐 이딴 대화는 해본 적 없긴 하다..
'스프링' 카테고리의 다른 글
[SPRING] JPA는 현업에서 많이 쓰일까 ? (1) | 2024.11.16 |
---|---|
[인텔리제이] 프로젝트 세팅이 귀찮을 때 꿀팁 방출 : 프로젝트 복사 쉽게하는 법 (1) | 2024.10.16 |
[Spring Boot -5] 스프링 부트가 개발자에게 직접적으로 주는 장점[3] root-context.xml (0) | 2024.04.11 |
[Spring Boot -4] 스프링 부트가 개발자에게 직접적으로 주는 장점[2] servlet-context.xml (0) | 2024.04.05 |
[Spring Boot -3]스프링 부트가 개발자에게 직접적으로 주는 장점[1] Web.xml (0) | 2024.03.27 |