diff --git a/src/main/java/com/parentsgowork/server/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/parentsgowork/server/apiPayload/code/status/ErrorStatus.java index dc3fa6d..6fe5d19 100644 --- a/src/main/java/com/parentsgowork/server/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/parentsgowork/server/apiPayload/code/status/ErrorStatus.java @@ -46,8 +46,9 @@ public enum ErrorStatus implements BaseErrorCode { EMAIL_ENCODING_FAIL(HttpStatus.INTERNAL_SERVER_ERROR, "AUTH5002", "이메일 내용 인코딩에 실패했습니다."), // 북마크 관련 에러 - EDUCATION_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4001", "북마크한 교육정보가 존재하지 않습니다."), - POLICY_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4002", "북마크한 정책정보가 존재하지 않습니다."); + EDUCATION_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4001", "교육정보가 존재하지 않습니다."), + POLICY_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4002", "정책정보가 존재하지 않습니다."), + JOB_INFO_NOT_FOUND(HttpStatus.NOT_FOUND, "BOOKMARK4003", "구직정보가 존재하지 않습니다."); diff --git a/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoCrawlingHandler.java b/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoHandler.java similarity index 53% rename from src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoCrawlingHandler.java rename to src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoHandler.java index 55b8081..0c9316d 100644 --- a/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoCrawlingHandler.java +++ b/src/main/java/com/parentsgowork/server/apiPayload/exception/JobInfoHandler.java @@ -2,8 +2,8 @@ import com.parentsgowork.server.apiPayload.code.BaseErrorCode; -public class JobInfoCrawlingHandler extends GeneralException { - public JobInfoCrawlingHandler(BaseErrorCode code) { +public class JobInfoHandler extends GeneralException { + public JobInfoHandler(BaseErrorCode code) { super(code); } } diff --git a/src/main/java/com/parentsgowork/server/converter/JobInfoConverter.java b/src/main/java/com/parentsgowork/server/converter/JobInfoConverter.java new file mode 100644 index 0000000..efcd4e2 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/converter/JobInfoConverter.java @@ -0,0 +1,41 @@ +package com.parentsgowork.server.converter; + +import com.parentsgowork.server.domain.JobInfo; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; + +import java.util.List; +import java.util.stream.Collectors; + +public class JobInfoConverter { + + public static JobInfoResponseDTO.AddJobResultDTO toAddJobResultDTO(JobInfo jobInfo) { + return JobInfoResponseDTO.AddJobResultDTO.builder() + .title(jobInfo.getTitle()) + .content(jobInfo.getContent()) + .build(); + } + + public static List getJobInfoListDTO(List jobInfos) { + return jobInfos.stream() + .map(job -> JobInfoResponseDTO.JobInfoResultDTO.builder() + .title(job.getTitle()) + .content(job.getContent()) + .build()) + .collect(Collectors.toList()); + } + + public static JobInfoResponseDTO.JobInfoDetailDTO getJobInfoDetailDTO(JobInfo jobInfo) { + return JobInfoResponseDTO.JobInfoDetailDTO.builder() + .title(jobInfo.getTitle()) + .content(jobInfo.getContent()) + .build(); + } + + + public static JobInfoResponseDTO.DeleteJobInfoDTO DeleteJobInfoDTO(JobInfo jobInfo) { + return JobInfoResponseDTO.DeleteJobInfoDTO.builder() + .id(jobInfo.getId()) + .message("저장한 구직정보를 삭제하였습니다.") + .build(); + } +} diff --git a/src/main/java/com/parentsgowork/server/domain/Bookmark.java b/src/main/java/com/parentsgowork/server/domain/JobInfo.java similarity index 56% rename from src/main/java/com/parentsgowork/server/domain/Bookmark.java rename to src/main/java/com/parentsgowork/server/domain/JobInfo.java index b9156be..f3794a9 100644 --- a/src/main/java/com/parentsgowork/server/domain/Bookmark.java +++ b/src/main/java/com/parentsgowork/server/domain/JobInfo.java @@ -11,7 +11,7 @@ @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor -public class Bookmark extends BaseEntity { +public class JobInfo extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -23,30 +23,12 @@ public class Bookmark extends BaseEntity { private User user; @Column - private Long jobId; + private String title; @Column - private String companyName; + private String content; - @Column - private String jobTitle; - - @Column - private String pay; - - @Column - private String time; - - @Column - private String location; - - @Column - private String deadline; - - @Column - private String registrationDate; - - @Column(columnDefinition = "TEXT") - private String detailUrl; +// @Column(columnDefinition = "TEXT") +// private String url; } diff --git a/src/main/java/com/parentsgowork/server/domain/User.java b/src/main/java/com/parentsgowork/server/domain/User.java index fadd674..b729607 100644 --- a/src/main/java/com/parentsgowork/server/domain/User.java +++ b/src/main/java/com/parentsgowork/server/domain/User.java @@ -63,7 +63,7 @@ public class User extends BaseEntity { private RefreshToken refreshToken; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) - private List bookmarks; + private List bookmarks; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List policyInfos; diff --git a/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java b/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java new file mode 100644 index 0000000..a6a0c4c --- /dev/null +++ b/src/main/java/com/parentsgowork/server/repository/JobInfoRepository.java @@ -0,0 +1,17 @@ +package com.parentsgowork.server.repository; + +import com.parentsgowork.server.domain.JobInfo; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Optional; + +public interface JobInfoRepository extends JpaRepository { + @Query("SELECT ji FROM JobInfo ji " + + "WHERE ji. user.id = :userId") + List findJobInfoList(@Param("userId") Long userId); + + Optional findByIdAndUserId(@Param("jobInfoId") Long jobInfoId, @Param("userId") Long userId); +} diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java new file mode 100644 index 0000000..5758d7b --- /dev/null +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandService.java @@ -0,0 +1,14 @@ +package com.parentsgowork.server.service.jobInfoService; + +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; + +import java.util.List; + +public interface JobInfoCommandService { + + List addJobInfo(Long userId, List saveJobInfoDTOList); + + JobInfoResponseDTO.DeleteJobInfoDTO delete(Long userId, Long jobInfoId); + +} diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java new file mode 100644 index 0000000..5dcce22 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoCommandServiceImpl.java @@ -0,0 +1,61 @@ +package com.parentsgowork.server.service.jobInfoService; + +import com.parentsgowork.server.apiPayload.code.status.ErrorStatus; +import com.parentsgowork.server.apiPayload.exception.JobInfoHandler; +import com.parentsgowork.server.converter.JobInfoConverter; +import com.parentsgowork.server.domain.JobInfo; +import com.parentsgowork.server.domain.User; +import com.parentsgowork.server.repository.JobInfoRepository; +import com.parentsgowork.server.repository.UserRepository; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Slf4j +public class JobInfoCommandServiceImpl implements JobInfoCommandService { + + private final UserRepository userRepository; + private final JobInfoRepository jobInfoRepository; + + @Override + public List addJobInfo(Long userId, List saveJobInfoDTOList) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new JobInfoHandler(ErrorStatus.USER_NOT_FOUND)); + + List jobInfos = saveJobInfoDTOList.stream() + .map(dto -> JobInfo.builder() + .title(dto.getTitle()) + .content(dto.getContent()) + .user(user) + .build()) + .collect(Collectors.toList()); + + jobInfoRepository.saveAll(jobInfos); + + return jobInfos.stream() + .map(JobInfoConverter::toAddJobResultDTO) + .collect(Collectors.toList()); + } + + @Override + public JobInfoResponseDTO.DeleteJobInfoDTO delete(Long userId, Long jobInfoId) { + + userRepository.findById(userId) + .orElseThrow(() -> new JobInfoHandler(ErrorStatus.USER_NOT_FOUND)); + + JobInfo jobInfo = jobInfoRepository.findByIdAndUserId(jobInfoId, userId) + .orElseThrow(() -> new JobInfoHandler(ErrorStatus.JOB_INFO_NOT_FOUND)); + + jobInfoRepository.deleteById(jobInfoId); + + return JobInfoConverter.DeleteJobInfoDTO(jobInfo); + } + +} diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java new file mode 100644 index 0000000..327d575 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryService.java @@ -0,0 +1,11 @@ +package com.parentsgowork.server.service.jobInfoService; + +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; + +import java.util.List; + +public interface JobInfoQueryService { + + List getJobInfoList(Long userId); + JobInfoResponseDTO.JobInfoDetailDTO getJobInfoDetails(Long userId, Long jobInfoId); +} diff --git a/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java new file mode 100644 index 0000000..ca384d8 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/service/jobInfoService/JobInfoQueryServiceImpl.java @@ -0,0 +1,40 @@ +package com.parentsgowork.server.service.jobInfoService; + +import com.parentsgowork.server.apiPayload.code.status.ErrorStatus; +import com.parentsgowork.server.apiPayload.exception.JobInfoHandler; +import com.parentsgowork.server.converter.JobInfoConverter; +import com.parentsgowork.server.domain.JobInfo; +import com.parentsgowork.server.repository.JobInfoRepository; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class JobInfoQueryServiceImpl implements JobInfoQueryService { + + private final JobInfoRepository jobInfoRepository; + + @Override + public List getJobInfoList(Long userId) { + + List jobInfos = jobInfoRepository.findJobInfoList(userId); + + if(jobInfos == null || jobInfos.isEmpty()) { + throw new JobInfoHandler(ErrorStatus.JOB_INFO_NOT_FOUND); + } + + return JobInfoConverter.getJobInfoListDTO(jobInfos); + } + + @Override + public JobInfoResponseDTO.JobInfoDetailDTO getJobInfoDetails(Long userId, Long jobInfoId) { + + JobInfo jobInfo = jobInfoRepository.findByIdAndUserId(jobInfoId, userId) + .orElseThrow(() -> new JobInfoHandler(ErrorStatus.JOB_INFO_NOT_FOUND)); + + return JobInfoConverter.getJobInfoDetailDTO(jobInfo); + } +} diff --git a/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java b/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java new file mode 100644 index 0000000..943fa78 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/web/controller/JobInfoController.java @@ -0,0 +1,104 @@ +package com.parentsgowork.server.web.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.parentsgowork.server.apiPayload.ApiResponse; +import com.parentsgowork.server.service.jobInfoService.JobInfoCommandService; +import com.parentsgowork.server.service.jobInfoService.JobInfoQueryService; +import com.parentsgowork.server.web.controller.specification.JobInfoSpecification; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; + +import java.util.List; +import java.util.stream.Collectors; + +@Tag(name = "JobInfo", description = "구직정보 API") +@RestController +@RequiredArgsConstructor +@RequestMapping("/jobInfo") +public class JobInfoController implements JobInfoSpecification { + + @Value("${seoul.openapi.key}") + private String apiKey; + + private final RestTemplate restTemplate = new RestTemplate(); + private final ObjectMapper objectMapper = new ObjectMapper(); + + private final JobInfoCommandService jobInfoCommandService; + private final JobInfoQueryService jobInfoQueryService; + + @GetMapping("/search") + public ResponseEntity> getParsedJobInfo() { + int start = 1; + int end = 3; + String url = String.format( + "http://openapi.seoul.go.kr:8088/%s/json/GetJobInfo/%d/%d/", + apiKey, start, end + ); + + String rawJson = restTemplate.getForObject(url, String.class); + + try { + JobInfoResponseDTO response = objectMapper.readValue(rawJson, JobInfoResponseDTO.class); + + List resultList = + response.getJobInfo().getRow().stream() + .map(row -> JobInfoResponseDTO.JobInfoResultDTO.builder() + .title(row.getTitle()) + .content(row.getContent()) + .build()) + .collect(Collectors.toList()); + + + return ResponseEntity.ok(resultList); + + } catch (Exception e) { + return ResponseEntity.status(500).build(); + } + } + + @PostMapping("/add") + public ApiResponse> addJobInfo(@RequestBody List saveJobInfoDTOList) { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Long userId = (Long) authentication.getPrincipal(); + + List response = jobInfoCommandService.addJobInfo(userId, saveJobInfoDTOList); + return ApiResponse.onSuccess(response); + } + + @GetMapping("") + public ApiResponse> getJobInfoList() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Long userId = (Long) authentication.getPrincipal(); + + List response = jobInfoQueryService.getJobInfoList(userId); + return ApiResponse.onSuccess(response); + } + + @GetMapping("/{jobInfoId}") + public ApiResponse getJobInfoDetails(@PathVariable Long jobInfoId) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Long userId = (Long) authentication.getPrincipal(); + + JobInfoResponseDTO.JobInfoDetailDTO response = jobInfoQueryService.getJobInfoDetails(userId, jobInfoId); + return ApiResponse.onSuccess(response); + } + + @DeleteMapping("/{jobInfoId}") + public ApiResponse deleteJobInfo(@PathVariable("jobInfoId") Long jobInfoId) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Long userId = (Long) authentication.getPrincipal(); + + JobInfoResponseDTO.DeleteJobInfoDTO response = jobInfoCommandService.delete(jobInfoId, userId); + return ApiResponse.onSuccess(response); + } + +} diff --git a/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java b/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java new file mode 100644 index 0000000..dda73a5 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/web/controller/specification/JobInfoSpecification.java @@ -0,0 +1,61 @@ +package com.parentsgowork.server.web.controller.specification; + +import com.parentsgowork.server.apiPayload.ApiResponse; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoRequestDTO; +import com.parentsgowork.server.web.dto.JobInfoDTO.JobInfoResponseDTO; +import com.parentsgowork.server.web.dto.PolicyInfoDTO.PolicyInfoResponseDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +public interface JobInfoSpecification { + + @GetMapping("/search") + @Operation(summary = "구직정보 조회", description = "구직정보를 조회합니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ResponseEntity> getParsedJobInfo(); + + @GetMapping("/add") + @Operation(summary = "구직정보 저장", description = "저장하고 싶은 구직정보의 title과 content값을 보내주세요.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ApiResponse> addJobInfo(@RequestBody List saveJobInfoDTOList); + + @GetMapping("") + @Operation(summary = "내가 저장한 구직정보 리스트 조회", description = "내가 저장한 구직정보 리스트를 조회합니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ApiResponse> getJobInfoList(); + + @GetMapping("/{jobInfoId}") + @Operation(summary = "특정 구직정보 조회", description = "내가 저장한 특정 구직정보를 조회합니다. 구직정보 아이디 값을 보내주세요.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ApiResponse getJobInfoDetails(@PathVariable Long jobInfoId); + + @DeleteMapping("/{jobInfoId}") + @Operation(summary = "내가 저장한 구직정보 삭제", description = "내가 저장한 특정 구직정보를 삭제합니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON400", description = "❌ BAD, 잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + ApiResponse deleteJobInfo(@PathVariable("jobInfoId") Long jobInfoId); + +} diff --git a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java new file mode 100644 index 0000000..4027b55 --- /dev/null +++ b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoRequestDTO.java @@ -0,0 +1,19 @@ +package com.parentsgowork.server.web.dto.JobInfoDTO; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class JobInfoRequestDTO { + + // 구직정보 저장 시 dto + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class SaveJobInfoDTO { + private String title; + private String content; + } +} diff --git a/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java new file mode 100644 index 0000000..459192f --- /dev/null +++ b/src/main/java/com/parentsgowork/server/web/dto/JobInfoDTO/JobInfoResponseDTO.java @@ -0,0 +1,69 @@ +package com.parentsgowork.server.web.dto.JobInfoDTO; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +import java.util.List; + +@Getter +@JsonIgnoreProperties(ignoreUnknown = true) +public class JobInfoResponseDTO { + + @JsonProperty("GetJobInfo") + private JobInfoWrapper jobInfo; + + @Getter + @JsonIgnoreProperties(ignoreUnknown = true) + public static class JobInfoWrapper { + private List row; + } + + @Getter + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Row { + @JsonProperty("JO_SJ") + private String title; + + @JsonProperty("DTY_CN") + private String content; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class JobInfoResultDTO { + private String title; + private String content; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class AddJobResultDTO { + private String title; + private String content; + } + + // 저장한 구직정보 상세페이지 dto + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class JobInfoDetailDTO { + private String title; + private String content; + } + + // 저장한 구직정보 삭제 dto + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class DeleteJobInfoDTO { + private Long id; + private String message; + } +}