인생 디벨로퍼

이력서 리스트 만들기 (select, ajax 를 이용한 delete) 본문

Project/Mini Project - Rodonin (구인구직)

이력서 리스트 만들기 (select, ajax 를 이용한 delete)

뫄뫙뫄 2023. 3. 8. 05:05
728x90

https://steponecoding.tistory.com/8

 

이력서 리스트 만들기 쿼리 / 절대 간단하지 않은 join

개인정보 페이지에서, 이력서 리스트를 만들어주려한다. employee_id 로 resume 조회한다. resume 테이블에서, resume_title, resume_salary 를 선택 -> 컬럼 resume_id 를 이용하여, 각각의 resume_career, resume_graduate,

steponecoding.tistory.com

앞의 글을 읽고와야 이해할수 있다.

 

일단, 만들어온 쿼리를 이용해, 이력서 리스트를 만들어보자.


Controller

 @GetMapping("/employee/detail")
    public String detail(Model model) {

        Employee principal = (Employee) session.getAttribute("principal");

        if (principal == null) {
            throw new CustomException("인증이 되지 않았습니다", HttpStatus.UNAUTHORIZED);
        }

        model.addAttribute("empInfo", employeeRepository.findById(principal.getId()));

        List<EmployeeCareer> empCareers = employeeCareerrRepository.findById(principal.getId());
        model.addAttribute("empCareer", empCareers);

        List<GraduateRespDto> empGraduates = employeeGraduateRepository.findById(principal.getId());
        model.addAttribute("empGraduates", empGraduates);

        List<LicenseRespDto> empLicense = employeeLicenseRepository.findById(principal.getId());
        model.addAttribute("empLicense", empLicense);

        List<StackRespDto> empStack = employeeStackRepository.findById(principal.getId());
        model.addAttribute("empStack", empStack);

        List<ResumeListRespDto> resumes = resumeRepository.findByEmpId(principal.getId());
        model.addAttribute("resumes", resumes);

        return "employee/detail";
    }

 


Repository

    public List<ResumeListRespDto> findByEmpId(int employeeId);

 


.xml

 <select id="findByEmpId" resultType="shop.mtcoding.rodongin.dto.resume.ResumeResp$ResumeListRespDto">
        SELECT re.ID, re.EMPLOYEE_ID, re.RESUME_TITLE, re.RESUME_SALARY,
        MAX(rc.CAREER_COMPANY) AS CAREER_COMPANY, 
        MAX((SELECT SCHOOL_NAME FROM SCHOOL_MASTER sm WHERE sm.ID = rg.SCHOOL_ID)) AS SCHOOL_NAME,
        MAX((SELECT LICENSE_NAME FROM LICENSE_MASTER lm WHERE lm.ID = rl.LICENSE_ID)) AS LICENSE_NAME, MAX(rl.LICENSE_ISSUER),
        MAX((SELECT STACK_NAME FROM STACK_MASTER stm WHERE stm.ID = rst.STACK_ID)) AS STACK_NAME,
        MAX(rst.STACK_ACQUISITION)
        FROM RESUME re
        LEFT OUTER JOIN RESUME_CAREER rc ON re.ID = rc.RESUME_ID
        LEFT OUTER JOIN RESUME_GRADUATE rg ON re.ID = rg.RESUME_ID 
        LEFT OUTER JOIN RESUME_LICENSE rl ON re.ID = rl.RESUME_ID 
        LEFT OUTER JOIN RESUME_STACK rst ON re.ID = rst.RESUME_ID
        WHERE re.employee_id = #{emplopyeeId}
        GROUP BY re.ID, re.EMPLOYEE_ID, re.RESUME_TITLE
    </select>

AJAX 를 이용한 delete 

만들어준 이력서 리스트에, 삭제 버튼을 추가.

 

onClick 를 사용해, 삭제 버튼을 클릭시 메소드가 실행되게 한다.

<script>
      function deleteByResumeId(resumeId) {
        $.ajax({
          type: "delete",
          url: "/resume/" + resumeId,
          dataType: "json",
        })
        done((res) => { // 20X일 때
          alert(res.msg);
          $("resume-${resume.id}").remove();
        })
          .fail((err) => { // 40X, 50X일 때
            alert(err.responseJSON.msg);
          })
      }
    </script>

.remove() 를 사용해, 해당 요소를 html 문서에서 삭제.

이때 매개변수는 resume id 로 한다

 

이제 컨트롤러 단에서 delete 를 수행하면 된다.


Controller

@DeleteMapping("/resume/{id}")
    public @ResponseBody ResponseEntity<?> delete(@PathVariable("id") int id) {
        Employee principal = (Employee) session.getAttribute("principal");
        if (principal == null) {
            throw new CustomApiException("인증이 되지 않았습니다", HttpStatus.UNAUTHORIZED);
        }
        resumeService.delete(id, principal.getId());
        return new ResponseEntity<>(new ResponseDto<>(1, "이력서 삭제 성공", null), HttpStatus.OK);
    }

Service

    @Transactional
    public void delete(int resumeId, Integer principalId) {
        Resume ResumePS = resumeRepository.findById(resumeId);
        if (ResumePS == null) {
            throw new CustomApiException("이력서가 존재하지 않습니다");
        }
        if (ResumePS.getEmployeeId() != principalId) {
            throw new CustomApiException("이력서를 삭제할 권한이 없습니다", HttpStatus.FORBIDDEN);
        }
        try {
            resumeRepository.deleteById(resumeId);
        } catch (Exception e) {
            throw new CustomApiException("이력서 삭제 실패", HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

 


Repository

public int deleteById(int id);

.xml

  <delete id="deleteById">
        DELETE FROM resume WHERE id = #{id}
    </delete>

매개변수를 resume_id 로 하여, 비동기 삭제 완료.

 

728x90