📃 요약
실무에서는 MVC 디자인 패턴 속해서 스프링부트를 사용해 코딩을 진행함. 파일관리 시 파일을 용도에 맞게 정리하듯이 MVC 디자인 패턴도 패키지 및 클래스를 용도에 맞게 분류해서 코딩을 진행함
요소 기술 :
– Basic : java & spring boot
📃 기술 구현
스펙 :
- intellij - java - spring boot
📃 @Controller :
- View 가 JSP 일때 사용되는 컨트롤러 - 함수 위에 요청받은 특정 url 이 있음 - return 값이 jsp 페이지명임
Model
- 전송할 데이터는 Model 이라는 객체에 넣어서 jsp 페이지로 이동됨
@Slf4j :
- 로깅 라이브러리 (롬북) , 인터페이스 : 자식클래스(logback) - 설치 : Logback 프러퍼티 파일2개 복사, build.gradle 라이브러리 4개 추가
사용법 : 1) @Slf4j 클래스 위에 달고 2) 로깅 하고 싶은 라인에서 log.debug(값.toString());
@Service :
- 클래스 위에 달고, 달린 클래스는 서버가 가동될때 자동으로 객체 생성됨(IOC) - 유사 어노테이션 : @Repository, @Component, @Bean 등
@Autowired :
- 위에서 생성된 객체를 가져오기 할때 사용(DI)
CRUD 어노테이션
- 생성/조회/수정/삭제 요청에 대해 각각의 어노테이션이 존재함 - @PostMapping(/url) : Post 방식으로 오는 요청에(insert 요청) 대해 실행 - @GetMapping(/url) : Get 방식으로 오는 요청에(조회요청) 대해 실행되는 어노테이션 - @PutMapping(/url) : Put 방식으로 오는 요청에(update 요청) 대해 실행 - @DeleteMapping(/url) : Delete 방식으로 오는 요청에(delete 요청) 대해 실행
0) 환경설정 : application.properties 파일 아래 속성 추가
# todo: PUT , DELETE 방식도 form 태그에서 사용할 수 있게 만들어줌 spring.mvc.hiddenmethod.filter.enabled=true
1) C : Insert 요청 어노테이션
Controller 함수
TODO: 프론트(html/vue/jsp) <=> 벡엔드(spring) : 1) 어노테이션 : insert -> @PostMapping("/url") 2) @ModelAttribute 이용해 프론트 변수값을 전달받음 예) @ModelAttribute Dept dept
DeptController.java
1) addDept() 함수 : 부서 추가 페이지 열기 함수 #1
// TODO: 부서 추가 페이지 열기 함수 #1 @GetMapping("/dept/addition") public String addDept() { return "exam01/dept/add_dept.jsp"; }
2) createDept() 함수 : 저장 버튼 클릭시 실행될 함수 #2
저장 후 전체 조회 페이지로 강제 이동됨
사용법 : @PostMapping(/url) public RedirectView 함수명(@ModelAttribute 객체명){ 실행문; // 사용법 : new RedirectView("강제이동될url주소") return new RedirectView(이동될페이지명); } 예 : @PostMapping("/dept/add") public RedirectView createDept(@ModelAttribute Dept dept) { deptService.save(dept); return new RedirectView("/exam04/dept"); }
JSP form 태그
TODO: 프론트(html/vue/jsp) <=> 벡엔드(spring) : 1) form 태그의 input 양식의 값은 name 속성이름으로 spring 으로 전송됨 --%> 예) input name="dname" => spring : dname 변수명으로 전달받음 2) submit 버튼을 클릭하면 위의 값이 전달됨 3) form action="/컨트롤러함수url" method="post"
3) add_dept.jsp
<form action="/exam01/dept/add" method="post"> <div class="mb-3"> <%-- 부서명 입력양식 --%> <label for="dname" class="form-label">dname</label> <input type="text" class="form-control" id="dname" name="dname" placeholder="부서명입력"> </div> <div class="mb-3"> <%-- 부서위치 입력양식 --%> <label for="loc" class="form-label">loc</label> <input type="text" class="form-control" id="loc" name="loc" placeholder="부서위치입력"> </div> <div class="mb-3"> <button type="submit" class="btn btn-primary">저장</button> </div> </form>
2) R : Select 요청 어노테이션
사용법 : @GetMapping(/url) public String 함수명(Model model){ 실행문; return 이동될페이지명; } 예 : @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"; }
3) U : Update 요청 어노테이션
1) editDept() : 수정 페이지 열기 함수
- 수정 페이지가 열릴때 상세 조회한 결과를 수정함
@GetMapping("/dept/edition/{dno}") public String editDept(@PathVariable long dno, Model model) { // TODO: 1) 먼저 상세조회를(1건) 함 Dept dept = deptService.findById(dno); // TODO: 2) 부서 객체를 jsp 로 전송 model.addAttribute("dept", dept); return "exam01/dept/update_dept.jsp"; }
2) updateDept() : 수정 버튼 클릭시 실행될 함수
사용법 : @PutMapping(/url) public RedirectView 함수명(@PathVariable long dno, @RequestBody 객체명){ 실행문; return new RedirectView(이동될페이지명); } 예 : // todo: 수정 저장 : 리다이렉트(강제 이동) : 전체조회페이지로 이동 @PutMapping("/dept/edit/{dno}") public RedirectView updateDept(@PathVariable long dno, @ModelAttribute Dept dept) { // todo: 수정 저장 함수 호출 deptService.save(dept); return new RedirectView("/exam05/dept"); }
3) JSP form 태그
TODO: 프론트(html/vue/jsp) <=> 벡엔드(spring) : 1) form 태그의 input 양식의 값은 name 속성이름으로 spring 으로 전송됨 --%> 예) input name="dname" => spring : dname 변수명으로 전달받음 2) submit 버튼을 클릭하면 위의 값이 전달됨 3) form action="/컨트롤러함수url" method="post" <input type="hidden" name="_method" value="put"/> 위의 태그 추가해야함 : 기본적으로 put 방식은 지원하지 않아 hidden 태그 추가해야함
update_dept.jsp
<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>
4) D : Delete 요청 어노테이션
deleteDept() : 삭제 후 전체 조회로 리다이렉트(강제 이동)
사용법 : @DeleteMapping(/url) public RedirectView 함수명(@PathVariable int dno){ 실행문; return new RedirectView(이동될페이지명); // 페이지 강제이동 } 예 : @DeleteMapping("/dept/delete/{dno}") public RedirectView deleteDept(@PathVariable int dno) { deptService.removeById(dno); // db 삭제 return new RedirectView("/exam06/dept"); // 전체조회 강제이동 }
3) JSP form 태그
TODO: 프론트(html/vue/jsp) <=> 벡엔드(spring) : 1) form 태그의 input 양식의 값은 name 속성이름으로 spring 으로 전송됨 --%> 예) input name="dname" => spring : dname 변수명으로 전달받음 2) submit 버튼을 클릭하면 위의 값이 전달됨 3) form action="/컨트롤러함수url" method="post" <input type="hidden" name="_method" value="delete"/> 위의 태그 추가해야함 : 기본적으로 put 방식은 지원하지 않아 hidden 태그 추가해야함
update_dept.jsp
삭제를 위한 2번째 form 태그 추가
<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>