드롭다운 메뉴 만들고 샘플데이터 뷰 로 전송하기
1. Service(서비스 - 업무 로직) 클래스 활용
2. Controller(컨트롤러 - 화면 & 업무로직 중간 역할(리모콘 역할)) 클래스 활용
3. Views(All().jsp) 데이터 활용
정보 테이블을 이용하여 드롭다운 메뉴 만들고 샘플데이터 뷰(jsp)로 전송하기
- 전체 조회
- 상세(1건) 조회
- 저장
- 추가 및 저장(add 생성 버튼 & Submit 제출 버튼)
- 수정(edition에서 업데이트 버튼 및 url 추가해보기)
- 삭제(edition에서 업데이트 버튼 및 url 추가해보기)
- 서비스 클래스 (Service Class): 역할: 서비스 클래스는 비즈니스 로직을 수행하는 데 사용됩니다.
비즈니스 로직은 애플리케이션의 핵심 기능과 데이터 처리와 관련된 작업을 수행하는 로직을 나타냅니다.
특징: 데이터베이스와 상호작용하는 등의 복잡한 작업을 처리합니다. 여러 컨트롤러에서 재사용되는 로직을 캡슐화합니다. 주로 트랜잭션 관리, 예외 처리, 데이터 처리, 외부 시스템과의 통합 등을 다루는 역할을 합니다.
예시: 회원 관리 시스템의 서비스 클래스는 회원 등록, 조회, 수정, 삭제와 관련된 로직을 구현할 수 있습니다.
- 컨트롤러 클래스 (Controller Class): 역할: 컨트롤러 클래스는 클라이언트의 요청을 받고 처리하는 역할을 합니다. 웹 애플리케이션의 사용자 인터페이스와 상호작용하며 요청을 처리하고 응답을 생성합니다.
특징: HTTP 요청을 수신하고 해당 요청을 적절한 서비스 클래스로 라우팅합니다. 요청 파라미터를 읽어와 서비스 클래스에 전달하고, 서비스 클래스로부터 받은 데이터를 뷰로 전달하여 클라이언트에게 응답합니다. 주로 URL 매핑, 세션 관리, 입력 유효성 검사, 뷰 선택 등과 관련된 역할을 합니다.
예시: 회원 관리 시스템의 컨트롤러 클래스는 웹 페이지에서 회원 정보를 입력받고, 해당 요청을 처리하는 역할을 합니다.
서비스 클래스와 컨트롤러 클래스는 Spring Framework와 같은 웹 애플리케이션 프레임워크에서 주로 사용됩니다. 이러한 클래스들은 애플리케이션의 모듈화와 유지보수를 향상시키며, 비즈니스 로직과 사용자 인터페이스 로직을 분리하여 코드를 더 쉽게 이해하고 유지할 수 있도록 도와줍니다.
logback 설치 :
resources 폴더에 로그백, 로깅 라이브러리 추가하기 로깅 설정 파일 복사 방법
- log4jdbc.log4j2.properties, logback-spring.xml 기본 설정 파일 추가
- log4jdbc.log4j2.properties : sql 로그를 출력하기 위한 설정파일
- logback-spring.xml : logback 의 다양한 레벨 옵션 설정
링크 :
[Spring Boot] - [SpringBoot] 로그백, 로깅 라이브러리 logback , log4jdbc 설정
드롭다운 메뉴 css(디자인) 만들기
header.jsp & footer.jsp (부트스트랩 dropdown menu 소스 들고오기)
- webapp\WEB-INF\views\common 폴더 생성
- resources\static css 폴더 생성
- resources\static img 폴더 생성
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<!-- bootstrap css cdn -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<%-- main css import --%>
<link href="/css/main.css" rel="stylesheet">
</head>
<body>
<%-- todo: bootstrap dropdown menu --%>
<nav class="navbar navbar-expand-lg mb-4" style="background-color: #e3f2fd;">
<div class="container-fluid">
<a class="navbar-brand" href="#">
<%-- todo: img 기본 경로 : resources/static 임 : 절대경로로 넣을 것 --%>
<img src="/img/simple-coding.png" width="20" height="20"/>
Navbar
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<%-- 부서 시작--%>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
Dept
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/exam01/dept">Dept(Exam01)</a></li>
<li><a class="dropdown-item" href="/exam02/dept">Dept(Exam02)</a></li>
<li><a class="dropdown-item" href="/exam03/dept">Dept(Exam03)</a></li>
<li><a class="dropdown-item" href="/exam04/dept">Dept(Exam04)</a></li>
<li><a class="dropdown-item" href="/exam05/dept">Dept(Exam05)</a></li>
<li><a class="dropdown-item" href="/exam06/dept">Dept(Exam06)</a></li>
</ul>
</li>
<%-- 부서 끝--%>
<%-- 회원 시작--%>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
Member
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/exam01/member">Member(Exam01)</a></li>
<li><a class="dropdown-item" href="/exam02/member">Member(Exam02)</a></li>
<li><a class="dropdown-item" href="/exam03/member">Member(Exam03)</a></li>
<li><a class="dropdown-item" href="/exam04/member">Member(Exam04)</a></li>
<li><a class="dropdown-item" href="/exam05/member">Member(Exam05)</a></li>
<li><a class="dropdown-item" href="/exam06/member">Member(Exam06)</a></li>
</ul>
</li>
<%-- 회원 끝--%>
</ul>
</div>
</div>
</nav>
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%-- bootstrap js cdn --%>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"
integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4"
crossorigin="anonymous"></script>
</body>
</html>
더보기
/**/ main.css
* {
padding: 0;
margin: 0;
}
서비스 클래스_객체 전체 조회
부서 업무 서비스 클래스
- db 전체 조회 함수 호출
더보기
package com.example.modelexam.service.exam01;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : com.example.modelexam.service.exam01
* fileName : DeptService
* author : L.DH
* date : 2023-10-06
* description :
* 부서 업무 서비스 클래스, @Service, @Autowired, findAll()
* 요약 :
* TODO : @Service : 업무 로직 담당 클래스 위에 붙이는 어노테이션
* => 스프링 서버 가동될 때 그 클래스 생성해 둠(싱글톤)
* => 객체를 만들어서 함수를 쓸 때 : new 생성자함수()
* => 스프링에서는 하지 않고 미리 만들어 둔 객체를 받아서 사용함
* (참고 용어 IOC : 제어의 역전)
* 기타 : @Repository, @Compinent 등
*
* @Autowired : 스프링에서 미리 만들어 둔 객체를 가져오기
* 사용법 : 변수 위에 또는 생성자함수 위에 붙이는 가져올 수 있음
* (참고 용어 DI : 의존성 주입)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-06 L.DH 최초 생성
*/
@Service
public class DeptService {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
*
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* id(기본키)로 조회 : 상세조회(1건조회)
* @param dno
* @return
*/
public Dept findByid(long dno) {
// TODO : db 상세조회(1건조회) 함수 호출
// TODO : id(기본키)로 조회
Dept dept = deptDao.selectById(dno);
return dept;
}
}
컨트롤러 클래스_객체 전체 조회
부서 컨트롤러 - 화면 & 업무로직 중간 역할(리모콘 역할)
- @Slf4j(최근) - 롬북, 로깅 라이브러리를 위한 어노테이션(디자인 패턴 : 퍼케이드(Facade) 패턴)
로깅 라이브러리 : log4j(구) -> log4j2(구-개선), logback -> 함수호출을 일원화 시켜주는 기능
사용법 : 클래스 위에 붙이면 사용가능 : log.정보
(간략정보 : Error -> Info -> Debug(중간정도의 정보) -> Warn -> Trace : 상세정보)
더보기
package com.example.modelexam.controller.exam01;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam01.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
/**
* packageName : com.example.modelexam.controller.exam01
* fileName : DeptController
* author : L.DH
* date : 2023-10-10
* description : 부서 컨트롤러 - 화면 & 업무로직 중간 역할(리모콘 역할)
* @Slf4j, findAll()
* 요약 : Service 객체의 전체조회 함수 호출
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-10 L.DH 최초 생성
*/
// TODO : @Slf4j(최근) - 롬북, 로깅 라이브러리를 위한 어노테이션(디자인 패턴 : 퍼케이드(Facade) 패턴)
// 로깅 라이브러리 : log4j(구) -> log4j2(구-개선), logback -> 함수호출을 일원화 시켜주는 기능
// 사용법 : 클래스 위에 붙이면 사용가능 : log.정보
// (간략정보 : Error -> Info -> Debug(중간정도의 정보) -> Warn -> Trace : 상세정보)
// logback 설치 :
// 1) log4jdbc.log4j2.properties, logback-spring.xml 기본 설정 파일 추가
// - log4jdbc.log4j2.properties : sql 로그를 출력하기 위한 설정파일
// - logback-spring.xml : logback 의 다양한 레벨 옵션 설정
@Slf4j
@Controller
@RequestMapping("/exam01")
public class DeptController {
// TODO : MVC 의 Model(Service클래스) 객체 가져오기
@Autowired
DeptService deptService;
@GetMapping("/dept")
public String getDeptAll(Model model) {
// TODO : Service 객체의 전체조회 함수 호출
List<Dept> list = deptService.findAll();
model.addAttribute("list", list);
// TODO : 로그 찍기
log.debug(list.toString());
return "exam01/dept/dept_all.jsp";
}
}
뷰_객체 전체 조회
webapp\WEB-INF\views\common\exam01\dept
- 본문 꾸미기
- 테이블 형태로 화면 출력(데이터 반복문(forEach) 으로 받기)
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%-- TODO : header.jsp --%>
<jsp:include page="../../common/header.jsp"/>
<%-- TODO : 본문 --%>
<div class="container">
<h3>전달 받은 객체는 ${list} 입니다.</h3>
</div>
<script>
let obj = "${list}"
console.log(obj);
</script>
<%-- TODO : foter.jsp --%>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%-- TODO : header.jsp --%>
<jsp:include page="../../common/header.jsp"/>
<%-- TODO : 본문 --%>
<div class="container">
<h3>전달 받은 객체는 ${list} 입니다.</h3>
<%-- TODO : 테이블 형태로 화면 출력 --%>
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">위치</th>
<th scope="col">등록일자</th>
<th scope="col">수정일자</th>
</tr>
</thead>
<tbody>
<c:forEach var="data" items="${list}">
<tr>
<td>${data.dno}</td>
<td>${data.dname}</td>
<td>${data.loc}</td>
<td>${data.insertTime}</td>
<td>${data.updateTime}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<script>
let obj = "${list}"
console.log(obj);
</script>
<%-- TODO : foter.jsp --%>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>
상세(1건) 조회
서비스 상세조회 id(기본키)로 조회 : 상세조회(1건조회)
- 서비스 상세조회 호출 .findByid(변수);
-> http://localhost:8000/경로/변수
더보기
package com.example.modelexam.testdata;
import com.example.modelexam.model.Dept;
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
* packageName : com.example.modelexam.testdata
* fileName : SampleData
* author : kangtaegyung
* date : 2022/10/12
* description : 샘플 부서 데이터 클래스(DB 테이블 대체)
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2022/10/12 kangtaegyung 최초 생성
*/
@Component
@Getter
@Setter
public class SampleData {
List<Dept> list = new ArrayList<>();
public SampleData() {
Dept dept = Dept.builder()
.dno(10)
.dname("Accounting")
.loc("Pusan")
.build();
list.add(dept);
dept = Dept.builder()
.dno(20)
.dname("Marketing")
.loc("Seoul")
.build();
list.add(dept);
dept = Dept.builder()
.dno(30)
.dname("Sales")
.loc("DaeGu")
.build();
list.add(dept);
dept = Dept.builder()
.dno(40)
.dname("Development")
.loc("Seoul")
.build();
list.add(dept);
}
}
더보기
package com.example.modelexam.model;
import lombok.*;
/**
* packageName : com.example.modelexam.model
* fileName : Dept
* author : kangtaegyung
* date : 2022/10/12
* description : 부서 모델 클래스
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2022/10/12 kangtaegyung 최초 생성
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
public class Dept extends BaseTimeEntity {
// 부서넘버
private Integer dno;
// 부서이름
private String dname;
// 부서위치
private String loc;
@Builder
public Dept(Integer dno, String dname, String loc) {
super();
this.dno = dno;
this.dname = dname;
this.loc = loc;
}
}
더보기
package com.example.modelexam.service.exam02;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : com.example.modelexam.service.exam02
* fileName : Dept02Service
* author : L.DH
* date : 2023-10-06
* description : 서비스_상세(1건) 조회
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-06 L.DH 최초 생성
*/
@Service
public class Dept02Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* id(기본키)로 조회 : 상세조회(1건조회)
* @param dno
* @return
*/
public Dept findByid(long dno) {
// TODO : db 상세조회(1건조회) 함수 호출
// TODO : id(기본키)로 조회
Dept dept = deptDao.selectById(dno);
return dept;
}
}
더보기
package com.example.modelexam.controller.exam02;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam02.Dept02Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
/**
* packageName : com.example.modelexam.controller.exam02
* fileName : Dept02Controller
* author : L.DH
* date : 2023-10-10
* description : 컨트롤러_상세(1건) 조회
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-10 L.DH 최초 생성
*/
@Slf4j
@Controller
@RequestMapping("/exam02")
public class Dept02Controller {
// TODO : MVC 의 Model(Service클래스) 객체 가져오기
@Autowired
Dept02Service deptService;
@GetMapping("/dept")
public String getDeptAll(Model model) {
// TODO : Service 객체의 전체조회 함수 호출
List<Dept> list = deptService.findAll();
model.addAttribute("list", list);
// TODO : 로그 찍기
log.debug(list.toString());
return "exam02/dept/dept_all.jsp";
}
@GetMapping("/dept/{dno}")
public String getDeptId(@PathVariable long dno,
Model model
) {
// TODO : 서비스 상세조회 호출
Dept dept = deptService.findByid(dno);
model.addAttribute("dept", dept);
return "exam02/dept/dept_id.jsp";
}
}
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%-- TODO : header.jsp --%>
<jsp:include page="../../common/header.jsp"/>
<%-- TODO : 본문 --%>
<div class="container">
<%-- TODO : 테이블 형태로 화면 출력 --%>
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">위치</th>
<th scope="col">등록일자</th>
<th scope="col">수정일자</th>
</tr>
</thead>
<tbody>
<tr>
<td>${dept.dno}</td>
<td>${dept.dname}</td>
<td>${dept.loc}</td>
<td>${dept.insertTime}</td>
<td>${dept.updateTime}</td>
</tr>
</tbody>
</table>
</div>
<script>
let obj = "${dept}"
console.log(obj);
</script>
</div>
<%-- TODO : foter.jsp --%>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>
저장
1. Member03Service 클래스를 만들고 save() 함수를 정의
2. Member03Controller 클래스에서 createMember() 함수를 정의
3. Rest Client 툴로 데이터를 확인하기
더보기
package com.example.modelexam.service.exam03;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : com.example.modelexam.service.exam03
* fileName : Dept03Service
* author : L.DH
* date : 2023-10-06
* description : 서비스_부서 정보 저장 함수
* 요약 :
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-06 L.DH 최초 생성
*/
@Service
public class Dept03Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* id(기본키)로 조회 : 상세조회(1건조회)
* @param dno
* @return
*/
public Dept findByid(long dno) {
// TODO : db 상세조회(1건조회) 함수 호출
// TODO : id(기본키)로 조회
Dept dept = deptDao.selectById(dno);
return dept;
}
/**
* TODO 부서 정보 저장 함수
* @param dept
* @return
*/
public List<Dept> save(Dept dept) {
List<Dept> list = deptDao.insert(dept);
return list;
}
}
더보기
package com.example.modelexam.controller.exam03;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam03.Dept03Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* packageName : com.example.modelexam.controller.exam03
* fileName : Dept03Controller
* author : L.DH
* date : 2023-10-10
* description : 컨트롤러_Service 객체의 전체조회 함수 호출
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-10 L.DH 최초 생성
*/
@Slf4j
@Controller
@RequestMapping("/exam03")
public class Dept03Controller {
// TODO : MVC 의 Model(Service클래스) 객체 가져오기
@Autowired
Dept03Service deptService;
@GetMapping("/dept")
public String getDeptAll(Model model) {
// TODO : Service 객체의 전체조회 함수 호출
List<Dept> list = deptService.findAll();
model.addAttribute("list", list);
// TODO : 로그 찍기
log.debug(list.toString());
return "exam03/dept/dept_all.jsp";
}
@GetMapping("/dept/{dno}")
public String getDeptId(@PathVariable long dno,
Model model
) {
// TODO : 서비스 상세조회 호출
Dept dept = deptService.findByid(dno);
model.addAttribute("dept", dept);
return "exam03/dept/dept_id.jsp";
}
// TODO : @ResponseBody : 함수의 결과로 json 데이터를 리턴하고자 할 때 사용하는 어노테이션
// 사용법 : 함수의 위에 붙이기
@PostMapping("/dept")
@ResponseBody
public List<Dept> createDept(
@RequestBody Dept dept
) {
List<Dept> list = deptService.save(dept);
return list;
}
}
더보기
###
POST http://localhost:8000/exam03/dept
Content-Type: application/json
{
"dno": 50,
"dname": "Develop2",
"loc": "Pusan"
}
<> 2023-10-10T184134.200.json
추가 및 저장(add 생성 버튼 & Submit 제출 버튼)
- view post 방식으로 백엔드 연결
더보기
package com.example.modelexam.testdata;
import com.example.modelexam.model.Dept;
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
* packageName : com.example.modelexam.testdata
* fileName : SampleData
* author : kangtaegyung
* date : 2022/10/12
* description : 샘플 부서 데이터 클래스(DB 테이블 대체)
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2022/10/12 kangtaegyung 최초 생성
*/
@Component
@Getter
@Setter
public class SampleData {
List<Dept> list = new ArrayList<>();
public SampleData() {
Dept dept = Dept.builder()
.dno(10)
.dname("Accounting")
.loc("Pusan")
.build();
list.add(dept);
dept = Dept.builder()
.dno(20)
.dname("Marketing")
.loc("Seoul")
.build();
list.add(dept);
dept = Dept.builder()
.dno(30)
.dname("Sales")
.loc("DaeGu")
.build();
list.add(dept);
dept = Dept.builder()
.dno(40)
.dname("Development")
.loc("Seoul")
.build();
list.add(dept);
}
}
더보기
package com.example.modelexam.service.exam04;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : com.example.modelexam.service.exam04
* fileName : Dept04Service
* author : L.DH
* date : 2023-10-06
* description : 서비스_추가 및 저장
* 요약 : 객체의 전체 조회 함수 호출 add 버튼 및 데이터 추가해보기
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-06 L.DH 최초 생성
*/
@Service
public class Dept04Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
*
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* id(기본키)로 조회 : 상세조회(1건조회)
*
* @param dno
* @return
*/
public Dept findByid(long dno) {
// TODO : db 상세조회(1건조회) 함수 호출
// TODO : id(기본키)로 조회
Dept dept = deptDao.selectById(dno);
return dept;
}
/**
* TODO 부서 정보 저장 함수
*
* @param dept
* @return
*/
public List<Dept> save(Dept dept) {
/**
* 기존부서번호를 찾고 추가 부서번호 생성하여 저장하기
*/
List<Dept> list = null;
// TODO : insert 시 dno 자동 생성
// TODO : 기존 부서번호 max 찾아서 + 10
if (dept.getDno() == null) {
// TODO : 전체 조회해서 현재 배열의 크기 가져오기
int count = deptDao.selectAll().size();
// TODO : 새로운 부서번호 생성
int newDno = (count + 1) * 10;
// TODO : 새로운 부서번호 저장 : dept
dept.setDno(newDno);
// TODO : db 저장
list = deptDao.insert(dept);
}
return list;
}
}
더보기
package com.example.modelexam.controller.exam04;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam04.Dept04Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.view.RedirectView;
import java.util.List;
/**
* packageName : com.example.modelexam.controller.exam04
* fileName : Dept04Controller
* author : L.DH
* date : 2023-10-10
* description : 컨트롤러_추가 및 저장
* 요약 : 객체의 전체 조회 함수 호출 add 버튼 및 데이터 추가해보기
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-10 L.DH 최초 생성
*/
@Slf4j
@Controller
@RequestMapping("/exam04")
public class Dept04Controller {
// TODO : MVC 의 Model(Service클래스) 객체 가져오기
@Autowired
Dept04Service deptService;
@GetMapping("/dept")
public String getDeptAll(Model model) {
// TODO : Service 객체의 전체조회 함수 호출
List<Dept> list = deptService.findAll();
model.addAttribute("list", list);
// TODO : 로그 찍기
log.debug(list.toString());
return "exam04/dept/dept_all.jsp";
}
@GetMapping("/dept/{dno}")
public String getDeptId(@PathVariable long dno,
Model model
) {
// TODO : 서비스 상세조회 호출
Dept dept = deptService.findByid(dno);
model.addAttribute("dept", dept);
return "exam04/dept/dept_id.jsp";
}
// TODO : 부서 추가 페이지 열기 함수
@GetMapping("/dept/addition")
public String addDept() {
return "exam04/dept/add_dept.jsp";
}
// TODO : 저장 버튼 클릭시 db 저장하기 함수
@PostMapping("/dept/add")
public RedirectView createDept(@ModelAttribute Dept dept) {
// TODO : 서비스 저장함수 호출
deptService.save(dept);
// TODO : 저장 후 전체조회 url 로 강제 페이지 이동
// 사용법 : new RedirectView("강제이동될url주소")
return new RedirectView("/exam04/dept");
}
}
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%-- TODO : header.jsp --%>
<jsp:include page="../../common/header.jsp"/>
<%-- TODO : 본문 --%>
<div class="container">
<h3>전달 받은 객체는 ${list} 입니다.</h3>
<%-- TODO : 테이블 형태로 화면 출력 --%>
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">위치</th>
<th scope="col">등록일자</th>
<th scope="col">수정일자</th>
</tr>
</thead>
<tbody>
<c:forEach var="data" items="${list}">
<tr>
<td>${data.dno}</td>
<td>${data.dname}</td>
<td>${data.loc}</td>
<td>${data.insertTime}</td>
<td>${data.updateTime}</td>
</tr>
</c:forEach>
</tbody>
</table>
<%-- TODO : Add 버튼 추가 --%>
<div class="text-center">
<a href="/exam04/dept/addition" class="btn btn-primary">Add</a>
</div>
</div>
<script>
let obj = "${list}"
console.log(obj);
</script>
<%-- TODO : foter.jsp --%>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<jsp:include page="../../common/header.jsp"/>
<div class="container">
<%-- TODO : post 방식으로 백엔드 연결 --%>
<form action="/exam04/dept/add" method="post">
<%-- TODO : 부서명 입력양식 --%>
<div class="mb-3">
<label for="dname" class="form-label">부서 이름</label>
<input type="text" class="form-control" id="dname" required name="dname">
</div>
<%-- TODO : 부서위치 입력양식 --%>
<div class="mb-3">
<label for="loc" class="form-label">부서 위치</label>
<input type="text" class="form-control" id="loc" required name="loc">
</div>
<div class="mb-3">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
</div>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%-- TODO : header.jsp --%>
<jsp:include page="../../common/header.jsp"/>
<%-- TODO : 본문 --%>
<div class="container">
<%-- TODO : 테이블 형태로 화면 출력 --%>
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">위치</th>
<th scope="col">등록일자</th>
<th scope="col">수정일자</th>
</tr>
</thead>
<tbody>
<tr>
<td>${dept.dno}</td>
<td>${dept.dname}</td>
<td>${dept.loc}</td>
<td>${dept.insertTime}</td>
<td>${dept.updateTime}</td>
</tr>
</tbody>
</table>
</div>
<script>
let obj = "${dept}"
console.log(obj);
</script>
</div>
<%-- TODO : foter.jsp --%>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>
수정(edition에서 업데이트 버튼 및 url 추가해보기)
- view post 방식으로 백엔드 연결
더보기
package com.example.modelexam.service.exam05;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : com.example.modelexam.service.exam05
* fileName : Dept05Service
* author : L.DH
* date : 2023-10-11
* description : edition에서 업데이트 버튼 및 url 추가해보기
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Service
public class Dept05Service {
// todo : db 접근 함수들이 있는 객체 : deptEao
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
*
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* id(기본키)로 조회 : 상세조회(1건조회)
*
* @param dno
* @return
*/
public Dept findById(long dno) {
// todo: db 상세조회(1건조회) 함수 호출
// id(기본키)로 조회
Dept dept = deptDao.selectById(dno);
return dept;
}
/**
* 부서 정보 저장 함수
*
* @param dept
* @return
*/
public List<Dept> save(Dept dept) {
List<Dept> list = null;
// todo: insert 시 dno 자동 생성
// 기존 부서번호 max 찾아서 + 10
if (dept.getDno() == null) {
// todo: 전체조회해서 현재 배열의 크기 가져오기
int count = deptDao.selectAll().size();
// todo: 새로운 부서번호 생성
int newDno = (count + 1) * 10;
// todo: 새로운 부서번호 저장 : dept
dept.setDno(newDno);
// todo: db 저장
list = deptDao.insert(dept);
} else {
// todo: db 수정
list = deptDao.update(dept);
}
return list;
}
}
더보기
package com.example.modelexam.controller.exam05;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam05.Dept05Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.view.RedirectView;
import java.util.List;
/**
* packageName : com.example.modelexam.controller.exam05
* fileName : Dept05Controller
* author : L.DH
* date : 2023-10-11
* description : edition에서 업데이트 버튼 및 url 추가해보기
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Slf4j
@Controller
@RequestMapping("/exam05")
public class Dept05Controller {
// todo: MVC 의 Model(Service클래스) 객체 가져오기
@Autowired
Dept05Service deptService;
@GetMapping("/dept")
public String getDeptAll(Model model) {
// TODO: Service 객체의 전체조회 함수 호출
List<Dept> list = deptService.findAll();
model.addAttribute("list", list);
// TODO: 로그 찍기
log.debug(list.toString());
return "exam05/dept/dept_all.jsp";
}
@GetMapping("/dept/{dno}")
public String getDeptId(@PathVariable long dno,
Model model
) {
// todo: 서비스 상세조회 호출
Dept dept = deptService.findById(dno);
model.addAttribute("dept", dept);
return "exam05/dept/dept_id.jsp";
}
// todo: 부서 추가 페이지 열기 함수
@GetMapping("/dept/addition")
public String addDept() {
return "exam05/dept/add_dept.jsp";
}
// todo: 저장 버튼 클릭시 db 저장하기 함수
@PostMapping("/dept/add")
public RedirectView createDept(@ModelAttribute Dept dept) {
// todo: 서비스 저장함수 호출
deptService.save(dept);
// todo: 저장 후 전체조회 url 로 강제 페이지 이동
// 사용법 : new RedirectView("강제이동될url주소")
return new RedirectView("/exam05/dept");
}
// todo: 수정 페이지 열기 : 화면이 보일때 데이터도 화면에 미리 출력해야함
@GetMapping("/dept/edition/{dno}")
public String editDept(@PathVariable long dno, Model model) {
// todo: 1) 상세 조회
Dept dept = deptService.findById(dno); //
model.addAttribute("dept", dept);
return "exam05/dept/update_dept.jsp";
}
// todo: 수정 저장 : 리다이렉트(강제 이동) : 전체조회페이지로 이동
@PutMapping("/dept/edit/{dno}")
public RedirectView updateDept(@PathVariable long dno,
@ModelAttribute Dept dept) {
// todo: 수정 저장 함수 호출
deptService.save(dept);
return new RedirectView("/exam05/dept");
}
}
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%--todo: header.jsp --%>
<jsp:include page="../../common/header.jsp" />
<%--todo : 본문 --%>
<div class="container">
<h3>전달 받은 객체는 ${list} 입니다.</h3>
<%-- todo: 테이블 형태로 화면 출력 --%>
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">위치</th>
<th scope="col">등록일자</th>
<th scope="col">수정일자</th>
</tr>
</thead>
<tbody>
<c:forEach var="data" items="${list}">
<tr>
<td>
<a href="/exam05/dept/edition/${data.dno}">${data.dno}</a>
</td>
<td>${data.dname}</td>
<td>${data.loc}</td>
<td>${data.insertTime}</td>
<td>${data.updateTime}</td>
</tr>
</c:forEach>
</tbody>
</table>
<%-- todo: Add 버튼 추가 --%>
<div class="text-center">
<a href="/exam05/dept/addition" class="btn btn-primary">Add</a>
</div>
</div>
<script>
let obj = "${list}";
console.log(obj);
</script>
<%--todo: footer.jsp--%>
<jsp:include page="../../common/footer.jsp" />
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%-- todo : header --%>
<jsp:include page="../../common/header.jsp" />
<%-- todo: 본문 --%>
<div class="container">
<%-- todo: 테이블 형태로 화면 출력 --%>
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">위치</th>
<th scope="col">등록일자</th>
<th scope="col">수정일자</th>
</tr>
</thead>
<tbody>
<tr>
<td>${dept.dno}</td>
<td>${dept.dname}</td>
<td>${dept.loc}</td>
<td>${dept.insertTime}</td>
<td>${dept.updateTime}</td>
</tr>
</tbody>
</table>
</div>
<script>
let obj = "${dept}"
console.log(obj);
</script>
<%-- todo : footer --%>
<jsp:include page="../../common/footer.jsp" />
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<jsp:include page="../../common/header.jsp" />
<div class="container">
<%-- todo: insert : post 방식으로 벡엔드 연결 --%>
<%-- form action="이동할url" method="get|post|delete|put" --%>
<%-- get(select), post(insert), delete(delete), put(update) --%>
<%-- button type="submit" : 기본기능 - 해당 url 이동됨 --%>
<form action="/exam05/dept/add" method="post">
<%-- todo: 부서명 입력양식 --%>
<div class="mb-3">
<label for="dname" class="form-label">부서 이름</label>
<input type="text" class="form-control" id="dname" required name="dname">
</div>
<%-- todo: 부서위치 입력양식--%>
<div class="mb-3">
<label for="loc" class="form-label">부서 위치</label>
<input type="text" class="form-control" id="loc" required name="loc">
</div>
<div class="mb-3">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
</div>
<jsp:include page="../../common/footer.jsp" />
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%--header --%>
<jsp:include page="../../common/header.jsp"/>
<%--본문--%>
<div class="container">
<form action="/exam05/dept/edit/${dept.dno}" method="post">
<%-- TODO: 1) springboot 에서 아래와 같이 hidden 값을 전송하면 : put 방식으로 인식해서 연결해줌 --%>
<%-- 2) application.propeties : spring.mvc.hiddenmethod.filter.enabled=true --%>
<input type="hidden" name="_method" value="put"/>
<%-- todo: 부서번호 : 화면에서 숨김 --%>
<input type="hidden" name="dno" value="${dept.dno}"/>
<%-- todo: 부서이름 입력양식 --%>
<div class="mb-3">
<label for="dname" class="form-label">부서 이름</label>
<input type="text"
class="form-control"
id="dname"
required
name="dname"
value="${dept.dname}"
>
</div>
<%-- todo: 부서위치 입력양식--%>
<div class="mb-3">
<label for="loc" class="form-label">부서 위치</label>
<input type="text"
class="form-control"
id="loc"
required
name="loc"
value="${dept.loc}"
>
</div>
<%-- todo: 수정 버튼--%>
<div class="mb-3">
<button type="submit" class="btn btn-primary">Update</button>
</div>
</form>
</div>
<%--footer --%>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>
삭제(edition에서 업데이트 버튼 및 url 추가해보기)
더보기
package com.example.modelexam.service.exam06;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : com.example.modelexam.service.exam06
* fileName : Dept06Service
* author : L.DH
* date : 2023-10-11
* description : edition에서 삭제 버튼 및 url 추가해보기
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Service
public class Dept06Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* id(기본키)로 조회 : 상세조회(1건조회)
* @param dno
* @return
*/
public Dept findById(long dno) {
// todo: db 상세조회(1건조회) 함수 호출
// id(기본키)로 조회
Dept dept = deptDao.selectById(dno);
return dept;
}
/**
* 부서 정보 저장 함수
* @param dept
* @return
*/
public List<Dept> save(Dept dept) {
List<Dept> list = null;
// todo: insert 시 dno 자동 생성
// 기존 부서번호 max 찾아서 + 10
if(dept.getDno() == null) {
// todo: 전체조회해서 현재 배열의 크기 가져오기
int count = deptDao.selectAll().size();
// todo: 새로운 부서번호 생성
int newDno = (count + 1) * 10;
// todo: 새로운 부서번호 저장 : dept
dept.setDno(newDno);
// todo: db 저장
list = deptDao.insert(dept);
} else {
// todo: db 수정
list = deptDao.update(dept);
}
return list;
}
/**
* 부서번호로 삭제하는 함수
* @param dno
* @return
*/
public boolean removeById(int dno) {
// 삭제 함수 호출 : 리턴값 : (삭제된 건수)
int iCount = deptDao.deleteById(dno);
return (iCount > 0)? true : false;
}
}
더보기
package com.example.modelexam.controller.exam06;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam06.Dept06Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.view.RedirectView;
import java.util.List;
/**
* packageName : com.example.modelexam.controller.exam06
* fileName : Dept06Controller
* author : L.DH
* date : 2023-10-11
* description : edition에서 삭제 버튼 및 url 추가해보기
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Slf4j
@Controller
@RequestMapping("/exam06")
public class Dept06Controller {
// todo: MVC 의 Model(Service클래스) 객체 가져오기
@Autowired
Dept06Service deptService;
@GetMapping("/dept")
public String getDeptAll(Model model) {
// TODO: Service 객체의 전체조회 함수 호출
List<Dept> list = deptService.findAll();
model.addAttribute("list", list);
// TODO: 로그 찍기
log.debug(list.toString());
return "exam06/dept/dept_all.jsp";
}
@GetMapping("/dept/{dno}")
public String getDeptId(@PathVariable long dno,
Model model
) {
// todo: 서비스 상세조회 호출
Dept dept = deptService.findById(dno);
model.addAttribute("dept", dept);
return "exam06/dept/dept_id.jsp";
}
// todo: 부서 추가 페이지 열기 함수
@GetMapping("/dept/addition")
public String addDept() {
return "exam06/dept/add_dept.jsp";
}
// todo: 저장 버튼 클릭시 db 저장하기 함수
@PostMapping("/dept/add")
public RedirectView createDept(@ModelAttribute Dept dept) {
// todo: 서비스 저장함수 호출
deptService.save(dept);
// todo: 저장 후 전체조회 url 로 강제 페이지 이동
// 사용법 : new RedirectView("강제이동될url주소")
return new RedirectView("/exam06/dept");
}
// todo: 수정 페이지 열기 : 화면이 보일때 데이터도 화면에 미리 출력해야함
@GetMapping("/dept/edition/{dno}")
public String editDept(@PathVariable long dno, Model model) {
// todo: 1) 상세 조회
Dept dept = deptService.findById(dno); //
model.addAttribute("dept", dept);
return "exam06/dept/update_dept.jsp";
}
// todo: 수정 저장 : 리다이렉트(강제 이동) : 전체조회페이지로 이동
@PutMapping("/dept/edit/{dno}")
public RedirectView updateDept(@PathVariable long dno,
@ModelAttribute Dept dept) {
// todo: 수정 저장 함수 호출
deptService.save(dept);
return new RedirectView("/exam06/dept");
}
// todo: 삭제 함수 : 삭제 후 전체 조회로 리다이렉트(강제 이동)
@DeleteMapping("/dept/delete/{dno}")
public RedirectView deleteDept(@PathVariable int dno) {
deptService.removeById(dno); // db 삭제
return new RedirectView("/exam06/dept"); // 전체조회 강제이동
}
}
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%--todo: header.jsp --%>
<jsp:include page="../../common/header.jsp" />
<%--todo : 본문 --%>
<div class="container">
<h3>전달 받은 객체는 ${list} 입니다.</h3>
<%-- todo: 테이블 형태로 화면 출력 --%>
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">위치</th>
<th scope="col">등록일자</th>
<th scope="col">수정일자</th>
</tr>
</thead>
<tbody>
<c:forEach var="data" items="${list}">
<tr>
<td>
<a href="/exam06/dept/edition/${data.dno}">${data.dno}</a>
</td>
<td>${data.dname}</td>
<td>${data.loc}</td>
<td>${data.insertTime}</td>
<td>${data.updateTime}</td>
</tr>
</c:forEach>
</tbody>
</table>
<%-- todo: Add 버튼 추가 --%>
<div class="text-center">
<a href="/exam06/dept/addition" class="btn btn-primary">Add</a>
</div>
</div>
<script>
let obj = "${list}";
console.log(obj);
</script>
<%--todo: footer.jsp--%>
<jsp:include page="../../common/footer.jsp" />
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%-- todo : header --%>
<jsp:include page="../../common/header.jsp" />
<%-- todo: 본문 --%>
<div class="container">
<%-- todo: 테이블 형태로 화면 출력 --%>
<table class="table">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">위치</th>
<th scope="col">등록일자</th>
<th scope="col">수정일자</th>
</tr>
</thead>
<tbody>
<tr>
<td>${dept.dno}</td>
<td>${dept.dname}</td>
<td>${dept.loc}</td>
<td>${dept.insertTime}</td>
<td>${dept.updateTime}</td>
</tr>
</tbody>
</table>
</div>
<script>
let obj = "${dept}"
console.log(obj);
</script>
<%-- todo : footer --%>
<jsp:include page="../../common/footer.jsp" />
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<jsp:include page="../../common/header.jsp" />
<div class="container">
<%-- todo: insert : post 방식으로 벡엔드 연결 --%>
<%-- form action="이동할url" method="get|post|delete|put" --%>
<%-- get(select), post(insert), delete(delete), put(update) --%>
<%-- button type="submit" : 기본기능 - 해당 url 이동됨 --%>
<form action="/exam06/dept/add" method="post">
<%-- todo: 부서명 입력양식 --%>
<div class="mb-3">
<label for="dname" class="form-label">부서 이름</label>
<input type="text" class="form-control" id="dname" required name="dname">
</div>
<%-- todo: 부서위치 입력양식--%>
<div class="mb-3">
<label for="loc" class="form-label">부서 위치</label>
<input type="text" class="form-control" id="loc" required name="loc">
</div>
<div class="mb-3">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
</div>
<jsp:include page="../../common/footer.jsp" />
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<%--header --%>
<jsp:include page="../../common/header.jsp"/>
<%--본문--%>
<div class="container">
<form action="/exam06/dept/edit/${dept.dno}" method="post">
<%-- TODO: 1) springboot 에서 아래와 같이 hidden 값을 전송하면 : put 방식으로 인식해서 연결해줌 --%>
<%-- 2) application.propeties : spring.mvc.hiddenmethod.filter.enabled=true --%>
<input type="hidden" name="_method" value="put"/>
<%-- todo: 부서번호 : 화면에서 숨김 --%>
<input type="hidden" name="dno" value="${dept.dno}"/>
<%-- todo: 부서이름 입력양식 --%>
<div class="mb-3">
<label for="dname" class="form-label">부서 이름</label>
<input type="text"
class="form-control"
id="dname"
required
name="dname"
value="${dept.dname}"
>
</div>
<%-- todo: 부서위치 입력양식--%>
<div class="mb-3">
<label for="loc" class="form-label">부서 위치</label>
<input type="text"
class="form-control"
id="loc"
required
name="loc"
value="${dept.loc}"
>
</div>
<%-- todo: 수정 버튼--%>
<div class="mb-3">
<button type="submit" class="btn btn-primary">Update</button>
</div>
</form>
<%-- todo: 삭제 버튼--%>
<form id="delete-form" action="/exam06/dept/delete/${dept.dno}" method="post">
<%-- TODO: springboot 에서 아래와 같이 hidden 값을 전송하면 : delete 방식으로 인식해서 연결해줌 --%>
<input type="hidden" name="_method" value="delete"/>
<button type="submit" class="btn btn-danger">Delete</button>
</form>
</div>
<%--footer --%>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>
react 연동 CRUD 해보기
Rest Client 툴 (HTTP 클라이언트) 활용
@RestControlle
- 전체 조회
- 상세(1건) 조회 + null 방지 기능 추가
- 저장
- 추가 및 저장
- 수정(업데이트)
- 삭제
@RestController 전체 조회
더보기
package com.example.modelexam.service.exam07;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : com.example.modelexam.service.exam07
* fileName : Dept07Service
* author : L.DH
* date : 2023-10-11
* description : @RestController 전체 조회
* 요약 : react 연동(vue 등)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Service
public class Dept07Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
}
더보기
package com.example.modelexam.controller.exam07;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam07.Dept07Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* packageName : com.example.modelexam.controller.exam07
* fileName : Dept07Controller
* author : L.DH
* date : 2023-10-11
* description : @RestController 전체 조회
* 요약 : react 연동(vue 등)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Slf4j
@RestController
@RequestMapping("/exam07")
public class Dept07Controller {
// TODO : 객체 가져오기
@Autowired
Dept07Service deptService;
/**
* 전체 조회 함수
*/
@GetMapping("/dept")
public ResponseEntity<Object> getDeptAll() {
try {
List<Dept> list = deptService.findAll();
if (list.isEmpty() == false) {
// TODO : 조회 성공
return new ResponseEntity<>(list, HttpStatus.OK);
} else {
// TODO : 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
// TODO: INTERNAL_SERVER_ERROR(500)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
더보기
###
GET http://localhost:8000/exam07/dept
<> 2023-10-11T193544.200.json
@RestController 상세(1건) 조회 시 null 방지 기능 추가
더보기
package com.example.modelexam.service.exam08;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.modelexam.service.exam08
* fileName : Dept08Service
* author : L.DH
* date : 2023-10-11
* description : @RestController 상세 조회(1건 조회)
* 요약 : react 연동(vue 등) + null 방지 기능 추가
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Service
public class Dept08Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
*
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* id(기본키)로 조회 : 상세조회(1건조회)
* 수정 : null 방지 기능 추가
* @param dno
* @return
*/
public Optional<Dept> findById(long dno) {
// TODO : db 상세조회(1건조회) 함수 호출
// id(기본키)로 조회
Dept dept = deptDao.selectById(dno);
// todo 추가 : null 방지 클래스 사용
Optional<Dept> optionalDept = Optional.ofNullable(dept);
// todo 추가 : return 수정
return optionalDept;
}
}
더보기
package com.example.modelexam.controller.exam08;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam08.Dept08Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.modelexam.controller.exam08
* fileName : Dept08Controller
* author : L.DH
* date : 2023-10-11
* description : @RestController 상세 조회(1건 조회)
* 요약 : react 연동(vue 등) + null 방지 기능 추가
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Slf4j
@RestController
@RequestMapping("/exam08")
public class Dept08Controller {
// TODO : 객체 가져오기
@Autowired
Dept08Service deptService;
/**
* 전체 조회 함수
*/
@GetMapping("/dept")
public ResponseEntity<Object> getDeptAll() {
try {
List<Dept> list = deptService.findAll();
if (list.isEmpty() == false) {
// TODO : 조회 성공
return new ResponseEntity<>(list, HttpStatus.OK);
} else {
// TODO : 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
// TODO: INTERNAL_SERVER_ERROR(500)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/**
* 상세 조회(1건 조회)
*/
@GetMapping("/dept/{dno}")
public ResponseEntity<Object> getDeptId(
@PathVariable long dno
) {
try {
Optional<Dept> optionalDept = deptService.findById(dno);
if (optionalDept.isEmpty() == false) {
// TODO : 조회 성공
return new ResponseEntity<>(optionalDept.get(), HttpStatus.OK);
} else {
// TODO : 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
// TODO: INTERNAL_SERVER_ERROR(500)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
더보기
###
GET http://localhost:8000/exam08/dept
###
GET http://localhost:8000/exam08/dept/{{dno}}
###
GET http://localhost:8000/exam08/dept/10
<> 2023-10-11T194137.200.json
@RestController 저장 함수
더보기
package com.example.modelexam.service.exam09;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.modelexam.service.exam09
* fileName : Dept09Service
* author : L.DH
* date : 2023-10-11
* description : @RestController 저장 함수
* 요약 : react 연동(vue 등)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Service
public class Dept09Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 부서 정보 저장 함수
*
* @param dept
* @return
*/
public List<Dept> save(Dept dept) {
List<Dept> list = null;
// todo: insert 시 dno 자동 생성
// 기존 부서번호 max 찾아서 + 10
if (dept.getDno() == null) {
// todo: 전체조회해서 현재 배열의 크기 가져오기
int count = deptDao.selectAll().size();
// todo: 새로운 부서번호 생성
int newDno = (count + 1) * 10;
// todo: 새로운 부서번호 저장 : dept
dept.setDno(newDno);
// todo: db 저장
list = deptDao.insert(dept);
} else {
// todo: db 수정
list = deptDao.update(dept);
}
return list;
}
}
더보기
package com.example.modelexam.controller.exam09;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam09.Dept09Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.modelexam.controller.exam09
* fileName : Dept09Controller
* author : L.DH
* date : 2023-10-11
* description : @RestController 저장 함수
* 요약 : react 연동(vue 등)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Slf4j
@RestController
@RequestMapping("/exam09")
public class Dept09Controller {
// TODO : 객체 가져오기
@Autowired
Dept09Service deptService;
/**
* 저장 함수
*/
@PostMapping("/dept")
public ResponseEntity<Object> createDept(
@RequestBody Dept dept) {
try {
List<Dept> list = deptService.save(dept);
return new ResponseEntity<>(list, HttpStatus.CREATED);
} catch (Exception e) {
log.debug(e.getMessage());
// TODO : INTERNAL_SERVER_ERROR(500) : sql 구문 에러 등
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
더보기
###
POST http://localhost:8000/exam09/dept
<> 2023-10-11T195010.400.json
@RestController 업데이트(수정) 기능
더보기
package com.example.modelexam.service.exam10;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.modelexam.service.exam10
* fileName : Dept10Service
* author : L.DH
* date : 2023-10-11
* description : @RestController 업데이트(수정) 기능
* 요약 : react 연동(vue 등)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Service
public class Dept10Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
*
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* id(기본키)로 조회 : 상세조회(1건조회)
* 수정 : null 방지 기능 추가
* @param dno
* @return
*/
public Optional<Dept> findById(long dno) {
// TODO : db 상세조회(1건조회) 함수 호출
// id(기본키)로 조회
Dept dept = deptDao.selectById(dno);
// todo 추가 : null 방지 클래스 사용
Optional<Dept> optionalDept = Optional.ofNullable(dept);
// todo 추가 : return 수정
return optionalDept;
}
/**
* 부서 정보 저장 함수
*
* @param dept
* @return
*/
public List<Dept> save(Dept dept) {
List<Dept> list = null;
// todo: insert 시 dno 자동 생성
// 기존 부서번호 max 찾아서 + 10
if (dept.getDno() == null) {
// todo: 전체조회해서 현재 배열의 크기 가져오기
int count = deptDao.selectAll().size();
// todo: 새로운 부서번호 생성
int newDno = (count + 1) * 10;
// todo: 새로운 부서번호 저장 : dept
dept.setDno(newDno);
// todo: db 저장
list = deptDao.insert(dept);
} else {
// todo: db 수정
list = deptDao.update(dept);
}
return list;
}
}
더보기
package com.example.modelexam.controller.exam10;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam10.Dept10Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.modelexam.controller.exam10
* fileName : Dept10Controller
* author : L.DH
* date : 2023-10-11
* description : @RestController 업데이트(수정) 기능
* 요약 : react 연동(vue 등)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Slf4j
@RestController
@RequestMapping("/exam10")
public class Dept10Controller {
// TODO : 객체 가져오기
@Autowired
Dept10Service deptService;
/**
* 전체 조회 함수
*/
@GetMapping("/dept")
public ResponseEntity<Object> getDeptAll() {
try {
List<Dept> list = deptService.findAll();
if (list.isEmpty() == false) {
// TODO : 조회 성공
return new ResponseEntity<>(list, HttpStatus.OK);
} else {
// TODO : 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
// TODO: INTERNAL_SERVER_ERROR(500)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/**
* 상세 조회(1건 조회)
*/
@GetMapping("/dept/{dno}")
public ResponseEntity<Object> getDeptId(
@PathVariable long dno
) {
try {
Optional<Dept> optionalDept = deptService.findById(dno);
if (optionalDept.isEmpty() == false) {
// TODO : 조회 성공
return new ResponseEntity<>(optionalDept.get(), HttpStatus.OK);
} else {
// TODO : 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
// TODO: INTERNAL_SERVER_ERROR(500)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/**
* 저장 함수
*/
@PostMapping("/dept")
public ResponseEntity<Object> createDept(
@RequestBody Dept dept) {
try {
List<Dept> list = deptService.save(dept);
return new ResponseEntity<>(list, HttpStatus.CREATED);
} catch (Exception e) {
log.debug(e.getMessage());
// TODO : INTERNAL_SERVER_ERROR(500) : sql 구문 에러 등
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/**
* 수정 함수
*/
@PutMapping("/dept/edit/{dno}")
public ResponseEntity<Object> updateDept(
@PathVariable int dno,
@RequestBody Dept dept
) {
try {
List<Dept> list = deptService.save(dept);
return new ResponseEntity<>(list, HttpStatus.CREATED);
} catch (Exception e) {
log.debug(e.getMessage());
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
더보기
###
GET http://localhost:8000/exam10/dept
<> 2023-10-11T195935.200.json
<> 2023-10-11T195921.200.json
###
PUT http://localhost:8000/exam10/dept/edit/{{dno}}
Content-Type: application/json
{}
###
PUT http://localhost:8000/exam10/dept/edit/50
Content-Type: application/json
{
"dno": 40,
"dname": "dname_57fe86a20d65",
"loc": "loc_f6688991314e"
}
<> 2023-10-11T195951.201.json
@RestController 삭제 기능
더보기
package com.example.modelexam.service.exam11;
import com.example.modelexam.dao.DeptDao;
import com.example.modelexam.model.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.modelexam.service.exam11
* fileName : Dept11Service
* author : L.DH
* date : 2023-11-11
* description : @RestController 삭제 기능
* 요약 : react 연동(vue 등)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Service
public class Dept11Service {
@Autowired
DeptDao deptDao; // 가짜 DB에 접근하는 객체
/**
* 전체 조회 함수 : selectAll()(DAO 객체 함수) 호출
*
* @return
*/
public List<Dept> findAll() {
// TODO: deptDao.selectAll() : db 조회 함수 호출
List<Dept> list = deptDao.selectAll();
return list;
}
/**
* 부서번호로 삭제하는 함수
*
* @param dno
* @return
*/
public boolean removeById(int dno) {
// 삭제 함수 호출 : 리턴값 : (삭제된 건수)
int iCount = deptDao.deleteById(dno);
return (iCount > 0) ? true : false;
}
}
더보기
package com.example.modelexam.controller.exam11;
import com.example.modelexam.model.Dept;
import com.example.modelexam.service.exam11.Dept11Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.modelexam.controller.exam11
* fileName : Dept11Controller
* author : L.DH
* date : 2023-10-11
* description : @RestController 삭제 기능
* 요약 : react 연동(vue 등)
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* ———————————————————————————————
* 2023-10-11 L.DH 최초 생성
*/
@Slf4j
@RestController
@RequestMapping("/exam11")
public class Dept11Controller {
// TODO : 객체 가져오기
@Autowired
Dept11Service deptService;
/**
* 전체 조회 함수
*/
@GetMapping("/dept")
public ResponseEntity<Object> getDeptAll() {
try {
List<Dept> list = deptService.findAll();
if (list.isEmpty() == false) {
// TODO : 조회 성공
return new ResponseEntity<>(list, HttpStatus.OK);
} else {
// TODO : 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
// TODO: INTERNAL_SERVER_ERROR(500)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/**
* 삭제 함수
*/
@DeleteMapping("/dept/delete/{dno}")
public ResponseEntity<Object> deleteDept(
@PathVariable int dno
) {
try {
boolean bSuccess = deptService.removeById(dno);
if (bSuccess == true) {
// todo: 삭제 성공
return new ResponseEntity<>(HttpStatus.OK);
} else {
// todo: 0건 삭제 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
// todo: INTERNAL_SERVER_ERROR(500)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
더보기
###
GET http://localhost:8000/exam11/dept
<> 2023-10-11T200429.200.json
<> 2023-10-11T200250.200.json
###
DELETE http://localhost:8000/exam11/dept/delete/{{dno}}
###
DELETE http://localhost:8000/exam11/dept/delete/40
'Spring Boot' 카테고리의 다른 글
[SpringBoot] 데이터베이스(SQL&Docker) 활용한 상세 조회 (0) | 2023.10.13 |
---|---|
[SpringBoot] 데이터베이스(SQL&Docker) 활용한 전체 조회 : like 기능 있음 (0) | 2023.10.13 |
[SpringBoot] 로그백, 로깅 라이브러리 logback , log4jdbc 설정 (0) | 2023.10.06 |
[SpringBoot] 데이터를 입력받아(insert) 화면에 출력하기 (0) | 2023.10.06 |
[SpringBoot] 데이터를 저장하고 멤버 객체 생성하여 결과 json 데이터로 전송 (0) | 2023.10.06 |