MVC 구조
Model: 데이터와 비즈니스 로직을 처리한다.
View: 사용자 인터페이스를 제공하여 데이터를 표시한다.
Controller: 사용자 요청을 처리하고 모델과 뷰를 연결한다.
1. Model
Model은 애플리케이션의 데이터 구조와 비즈니스 로직을 담당한다.
package com.board.menus.vo;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MenuVo {
@NonNull
private String menu_id;
private String menu_name;
private int menu_seq;
}
MenuVo.java:
메뉴 데이터를 담는 VO(Value Object)이다. 메뉴 ID, 이름, 순서 등의 필드를 가지고 있으며, getter와 setter 메서드를 통해 데이터에 접근할 수 있다.
@Mapper
public interface MenuMapper {
List<MenuVo> getMenuList();
void insertMenu(MenuVo menuVo);
void insertMenu2(MenuVo menuVo);
void deleteMenu(MenuVo menuVo);
MenuVo getMenu(String menu_id);
void updateMenu(MenuVo menuVo);
}
MenuMapper.java:
MyBatis를 통해 SQL 쿼리를 실행하는 인터페이스, 메뉴 데이터를 데이터베이스에서 가져오는 역할
데이터베이스의 메뉴 데이터를 CRUD(Create, Read, Update, Delete) 작업을 수행하는 메서드를 포함하고 있다.
이 인터페이스는 @Mapper 어노테이션을 통해 MyBatis와 연결되며, 각각의 메서드는 MyBatis XML 파일에서 정의된 SQL 쿼리와 연결되어, 해당 작업을 처리한다. 예를 들어, getMenuList() 메서드는 manuMapper.xml에서 id가 getManuList인 태그와 연계된다.
<mapper namespace="com.board.menus.mapper.MenuMapper">
<select id="getMenuList" resultType="com.board.menus.vo.MenuVo">
SELECT MENU_ID, MENU_NAME, MENU_SEQ
FROM MENUS
ORDER BY MENU_SEQ ASC
</select>
<select id="getMenu">
SELECT MENU_ID, MENU_NAME, MENU_SEQ
FROM MENUS
WHERE MENU_ID=#{menu_id}
</select>
<insert id="insertMenu">
INSERT INTO MENUS (MENU_ID, MENU_NAME, MENU_SEQ)
VALUES (#{menu_id}, #{menu_name}, #{menu_seq})
</insert>
<insert id="insertMenu2">
INSERT INTO MENUS (MENU_ID, MENU_NAME, MENU_SEQ)
VALUES (
(SELECT 'MENU' ||
TRIM(TO_CHAR(NVL(MAX(SUBSTR (MENU_ID ,5,
2)),0)+1,'00'))
FROM MENUS),
#{menu_name},
(SELECT NVL(MAX(MENU_SEQ), 0)+1
FROM MENUS)
)
</insert>
<delete id="deleteMenu">
DELETE FROM MENUS
WHERE MENU_ID = #{menu_id}
</delete>
<update id="updateMenu">
UPDATE MENUS
SET MENU_NAME=#{menu_name}, MENU_SEQ=#{menu_seq}
WHERE MENU_ID=#{menu_id}
</update>
</mapper>
MenuMapper.xml:
MenuMapper의 메서드와 연결된 SQL 쿼리를 정의하는 XML 파일입니다. 각 메서드는 SQL 쿼리와 매핑되어 데이터베이스와의 통신을 담당한다.
<select id="getMenuList" resultType="com.board.menus.vo.MenuVo">:boot에서는 resultType이 필수가 아니므로 생략이 가능하다.
2. View
View는 사용자에게 데이터를 표시하는 역할을 하며, JSP 파일로 구성된다.
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" type="image/png" href="/img/favicon.png" />
<link rel="stylesheet" href="/css/common.css" />
<script src="https://cdn.jsdelivr.net/npm/browser-scss@1.0.3/dist/browser-scss.min.js"></script>
</head>
<body>
<main>
<h2>메뉴 목록(${msg})</h2>
<table>
<tr>
<td>메뉴 아이디</td>
<td>메뉴 이름</td>
<td>메뉴 순서</td>
<td>삭제</td>
<td>수정</td>
</tr>
<tr>
<td colspan="5">
[<a href="/Menus/WriteForm">메뉴 등록</a>]
[<a href="/Menus/WriteForm2">메뉴 등록2</a>]
</td>
</tr>
<!-- for문을 대신하기 위해 만든 라이브러리 -->
<!-- c: : <퍼센트>를 대신함. 달러: model 의 값을 들고옴 -->
<c:forEach var="menu" items="${menuList}">
<tr>
<td>${menu.menu_id}</td><!-- 자동 getter 실행 getMenu_id() -->
<td>${menu.menu_name}</td>
<td>${menu.menu_seq}</td>
<td><a href="/Menus/Delete?menu_id=${menu.menu_id}">삭제</a></td>
<td><a href="/Menus/UpdateForm?menu_id=${menu.menu_id}">수정</a></td>
</tr>
</c:forEach>
</table>
</main>
</body>
</html>
list.jsp:
메뉴 목록을 출력하는 JSP 파일이다. c:forEach 태그를 사용해 메뉴 목록을 반복 출력한다. 또한, 새로운 메뉴를 추가하거나 수정 및 삭제할 수 있는 링크를 제공한다. 이 JSP 파일은 프론트엔드에서 사용자와 상호작용하는 UI를 담당한다.
<body>
<main>
<h2>메뉴 등록2</h2>
<form action="/Menus/Write2" method="POST">
<table>
<tr>
<td>메뉴 이름</td>
<td><input type="text" name="menu_name" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="추가" />
<input type="button" value="목록" id="goList" />
</td>
</tr>
</table>
</form>
<script>
const goListEl = document.getElementById("goList")
goListEl.onclick=function(){
location.href='/Menus/List'
}
</script>
</main>
</body>
</html>
write.jsp :
이 JSP 파일들은 새로운 메뉴를 등록하는 폼을 제공한다. write.jsp는 자동으로 메뉴 ID와 순서를 생성하여 메뉴 이름만 입력받아 등록한다. 이 파일들은 사용자로부터 입력을 받아 서버로 전송하는 역할을 한다.
<body>
<main>
<h2>메뉴 수정</h2>
<form action="/Menus/Update" method="POST">
<table>
<tr>
<td>메뉴 아이디</td>
<td><input type="text" name="menu_id" value="${menu.menu_id}" readonly/></td>
</tr>
<tr>
<td>메뉴 이름</td>
<td><input type="text" name="menu_name" value="${menu.menu_name}"/></td>
</tr>
<tr>
<td>메뉴 순서</td>
<td><input type="text" name="menu_seq" value="${menu.menu_seq}"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="수정" />
<input type="button" value="목록" id="goList" />
</td>
</tr>
</table>
</form>
<script>
const goListEl = document.getElementById("goList")
goListEl.onclick=function(){
location.href='/Menus/List'
}
</script>
</main>
</body>
</html>
update.jsp
: 이 JSP 파일은 기존 메뉴를 수정하는 폼을 제공한다. 사용자가 수정할 메뉴의 정보를 입력하면, 해당 데이터를 서버로 전송하여 메뉴 정보를 수정하는 역할을 한다.
3. Controller
Controller는 사용자 요청을 처리하고 모델과 뷰를 연결하는 역할을 한다.
@Controller
public class HomeController {
// http://localhost:9090
@RequestMapping("/")
public String home() {
return "home";
//return "WEB_INF/views/home.jsp";
}
}
HomeController.java
: 이 클래스는 홈 화면을 처리하는 Spring MVC 컨트롤러이다. 사용자가 http://localhost:9090/으로 접속하면 home() 메서드가 호출되고, "home"이라는 문자열을 반환한다. 이 문자열은 JSP 파일과 연결되며, 실제로는 application.properties에 설정된 기본 경로에 따라 home.jsp 파일이 렌더링된다. 즉, 홈 페이지 요청을 처리하여 JSP 화면을 출력하는 역할을 한다.
@Controller
@RequestMapping("/Menus")
public class MenuController {
}
MenuController.java
: 메뉴 관리 기능을 처리하는 컨트롤러. 각 메서드는 MenuMapper를 통해 데이터베이스와 상호작용한다.
@Autowired
private MenuMapper menuMapper;
- MenuMapper타입의 menuMapper 인터페이스 또는 클래스
- MyBatis에서 사용할 SQL 쿼리를 xml에 정의한 뒤 mybatis한테 부탁해서 MenuMapper.java를 통해 arraylist로 돌려달라는 뜻
- 메뉴 기능을 담당할 menumapper
@RequestMapping("/List")
public String list(Model model) {
List<MenuVo> menuList = menuMapper.getMenuList();
// 조회 결과를 넘겨준다 (Model 객체에 담아서)
model.addAttribute("msg", "하하");
model.addAttribute("menuList", menuList);
return "menus/list";
}
- Model model: Spring MVC에서 뷰에 데이터를 전달하기 위한 모델 객체
- 메뉴 목록 조회 : mapper를 통해서 mybatis가 한다.
- List<MenuVo> menuList = menuMapper.getMenuList(); : MenuMapper.java파일(인터페이스)이 menuMapper.xm의 id인 getMenuList를 호출하여 메소드 취급한다.
- MyBatis는 MenuMapper.xml에 정의된 SQL 쿼리를 실행하고, 조회된 결과를 Model객체에 매핑한다.
- model.addAtribute("menuList", menuList): 조회한결과를 ArrayList 로 돌려준다. jsp파일에서 menuList가 items로 쓰이게 된다.
- return: 모델에 변수를 담아서 menus폴더의 list.jsp로 넘겨준다.
// /Menus/WriteForm
@RequestMapping("/WriteForm")
public String writeForm() {
return "menus/write";
}
// Menus/Write
// Menus/Write?menu_id=MENU04&menu_name=JavaScript&menu_seq=4
@RequestMapping("/Write")
public String write(MenuVo menuVo, Model model) { // SpringParamter참고
// 넘어오는 값을 받아서 db에 저장하고
menuMapper.insertMenu(menuVo);
return "redirect:/Menus/List";
}
- list.jsp에서 출력할 data를 조회하여 ArrayList 로 돌려준 뒤 model에 담는다. List<MenuVo>
- MenuVo menuVo는 특정한 데이터 구조를 정의하는 객체이며 Spring은 URL 쿼리 파라미터를 자동으로 이 객체에 연결한다.
- redirect: 목록보기 페이지(/Menus/List 경로)로 이동
///Menus/Delete?menu_id=
// 삭제기능
@RequestMapping("/Delete")
public String delete(MenuVo menuVo, Model model) { // SpringParamter참고
// 메뉴삭제
menuMapper.deleteMenu(menuVo);
//목록 조회
return "redirect:/Menus/List";
}
1번방법
@RequestMapping("/Delete")
public String delete(String menu_id) { // SpringParamter참고
// 삭제할 메뉴 아이디를 받아와서 mapper를삭제하고
menuMapper.deleteMenu(menu_id);
//목록 조회
return "redirect:/Menus/List";
}
2번 방법
//http://localhost:9090/Menus/UpdateForm?menu_id=MENU03
// 수정기능
@RequestMapping("/UpdateForm")
public String updateForm(MenuVo menuVo, Model model) {
MenuVo menu = menuMapper.getMenu(menuVo.getMenu_id());
model.addAttribute("menu", menu);
System.out.println(menu);
return "menus/update";
}
@RequestMapping("/Update")
public String update(MenuVo menuVo) { // SpringParamter참고
//수정하기
menuMapper.updateMenu(menuVo);
//목록 조회
return "redirect:/Menus/List";
}
- menuMapper.getMenu(menuVo.getMenu_id()): 데이터베이스에서 해당 menu_id에 대한 메뉴 정보를 조회한다. 이 메서드는 MyBatis의 Mapper 메서드로, SQL 쿼리를 실행하여 결과를 MenuVo 객체로 반환한다.
'SPRING' 카테고리의 다른 글
[spring] 회원가입 - 아이디 중복 체크하기 (0) | 2024.10.13 |
---|---|
[spring] 파라미터 다루기 (0) | 2024.10.10 |
[spring] 스프링 부트 Controller (0) | 2024.10.08 |
[spring] Spring Framework에서의 datasource 설정 및 Spring Boot migration (2) | 2024.10.04 |
[spring]Payload,Parameter, Attribute들의 관계 (2) | 2024.10.01 |