
📃 요약
실무에서는 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>



