+ 00 00 0000

Have any Questions?

02_Simple Coding – Backend – Controller CRUD – 기본 요약

02_Simple Coding – Backend – Controller CRUD – 기본 요약

📃 요약

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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다