인생 디벨로퍼

@RequestBody 에 관하여... 본문

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

@RequestBody 에 관하여...

뫄뫙뫄 2023. 3. 10. 17:51
728x90

@RequestBody 

Spring 프레임워크에서 제공하는 어노테이션.

HTTP 요청 body 에 포함된 데이터를 자바 객체로 변환하는 역활을 함.

더보기

HTTP (GET / POST 요청) 

GET 요청 - URL 뒤에 파라미터를 붙여 데이터를 전달

POST 요청 - 본문에 데이터를 포함시켜 전달 (body를 가짐)

Ajax는 JavaScript를 사용하여 HTTP 요청을 비동기적으로 보내고, 서버로부터 응답을 받아 처리한다.

이 때 @RequestBody 어노테이션을 사용하여 요청 본문에 포함된 데이터를 자바 객체로 변환하여 서버에서 처리한다.


문제상황 : 이력서 등록 (insert) 에서 다수의 DTO 생성.

 

각 요소별로 테이블이 다르기 때문에, Dto 를 만들어 insert 하려 했다.

음,,, 그런데 @RequestBody 는 하나만 쓸수 있다....고 한다.

    @PostMapping("/resume/save")
    public @ResponseBody ResponseEntity<?> resumeSave(@RequestBody ResumeSaveDto resumeSaveDto,
            ResumeGraduateSaveDto resumeGraduateSaveDto,
            ResumeCareerSaveDto resumeCareerSaveDto,
            ResumeLicenseSaveDto resumeLicenseSaveDto,
            ResumeStackSaveDto resumeStackSaveDto) {

        Employee principal = MySession.MyPrincipal(session);

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

        resumeService.이력서등록(resumeSaveDto, resumeGraduateSaveDto, resumeCareerSaveDto, resumeLicenseSaveDto,
                resumeStackSaveDto, principal.getId());
       
        return new ResponseEntity<>(new ResponseDto<>(1, "이력서 등록 성공", resumeSaveDto.getId()), HttpStatus.OK);
    }

당연히 insert 에 실패

@RequestBody 를 하나만 붙였을때, 실행은 되지만 @RequestBody 를 붙이지 않은 dto 들은 데이터를 받아오지 못한다.


해결 방법

  1. ajax 대신 form 태그를 사용한다. (이걸 했어야했다...)
  2. 필요 데이터들을 하나의 Dto 로 만들어, 서비스단에서 나눠준다...

 

  @PostMapping("/resume/save")
    public @ResponseBody ResponseEntity<?> resumeSave(@RequestBody ResumeSaveDto resumeSaveDto) {
        System.out.println(resumeSaveDto.toString());

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

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

        resumeService.이력서등록(resumeSaveDto, principal.getId());

        return new ResponseEntity<>(new ResponseDto<>(1, "이력서 등록 성공", resumeSaveDto.getId()), HttpStatus.OK);
    }

 

    @Transactional
    public void 이력서등록(ResumeSaveDto resumeSaveDto, int employeeId) {

        try {
            resumeRepository.insert(employeeId, resumeSaveDto);
            resumeGraduateRepository.insert(resumeSaveDto.getId(), resumeSaveDto.getSchoolId(),
                    resumeSaveDto.getSchoolGraduate());
            resumeCareerRepository.insert(resumeSaveDto.getId(), resumeSaveDto.getCareerCompany(),
                    resumeSaveDto.getCareerStart(), resumeSaveDto.getCareerEnd());
            resumeLicenseRepository.insert(resumeSaveDto.getId(), resumeSaveDto.getLicenseId(),
                    resumeSaveDto.getLicenseIssuer());
            resumeStackRepository.insert(resumeSaveDto.getId(), resumeSaveDto.getStackId(),
                    resumeSaveDto.getStackAcquisition());

        } catch (Exception e) {
            throw new CustomApiException("이력서 등록 실패", HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }​

insert 에 성공했으나, 썩 유쾌하진 않았다..

728x90