From 7737b69848a0d1cdac3398d9e197b58ada6c7fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=B5=E1=86=AB=E1=84=92=E1=85=B4=E1=84=89?= =?UTF-8?q?=E1=85=A5=E1=86=BC?= Date: Mon, 22 Sep 2025 08:54:02 +0900 Subject: [PATCH 1/6] add: portfolio domain, update signup service --- .../file/controller/FileController.java | 35 ------------ .../file/controller/dto/res/FileResDto.java | 11 ---- .../domain/file/service/FileService.java | 55 ------------------- .../domain/portfolio/entity/Portfolio.java | 34 ++++++++++++ .../repository/PortfolioRepository.java | 7 +++ .../service/dto/req/PortfolioReqDto.java | 18 ++++++ .../gsmjava/domain/resume/entity/Resume.java | 7 +-- .../resume/service/dto/req/ResumeReqDto.java | 4 -- .../domain/resume/type/ResumeType.java | 5 -- .../domain/user/service/SingUpService.java | 11 +++- .../user/service/dto/req/SignUpReqDto.java | 3 + .../infra/s3/properties/S3Environment.java | 10 ---- .../infra/s3/service/UploadFileService.java | 51 ----------------- 13 files changed, 73 insertions(+), 178 deletions(-) delete mode 100644 src/main/java/gsm/gsmjava/domain/file/controller/FileController.java delete mode 100644 src/main/java/gsm/gsmjava/domain/file/controller/dto/res/FileResDto.java delete mode 100644 src/main/java/gsm/gsmjava/domain/file/service/FileService.java create mode 100644 src/main/java/gsm/gsmjava/domain/portfolio/entity/Portfolio.java create mode 100644 src/main/java/gsm/gsmjava/domain/portfolio/repository/PortfolioRepository.java create mode 100644 src/main/java/gsm/gsmjava/domain/portfolio/service/dto/req/PortfolioReqDto.java delete mode 100644 src/main/java/gsm/gsmjava/domain/resume/type/ResumeType.java delete mode 100644 src/main/java/gsm/gsmjava/infra/s3/properties/S3Environment.java delete mode 100644 src/main/java/gsm/gsmjava/infra/s3/service/UploadFileService.java diff --git a/src/main/java/gsm/gsmjava/domain/file/controller/FileController.java b/src/main/java/gsm/gsmjava/domain/file/controller/FileController.java deleted file mode 100644 index 51592bd..0000000 --- a/src/main/java/gsm/gsmjava/domain/file/controller/FileController.java +++ /dev/null @@ -1,35 +0,0 @@ -package gsm.gsmjava.domain.file.controller; - -import gsm.gsmjava.domain.file.controller.dto.res.FileResDto; -import gsm.gsmjava.domain.file.service.FileService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -@RestController -@RequestMapping("/file") -@RequiredArgsConstructor -public class FileController { - - private final FileService fileService; - - @PostMapping("/resume") - public FileResDto uploadResumeFile( - @RequestParam(value = "file") MultipartFile multipartFile - ) { - String url = fileService.uploadResumeFile(multipartFile); - return new FileResDto(url); - } - - @PostMapping("/posting") - public FileResDto uploadPostingFile( - @RequestParam(value = "file") MultipartFile multipartFile - ) { - String url = fileService.uploadPostingFile(multipartFile); - return new FileResDto(url); - } - -} diff --git a/src/main/java/gsm/gsmjava/domain/file/controller/dto/res/FileResDto.java b/src/main/java/gsm/gsmjava/domain/file/controller/dto/res/FileResDto.java deleted file mode 100644 index 4d49812..0000000 --- a/src/main/java/gsm/gsmjava/domain/file/controller/dto/res/FileResDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package gsm.gsmjava.domain.file.controller.dto.res; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@AllArgsConstructor -public class FileResDto { - private String url; -} diff --git a/src/main/java/gsm/gsmjava/domain/file/service/FileService.java b/src/main/java/gsm/gsmjava/domain/file/service/FileService.java deleted file mode 100644 index bcb492d..0000000 --- a/src/main/java/gsm/gsmjava/domain/file/service/FileService.java +++ /dev/null @@ -1,55 +0,0 @@ -package gsm.gsmjava.domain.file.service; - -import gsm.gsmjava.global.error.ExpectedException; -import gsm.gsmjava.infra.s3.service.UploadFileService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class FileService { - - private final UploadFileService uploadFileService; - - public String uploadResumeFile(MultipartFile file) { - if (file.isEmpty()) { - throw new ExpectedException("파일이 존재하지 않습니다.", HttpStatus.BAD_REQUEST); - } - String originalFileName = file.getOriginalFilename(); - String fileExtension = StringUtils.getFilenameExtension(originalFileName); - - validateResumeFileContentType(fileExtension); - return uploadFileService.execute(file, fileExtension, "resume"); - } - - public String uploadPostingFile(MultipartFile file) { - if (file.isEmpty()) { - throw new ExpectedException("파일이 존재하지 않습니다.", HttpStatus.BAD_REQUEST); - } - String originalFileName = file.getOriginalFilename(); - String fileExtension = StringUtils.getFilenameExtension(originalFileName); - - validatePostingFileContentType(fileExtension); - return uploadFileService.execute(file, fileExtension, "posting"); - } - - private void validateResumeFileContentType(String fileExtension) { - List allowExtension = List.of("pdf"); - if (!allowExtension.contains(fileExtension.toLowerCase())) { - throw new ExpectedException("지원하지 않는 파일 확장자 입니다.", HttpStatus.BAD_REQUEST); - } - } - - private void validatePostingFileContentType(String fileExtension) { - List allowExtension = List.of("pdf", "jpg", "jpeg", "png", "xls", "xlsx", "xlsm", "hwp", "hwpx", "hwt", "ppt", "pptx", "zip"); - if (!allowExtension.contains(fileExtension.toLowerCase())) { - throw new ExpectedException("지원하지 않는 파일 확장자 입니다.", HttpStatus.BAD_REQUEST); - } - } - -} diff --git a/src/main/java/gsm/gsmjava/domain/portfolio/entity/Portfolio.java b/src/main/java/gsm/gsmjava/domain/portfolio/entity/Portfolio.java new file mode 100644 index 0000000..465dd22 --- /dev/null +++ b/src/main/java/gsm/gsmjava/domain/portfolio/entity/Portfolio.java @@ -0,0 +1,34 @@ +package gsm.gsmjava.domain.portfolio.entity; + +import gsm.gsmjava.domain.user.entity.User; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "tbl_portfolio") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@ToString +@Builder +@AllArgsConstructor +public class Portfolio { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Long id; + + @JoinColumn(name = "user_id", nullable = false) + @OneToOne(fetch = FetchType.LAZY) + private User user; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String url; + + public void update(String url, String name) { + this.name = name; + this.url = url; + } +} diff --git a/src/main/java/gsm/gsmjava/domain/portfolio/repository/PortfolioRepository.java b/src/main/java/gsm/gsmjava/domain/portfolio/repository/PortfolioRepository.java new file mode 100644 index 0000000..b46a6d1 --- /dev/null +++ b/src/main/java/gsm/gsmjava/domain/portfolio/repository/PortfolioRepository.java @@ -0,0 +1,7 @@ +package gsm.gsmjava.domain.portfolio.repository; + +import gsm.gsmjava.domain.portfolio.entity.Portfolio; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PortfolioRepository extends JpaRepository { +} diff --git a/src/main/java/gsm/gsmjava/domain/portfolio/service/dto/req/PortfolioReqDto.java b/src/main/java/gsm/gsmjava/domain/portfolio/service/dto/req/PortfolioReqDto.java new file mode 100644 index 0000000..bad339b --- /dev/null +++ b/src/main/java/gsm/gsmjava/domain/portfolio/service/dto/req/PortfolioReqDto.java @@ -0,0 +1,18 @@ +package gsm.gsmjava.domain.portfolio.service.dto.req; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PortfolioReqDto { + @NotBlank + private String name; + @NotBlank + private String url; +} diff --git a/src/main/java/gsm/gsmjava/domain/resume/entity/Resume.java b/src/main/java/gsm/gsmjava/domain/resume/entity/Resume.java index 0f508de..8a88a2c 100644 --- a/src/main/java/gsm/gsmjava/domain/resume/entity/Resume.java +++ b/src/main/java/gsm/gsmjava/domain/resume/entity/Resume.java @@ -25,16 +25,11 @@ public class Resume { @Column(nullable = false) private String name; - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private ResumeType type; - @Column(nullable = false) private String url; - public void update(ResumeType type, String url, String name) { + public void update(String url, String name) { this.name = name; - this.type = type; this.url = url; } } diff --git a/src/main/java/gsm/gsmjava/domain/resume/service/dto/req/ResumeReqDto.java b/src/main/java/gsm/gsmjava/domain/resume/service/dto/req/ResumeReqDto.java index 067a613..3b05cfe 100644 --- a/src/main/java/gsm/gsmjava/domain/resume/service/dto/req/ResumeReqDto.java +++ b/src/main/java/gsm/gsmjava/domain/resume/service/dto/req/ResumeReqDto.java @@ -1,8 +1,6 @@ package gsm.gsmjava.domain.resume.service.dto.req; -import gsm.gsmjava.domain.resume.type.ResumeType; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -15,8 +13,6 @@ public class ResumeReqDto { @NotBlank private String name; - @NotNull - private ResumeType type; @NotBlank private String url; } diff --git a/src/main/java/gsm/gsmjava/domain/resume/type/ResumeType.java b/src/main/java/gsm/gsmjava/domain/resume/type/ResumeType.java deleted file mode 100644 index 6d54b44..0000000 --- a/src/main/java/gsm/gsmjava/domain/resume/type/ResumeType.java +++ /dev/null @@ -1,5 +0,0 @@ -package gsm.gsmjava.domain.resume.type; - -public enum ResumeType { - LINK, PDF -} diff --git a/src/main/java/gsm/gsmjava/domain/user/service/SingUpService.java b/src/main/java/gsm/gsmjava/domain/user/service/SingUpService.java index 672296b..3cfe82c 100644 --- a/src/main/java/gsm/gsmjava/domain/user/service/SingUpService.java +++ b/src/main/java/gsm/gsmjava/domain/user/service/SingUpService.java @@ -1,5 +1,7 @@ package gsm.gsmjava.domain.user.service; +import gsm.gsmjava.domain.portfolio.entity.Portfolio; +import gsm.gsmjava.domain.portfolio.repository.PortfolioRepository; import gsm.gsmjava.domain.resume.entity.Resume; import gsm.gsmjava.domain.resume.repository.ResumeRepository; import gsm.gsmjava.domain.user.entity.User; @@ -17,6 +19,7 @@ public class SingUpService { private final UserRepository userRepository; private final ResumeRepository resumeRepository; private final UserUtil userUtil; + private final PortfolioRepository portfolioRepository; @Transactional public void signup(SignUpReqDto reqDto) { @@ -28,10 +31,16 @@ public void signup(SignUpReqDto reqDto) { Resume resume = Resume.builder() .user(updatedUser) .name(reqDto.getResume().getName()) - .type(reqDto.getResume().getType()) .url(reqDto.getResume().getUrl()) .build(); resumeRepository.save(resume); + + Portfolio portfolio = Portfolio.builder() + .user(updatedUser) + .name(reqDto.getPortfolio().getName()) + .url(reqDto.getPortfolio().getUrl()) + .build(); + portfolioRepository.save(portfolio); } } diff --git a/src/main/java/gsm/gsmjava/domain/user/service/dto/req/SignUpReqDto.java b/src/main/java/gsm/gsmjava/domain/user/service/dto/req/SignUpReqDto.java index a3a2b74..a80f104 100644 --- a/src/main/java/gsm/gsmjava/domain/user/service/dto/req/SignUpReqDto.java +++ b/src/main/java/gsm/gsmjava/domain/user/service/dto/req/SignUpReqDto.java @@ -1,5 +1,6 @@ package gsm.gsmjava.domain.user.service.dto.req; +import gsm.gsmjava.domain.portfolio.service.dto.req.PortfolioReqDto; import gsm.gsmjava.domain.resume.service.dto.req.ResumeReqDto; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -19,4 +20,6 @@ public class SignUpReqDto { private String phoneNumber; @NotNull private ResumeReqDto resume; + @NotNull + private PortfolioReqDto portfolio; } diff --git a/src/main/java/gsm/gsmjava/infra/s3/properties/S3Environment.java b/src/main/java/gsm/gsmjava/infra/s3/properties/S3Environment.java deleted file mode 100644 index 7e576bd..0000000 --- a/src/main/java/gsm/gsmjava/infra/s3/properties/S3Environment.java +++ /dev/null @@ -1,10 +0,0 @@ -package gsm.gsmjava.infra.s3.properties; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties(prefix = "spring.cloud.aws.s3") -public record S3Environment( - String bucketName -) { - -} diff --git a/src/main/java/gsm/gsmjava/infra/s3/service/UploadFileService.java b/src/main/java/gsm/gsmjava/infra/s3/service/UploadFileService.java deleted file mode 100644 index 75e42fc..0000000 --- a/src/main/java/gsm/gsmjava/infra/s3/service/UploadFileService.java +++ /dev/null @@ -1,51 +0,0 @@ -package gsm.gsmjava.infra.s3.service; - -import gsm.gsmjava.infra.s3.properties.S3Environment; -import io.awspring.cloud.s3.ObjectMetadata; -import io.awspring.cloud.s3.S3Exception; -import io.awspring.cloud.s3.S3Resource; -import io.awspring.cloud.s3.S3Template; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; -import software.amazon.awssdk.awscore.exception.AwsServiceException; -import software.amazon.awssdk.core.exception.SdkClientException; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.util.UUID; - -@Service -@RequiredArgsConstructor -public class UploadFileService { - - private final S3Template s3Template; - private final S3Environment s3Environment; - - public String execute(MultipartFile multipartFile, String fileExtension, String directory) { - String fileName = generateFileName(fileExtension); - - try { - S3Resource s3Resource = s3Template.upload( - s3Environment.bucketName(), - directory + "/" + fileName, - multipartFile.getInputStream(), - ObjectMetadata.builder().contentType(fileExtension).build() - ); - - return s3Resource.getURL().toString(); - } catch (IOException e) { - throw new RuntimeException("입출력 작업중에 예외 발생", e); - } catch (S3Exception e) { - throw new RuntimeException("S3에서 예외 발생", e); - } catch (AwsServiceException e) { - throw new RuntimeException("AWS에서 예외 발생", e); - } catch (SdkClientException e) { - throw new RuntimeException("클라이언측 문제로 인한 예외 발생", e); - } - } - - private String generateFileName(String fileExtension) { - return UUID.randomUUID().toString() + LocalDateTime.now() + "." + fileExtension; - } -} From 0430d4731a948c2b6c83e14190c9b7897603e5dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=B5=E1=86=AB=E1=84=92=E1=85=B4=E1=84=89?= =?UTF-8?q?=E1=85=A5=E1=86=BC?= Date: Mon, 22 Sep 2025 08:55:51 +0900 Subject: [PATCH 2/6] add: portfolio update service --- .../gsm/gsmjava/domain/user/entity/User.java | 4 +++ .../user/service/UpdatePortfolioService.java | 28 +++++++++++++++++++ .../user/service/UpdateResumeService.java | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gsm/gsmjava/domain/user/service/UpdatePortfolioService.java diff --git a/src/main/java/gsm/gsmjava/domain/user/entity/User.java b/src/main/java/gsm/gsmjava/domain/user/entity/User.java index f2b75b6..ca45c1c 100644 --- a/src/main/java/gsm/gsmjava/domain/user/entity/User.java +++ b/src/main/java/gsm/gsmjava/domain/user/entity/User.java @@ -1,5 +1,6 @@ package gsm.gsmjava.domain.user.entity; +import gsm.gsmjava.domain.portfolio.entity.Portfolio; import gsm.gsmjava.domain.resume.entity.Resume; import gsm.gsmjava.domain.user.service.dto.req.SignUpReqDto; import gsm.gsmjava.domain.user.service.dto.req.UpdateInfoReqDto; @@ -36,6 +37,9 @@ public class User { @OneToOne(mappedBy = "user") private Resume resume; + @OneToOne(mappedBy = "user") + private Portfolio portfolio; + @Enumerated(EnumType.STRING) @Column(name = "authority") private Authority authority = Authority.TEMP; diff --git a/src/main/java/gsm/gsmjava/domain/user/service/UpdatePortfolioService.java b/src/main/java/gsm/gsmjava/domain/user/service/UpdatePortfolioService.java new file mode 100644 index 0000000..1a216f6 --- /dev/null +++ b/src/main/java/gsm/gsmjava/domain/user/service/UpdatePortfolioService.java @@ -0,0 +1,28 @@ +package gsm.gsmjava.domain.user.service; + +import gsm.gsmjava.domain.portfolio.entity.Portfolio; +import gsm.gsmjava.domain.portfolio.repository.PortfolioRepository; +import gsm.gsmjava.domain.portfolio.service.dto.req.PortfolioReqDto; +import gsm.gsmjava.domain.user.entity.User; +import gsm.gsmjava.global.util.UserUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class UpdatePortfolioService { + + private final UserUtil userUtil; + private final PortfolioRepository portfolioRepository; + + @Transactional + public void update(PortfolioReqDto reqDto) { + User currentUser = userUtil.getCurrentUser(); + + Portfolio portfolio = currentUser.getPortfolio(); + portfolio.update(reqDto.getUrl(), reqDto.getName()); + portfolioRepository.save(portfolio); + } + +} diff --git a/src/main/java/gsm/gsmjava/domain/user/service/UpdateResumeService.java b/src/main/java/gsm/gsmjava/domain/user/service/UpdateResumeService.java index fa974a0..04abeb3 100644 --- a/src/main/java/gsm/gsmjava/domain/user/service/UpdateResumeService.java +++ b/src/main/java/gsm/gsmjava/domain/user/service/UpdateResumeService.java @@ -21,7 +21,7 @@ public void update(ResumeReqDto reqDto) { User currentUser = userUtil.getCurrentUser(); Resume resume = currentUser.getResume(); - resume.update(reqDto.getType(), reqDto.getUrl(), reqDto.getName()); + resume.update(reqDto.getUrl(), reqDto.getName()); resumeRepository.save(resume); } From 2d8ef8b6aedca328032bd36c55b591a366e20cdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=B5=E1=86=AB=E1=84=92=E1=85=B4=E1=84=89?= =?UTF-8?q?=E1=85=A5=E1=86=BC?= Date: Mon, 22 Sep 2025 09:00:09 +0900 Subject: [PATCH 3/6] updat: resume, portfolio nullable --- .../domain/user/service/SingUpService.java | 24 +++++++++++-------- .../user/service/dto/req/SignUpReqDto.java | 3 +-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/gsm/gsmjava/domain/user/service/SingUpService.java b/src/main/java/gsm/gsmjava/domain/user/service/SingUpService.java index 3cfe82c..bc63c37 100644 --- a/src/main/java/gsm/gsmjava/domain/user/service/SingUpService.java +++ b/src/main/java/gsm/gsmjava/domain/user/service/SingUpService.java @@ -28,18 +28,22 @@ public void signup(SignUpReqDto reqDto) { currentUser.signup(reqDto); User updatedUser = userRepository.save(currentUser); - Resume resume = Resume.builder() - .user(updatedUser) - .name(reqDto.getResume().getName()) - .url(reqDto.getResume().getUrl()) - .build(); + Resume resume = (reqDto.getResume() == null) + ? null + : Resume.builder() + .user(updatedUser) + .name(reqDto.getResume().getName()) + .url(reqDto.getResume().getUrl()) + .build(); resumeRepository.save(resume); - Portfolio portfolio = Portfolio.builder() - .user(updatedUser) - .name(reqDto.getPortfolio().getName()) - .url(reqDto.getPortfolio().getUrl()) - .build(); + Portfolio portfolio = (reqDto.getPortfolio() == null) + ? null + : Portfolio.builder() + .user(updatedUser) + .name(reqDto.getPortfolio().getName()) + .url(reqDto.getPortfolio().getUrl()) + .build(); portfolioRepository.save(portfolio); } diff --git a/src/main/java/gsm/gsmjava/domain/user/service/dto/req/SignUpReqDto.java b/src/main/java/gsm/gsmjava/domain/user/service/dto/req/SignUpReqDto.java index a80f104..4a71ce4 100644 --- a/src/main/java/gsm/gsmjava/domain/user/service/dto/req/SignUpReqDto.java +++ b/src/main/java/gsm/gsmjava/domain/user/service/dto/req/SignUpReqDto.java @@ -18,8 +18,7 @@ public class SignUpReqDto { private String studentNumber; @NotBlank private String phoneNumber; - @NotNull + private ResumeReqDto resume; - @NotNull private PortfolioReqDto portfolio; } From df07d697ab131d8df54d919a4e004214b11b3588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=B5=E1=86=AB=E1=84=92=E1=85=B4=E1=84=89?= =?UTF-8?q?=E1=85=A5=E1=86=BC?= Date: Mon, 22 Sep 2025 09:05:43 +0900 Subject: [PATCH 4/6] update: apply, download service --- .../application/entity/Application.java | 8 +++--- .../application/service/ApplyService.java | 3 ++- .../application/service/DownloadService.java | 26 ++++++------------ .../domain/posting/entity/Posting.java | 5 ---- .../postingfile/entity/PostingFile.java | 27 ------------------- .../repository/PostingFileRepository.java | 7 ----- 6 files changed, 14 insertions(+), 62 deletions(-) delete mode 100644 src/main/java/gsm/gsmjava/domain/postingfile/entity/PostingFile.java delete mode 100644 src/main/java/gsm/gsmjava/domain/postingfile/repository/PostingFileRepository.java diff --git a/src/main/java/gsm/gsmjava/domain/application/entity/Application.java b/src/main/java/gsm/gsmjava/domain/application/entity/Application.java index 9c91cc4..074014b 100644 --- a/src/main/java/gsm/gsmjava/domain/application/entity/Application.java +++ b/src/main/java/gsm/gsmjava/domain/application/entity/Application.java @@ -4,7 +4,6 @@ import gsm.gsmjava.domain.applicationresult.entity.ApplicationResult; import gsm.gsmjava.domain.position.entity.Position; import gsm.gsmjava.domain.posting.entity.Posting; -import gsm.gsmjava.domain.resume.type.ResumeType; import gsm.gsmjava.domain.user.entity.User; import jakarta.persistence.*; import lombok.*; @@ -47,13 +46,14 @@ public class Application { private String applicantStudentNumber; - @Enumerated(EnumType.STRING) - private ResumeType applicantResumeType; - private String applicantResumeUrl; private String applicantResumeName; + private String applicantPortfolioUrl; + + private String applicantPortfolioName; + @Enumerated(EnumType.STRING) private ApplicationStatus applicantStatus; diff --git a/src/main/java/gsm/gsmjava/domain/application/service/ApplyService.java b/src/main/java/gsm/gsmjava/domain/application/service/ApplyService.java index e595f1e..8315413 100644 --- a/src/main/java/gsm/gsmjava/domain/application/service/ApplyService.java +++ b/src/main/java/gsm/gsmjava/domain/application/service/ApplyService.java @@ -59,9 +59,10 @@ public void apply(Long postingId, ApplyReqDto reqDto) { .applicantEmail(user.getEmail()) .applicantPhoneNumber(user.getPhoneNumber()) .applicantStudentNumber(user.getStudentNumber()) - .applicantResumeType(user.getResume().getType()) .applicantResumeUrl(user.getResume().getUrl()) .applicantResumeName(user.getResume().getName()) + .applicantPortfolioUrl(user.getPortfolio().getUrl()) + .applicantPortfolioName(user.getPortfolio().getName()) .applicantStatus(ApplicationStatus.PENDING) .build(); Application newApplication = applicationRepository.save(application); diff --git a/src/main/java/gsm/gsmjava/domain/application/service/DownloadService.java b/src/main/java/gsm/gsmjava/domain/application/service/DownloadService.java index 2b79a03..dcd0bb2 100644 --- a/src/main/java/gsm/gsmjava/domain/application/service/DownloadService.java +++ b/src/main/java/gsm/gsmjava/domain/application/service/DownloadService.java @@ -9,13 +9,10 @@ import org.springframework.transaction.annotation.Transactional; import java.io.*; -import java.net.URL; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import static gsm.gsmjava.domain.resume.type.ResumeType.*; - @Service @RequiredArgsConstructor public class DownloadService { @@ -37,15 +34,13 @@ public byte[] generateResumeZip(Long postingId, List applicationIds) { String studentNumber = app.getUser().getStudentNumber(); String position = app.getPosition().getName(); String company = app.getPosting().getCompanyName(); - String extension = app.getApplicantResumeType() == LINK ? "txt" : "pdf"; + String extension = "txt"; String resumeName = sanitize(name) + "_" + sanitize(studentNumber) + "_" + sanitize(position) + "_이력서." + extension; - byte[] resumeBytes; - if (app.getApplicantResumeType() == LINK) { - resumeBytes = createTxtWithLink(app.getApplicantResumeUrl()); - } else { - resumeBytes = downloadPdfFile(app.getApplicantResumeUrl()); - } + byte[] resumeBytes = createTxtWithLink( + app.getApplicantResumeName(), app.getApplicantResumeUrl(), + app.getApplicantPortfolioName(), app.getApplicantPortfolioUrl() + ); String pathInZip = sanitize(company) + "_이력서_모음/" + resumeName; zip.putNextEntry(new ZipEntry(pathInZip)); @@ -60,14 +55,9 @@ public byte[] generateResumeZip(Long postingId, List applicationIds) { } } - private byte[] downloadPdfFile(String url) throws IOException { - try (InputStream in = new URL(url).openStream()) { - return in.readAllBytes(); - } - } - - private byte[] createTxtWithLink(String link) { - String content = "링크로 제출된 이력서입니다:\n" + link; + private byte[] createTxtWithLink(String resumeName, String resumeUrl, String portfolioName, String portfolioUrl) { + String content = resumeName != null ? resumeName + ": " + resumeUrl : ""; + content += portfolioName != null ? portfolioName + ": " + portfolioUrl : ""; return content.getBytes(java.nio.charset.StandardCharsets.UTF_8); } diff --git a/src/main/java/gsm/gsmjava/domain/posting/entity/Posting.java b/src/main/java/gsm/gsmjava/domain/posting/entity/Posting.java index 3e7aa8a..57ccc72 100644 --- a/src/main/java/gsm/gsmjava/domain/posting/entity/Posting.java +++ b/src/main/java/gsm/gsmjava/domain/posting/entity/Posting.java @@ -1,11 +1,9 @@ package gsm.gsmjava.domain.posting.entity; import gsm.gsmjava.domain.application.entity.Application; -import gsm.gsmjava.domain.posting.service.dto.req.CreatePostingReqDto; import gsm.gsmjava.domain.posting.service.dto.req.UpdatePostingReqDto; import gsm.gsmjava.domain.posting.type.CompanyLocation; import gsm.gsmjava.domain.posting.type.EmploymentType; -import gsm.gsmjava.domain.postingfile.entity.PostingFile; import gsm.gsmjava.domain.postingposition.entity.PostingPosition; import gsm.gsmjava.domain.user.entity.User; import jakarta.persistence.*; @@ -34,9 +32,6 @@ public class Posting { @OneToMany(mappedBy = "posting", cascade = CascadeType.ALL, orphanRemoval = true) private List postingPositions; - @OneToMany(mappedBy = "posting", cascade = CascadeType.ALL, orphanRemoval = true) - private List postingFiles; - @OneToMany(mappedBy = "posting", cascade = CascadeType.ALL, orphanRemoval = true) private List applications; diff --git a/src/main/java/gsm/gsmjava/domain/postingfile/entity/PostingFile.java b/src/main/java/gsm/gsmjava/domain/postingfile/entity/PostingFile.java deleted file mode 100644 index 73a0feb..0000000 --- a/src/main/java/gsm/gsmjava/domain/postingfile/entity/PostingFile.java +++ /dev/null @@ -1,27 +0,0 @@ -package gsm.gsmjava.domain.postingfile.entity; - -import gsm.gsmjava.domain.posting.entity.Posting; -import jakarta.persistence.*; -import lombok.*; - -@Entity -@Table(name = "tbl_posting_file") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter -@ToString -@Builder -@AllArgsConstructor -public class PostingFile { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id", nullable = false) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "posting_id", nullable = false) - private Posting posting; - - private String name; - - private String url; -} diff --git a/src/main/java/gsm/gsmjava/domain/postingfile/repository/PostingFileRepository.java b/src/main/java/gsm/gsmjava/domain/postingfile/repository/PostingFileRepository.java deleted file mode 100644 index 5c0c3d9..0000000 --- a/src/main/java/gsm/gsmjava/domain/postingfile/repository/PostingFileRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package gsm.gsmjava.domain.postingfile.repository; - -import gsm.gsmjava.domain.postingfile.entity.PostingFile; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface PostingFileRepository extends JpaRepository { -} From c743e88eebd2ca909d68ffa424d10ab3821a863d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=B5=E1=86=AB=E1=84=92=E1=85=B4=E1=84=89?= =?UTF-8?q?=E1=85=A5=E1=86=BC?= Date: Mon, 22 Sep 2025 09:08:41 +0900 Subject: [PATCH 5/6] update: application query service --- .../application/service/QueryApplicationService.java | 7 ++++++- .../service/QueryMyApplicationService.java | 10 +++++----- .../service/dto/res/ApplicationResDto.java | 2 ++ .../service/dto/res/MyApplicationResDto.java | 11 +++++++++-- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/gsm/gsmjava/domain/application/service/QueryApplicationService.java b/src/main/java/gsm/gsmjava/domain/application/service/QueryApplicationService.java index 5188ca6..d2a2bd1 100644 --- a/src/main/java/gsm/gsmjava/domain/application/service/QueryApplicationService.java +++ b/src/main/java/gsm/gsmjava/domain/application/service/QueryApplicationService.java @@ -19,6 +19,8 @@ import java.util.List; +import static gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.*; + @Service @RequiredArgsConstructor public class QueryApplicationService { @@ -47,7 +49,10 @@ public ApplicationResDto queryByPosting(Long postingId) { .resume(ResumeDto.builder() .name(application.getApplicantResumeName()) .url(application.getApplicantResumeUrl()) - .type(application.getApplicantResumeType()) + .build()) + .portfolio(PortfolioDto.builder() + .name(application.getApplicantPortfolioName()) + .url(application.getApplicantPortfolioUrl()) .build()) .status(application.getApplicantStatus()) .result(application.getApplicationResult() == null ? null : ResultDto.builder() diff --git a/src/main/java/gsm/gsmjava/domain/application/service/QueryMyApplicationService.java b/src/main/java/gsm/gsmjava/domain/application/service/QueryMyApplicationService.java index 16b1c2a..8c12a74 100644 --- a/src/main/java/gsm/gsmjava/domain/application/service/QueryMyApplicationService.java +++ b/src/main/java/gsm/gsmjava/domain/application/service/QueryMyApplicationService.java @@ -3,10 +3,7 @@ import gsm.gsmjava.domain.application.entity.Application; import gsm.gsmjava.domain.application.repository.ApplicationRepository; import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto; -import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.MyApplicationDto; -import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.PositionDto; -import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.ResultDto; -import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.ResumeDto; +import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.*; import gsm.gsmjava.domain.user.entity.User; import gsm.gsmjava.global.util.UserUtil; import lombok.RequiredArgsConstructor; @@ -35,9 +32,12 @@ public MyApplicationResDto queryMy() { .employmentType(application.getPosting().getEmploymentType()) .resume(ResumeDto.builder() .name(application.getApplicantResumeName()) - .type(application.getApplicantResumeType()) .url(application.getApplicantResumeUrl()) .build()) + .portfolio(PortfolioDto.builder() + .name(application.getApplicantPortfolioName()) + .url(application.getApplicantPortfolioUrl()) + .build()) .position(PositionDto.builder() .id(application.getPosition().getId()) .name(application.getPosition().getName()) diff --git a/src/main/java/gsm/gsmjava/domain/application/service/dto/res/ApplicationResDto.java b/src/main/java/gsm/gsmjava/domain/application/service/dto/res/ApplicationResDto.java index 138fa3f..19299e2 100644 --- a/src/main/java/gsm/gsmjava/domain/application/service/dto/res/ApplicationResDto.java +++ b/src/main/java/gsm/gsmjava/domain/application/service/dto/res/ApplicationResDto.java @@ -1,6 +1,7 @@ package gsm.gsmjava.domain.application.service.dto.res; import com.fasterxml.jackson.annotation.JsonFormat; +import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.PortfolioDto; import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.PositionDto; import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.ResultDto; import gsm.gsmjava.domain.application.service.dto.res.MyApplicationResDto.ResumeDto; @@ -38,6 +39,7 @@ public static class ApplicationDto { private PositionDto position; private ApplicationStatus status; private ResumeDto resume; + private PortfolioDto portfolio; private ResultDto result; @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime createdAt; diff --git a/src/main/java/gsm/gsmjava/domain/application/service/dto/res/MyApplicationResDto.java b/src/main/java/gsm/gsmjava/domain/application/service/dto/res/MyApplicationResDto.java index b8a23d2..85c1e0e 100644 --- a/src/main/java/gsm/gsmjava/domain/application/service/dto/res/MyApplicationResDto.java +++ b/src/main/java/gsm/gsmjava/domain/application/service/dto/res/MyApplicationResDto.java @@ -5,7 +5,6 @@ import gsm.gsmjava.domain.applicationresult.type.ApplicationResultStatus; import gsm.gsmjava.domain.posting.type.CompanyLocation; import gsm.gsmjava.domain.posting.type.EmploymentType; -import gsm.gsmjava.domain.resume.type.ResumeType; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -32,6 +31,7 @@ public static class MyApplicationDto { private PositionDto position; private ApplicationStatus status; private ResumeDto resume; + private PortfolioDto portfolio; private ResultDto result; @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime createdAt; @@ -47,7 +47,14 @@ public static class MyApplicationDto { public static class ResumeDto { private String name; private String url; - private ResumeType type; + } + + @Getter + @Builder + @AllArgsConstructor + public static class PortfolioDto { + private String name; + private String url; } @Getter From 84620d24029118b646a9ab4cb0570196c28d3b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=89=E1=85=B5=E1=86=AB=E1=84=92=E1=85=B4=E1=84=89?= =?UTF-8?q?=E1=85=A5=E1=86=BC?= Date: Mon, 22 Sep 2025 09:13:07 +0900 Subject: [PATCH 6/6] update: posting domain --- .../posting/service/CreatePostingService.java | 19 ------------------- .../service/QueryPostingDetailService.java | 6 ------ .../service/dto/req/CreatePostingReqDto.java | 14 -------------- .../dto/res/QueryPostingDetailResDto.java | 3 --- .../gsmjava/domain/resume/entity/Resume.java | 1 - .../domain/user/service/UserInfoService.java | 11 ++++++++++- .../user/service/dto/res/UserInfoResDto.java | 2 ++ 7 files changed, 12 insertions(+), 44 deletions(-) diff --git a/src/main/java/gsm/gsmjava/domain/posting/service/CreatePostingService.java b/src/main/java/gsm/gsmjava/domain/posting/service/CreatePostingService.java index 9d2d5ea..d5d5163 100644 --- a/src/main/java/gsm/gsmjava/domain/posting/service/CreatePostingService.java +++ b/src/main/java/gsm/gsmjava/domain/posting/service/CreatePostingService.java @@ -6,17 +6,13 @@ import gsm.gsmjava.domain.posting.event.CreatePostingEvent; import gsm.gsmjava.domain.posting.repository.PostingRepository; import gsm.gsmjava.domain.posting.service.dto.req.CreatePostingReqDto; -import gsm.gsmjava.domain.postingfile.entity.PostingFile; -import gsm.gsmjava.domain.postingfile.repository.PostingFileRepository; import gsm.gsmjava.domain.postingposition.entity.PostingPosition; import gsm.gsmjava.domain.postingposition.repository.PostingPositionRepository; import gsm.gsmjava.domain.user.entity.User; -import gsm.gsmjava.global.error.ExpectedException; import gsm.gsmjava.global.util.UserUtil; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CacheEvict; import org.springframework.context.ApplicationEventPublisher; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,17 +28,12 @@ public class CreatePostingService { private final UserUtil userUtil; private final PositionRepository positionRepository; private final PostingPositionRepository postingPositionRepository; - private final PostingFileRepository postingFileRepository; private final PostingRepository postingRepository; private final ApplicationEventPublisher applicationEventPublisher; @Transactional @CacheEvict(value = POSTING_LIST_CACHE, key = "'ALL'", cacheManager = "cacheManager") public void create(CreatePostingReqDto reqDto) { - if (reqDto.getFiles().size() > 5) { - throw new ExpectedException("최대 5개의 파일만 업로드할 수 있습니다.", HttpStatus.BAD_REQUEST); - } - User currentUser = userUtil.getCurrentUser(); Posting posting = Posting.builder() @@ -69,16 +60,6 @@ public void create(CreatePostingReqDto reqDto) { ).toList(); postingPositionRepository.saveAll(postingPositions); - List postingFiles = reqDto.getFiles().stream() - .map(file -> - PostingFile.builder() - .posting(newPosting) - .name(file.getName()) - .url(file.getUrl()) - .build() - ).toList(); - postingFileRepository.saveAll(postingFiles); - applicationEventPublisher.publishEvent( CreatePostingEvent.builder() .postingId(newPosting.getId()) diff --git a/src/main/java/gsm/gsmjava/domain/posting/service/QueryPostingDetailService.java b/src/main/java/gsm/gsmjava/domain/posting/service/QueryPostingDetailService.java index 266044e..caf56ec 100644 --- a/src/main/java/gsm/gsmjava/domain/posting/service/QueryPostingDetailService.java +++ b/src/main/java/gsm/gsmjava/domain/posting/service/QueryPostingDetailService.java @@ -43,12 +43,6 @@ public QueryPostingDetailResDto queryOne(Long postingId) { .name(position.getPosition().getName()) .build()) .toList()) - .files(posting.getPostingFiles().stream() - .map(file -> CreatePostingReqDto.PostingFile.builder() - .name(file.getName()) - .url(file.getUrl()) - .build() - ).toList()) .applicationCount(posting.getApplicationCount()) .createdAt(posting.getCreatedAt()) .startAt(posting.getPostingStartAt()) diff --git a/src/main/java/gsm/gsmjava/domain/posting/service/dto/req/CreatePostingReqDto.java b/src/main/java/gsm/gsmjava/domain/posting/service/dto/req/CreatePostingReqDto.java index b651980..88e829d 100644 --- a/src/main/java/gsm/gsmjava/domain/posting/service/dto/req/CreatePostingReqDto.java +++ b/src/main/java/gsm/gsmjava/domain/posting/service/dto/req/CreatePostingReqDto.java @@ -4,8 +4,6 @@ import gsm.gsmjava.domain.posting.type.EmploymentType; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -26,19 +24,7 @@ public class CreatePostingReqDto { @NotNull private List positions; @NotNull - private List files; - @NotNull private LocalDateTime startAt; @NotNull private LocalDateTime endAt; - - @Getter - @Builder - @AllArgsConstructor - public static class PostingFile { - @NotBlank - private String name; - @NotBlank - private String url; - } } diff --git a/src/main/java/gsm/gsmjava/domain/posting/service/dto/res/QueryPostingDetailResDto.java b/src/main/java/gsm/gsmjava/domain/posting/service/dto/res/QueryPostingDetailResDto.java index d6adc7c..6754a0f 100644 --- a/src/main/java/gsm/gsmjava/domain/posting/service/dto/res/QueryPostingDetailResDto.java +++ b/src/main/java/gsm/gsmjava/domain/posting/service/dto/res/QueryPostingDetailResDto.java @@ -1,8 +1,6 @@ package gsm.gsmjava.domain.posting.service.dto.res; import com.fasterxml.jackson.annotation.JsonFormat; -import gsm.gsmjava.domain.posting.service.dto.req.CreatePostingReqDto; -import gsm.gsmjava.domain.posting.service.dto.req.CreatePostingReqDto.PostingFile; import gsm.gsmjava.domain.posting.type.CompanyLocation; import gsm.gsmjava.domain.posting.type.EmploymentType; import lombok.AllArgsConstructor; @@ -26,7 +24,6 @@ public class QueryPostingDetailResDto { private CompanyLocation companyLocation; private EmploymentType employmentType; private List positions; - private List files; private Integer applicationCount; @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime createdAt; diff --git a/src/main/java/gsm/gsmjava/domain/resume/entity/Resume.java b/src/main/java/gsm/gsmjava/domain/resume/entity/Resume.java index 8a88a2c..b0a6150 100644 --- a/src/main/java/gsm/gsmjava/domain/resume/entity/Resume.java +++ b/src/main/java/gsm/gsmjava/domain/resume/entity/Resume.java @@ -1,6 +1,5 @@ package gsm.gsmjava.domain.resume.entity; -import gsm.gsmjava.domain.resume.type.ResumeType; import gsm.gsmjava.domain.user.entity.User; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/gsm/gsmjava/domain/user/service/UserInfoService.java b/src/main/java/gsm/gsmjava/domain/user/service/UserInfoService.java index d5a2a9c..f392f7e 100644 --- a/src/main/java/gsm/gsmjava/domain/user/service/UserInfoService.java +++ b/src/main/java/gsm/gsmjava/domain/user/service/UserInfoService.java @@ -1,5 +1,7 @@ package gsm.gsmjava.domain.user.service; +import gsm.gsmjava.domain.portfolio.entity.Portfolio; +import gsm.gsmjava.domain.portfolio.service.dto.req.PortfolioReqDto; import gsm.gsmjava.domain.resume.entity.Resume; import gsm.gsmjava.domain.resume.service.dto.req.ResumeReqDto; import gsm.gsmjava.domain.user.entity.User; @@ -19,6 +21,7 @@ public class UserInfoService { public UserInfoResDto getInfo() { User currentUser = userUtil.getCurrentUser(); Resume resume = currentUser.getResume(); + Portfolio portfolio = currentUser.getPortfolio(); return UserInfoResDto.builder() .name(currentUser.getName()) .email(currentUser.getEmail()) @@ -28,11 +31,17 @@ public UserInfoResDto getInfo() { .resume( resume == null ? null : ResumeReqDto.builder() - .type(resume.getType()) .url(resume.getUrl()) .name(resume.getName()) .build() ) + .portfolio( + portfolio == null ? null : + PortfolioReqDto.builder() + .url(portfolio.getUrl()) + .name(portfolio.getName()) + .build() + ) .build(); } diff --git a/src/main/java/gsm/gsmjava/domain/user/service/dto/res/UserInfoResDto.java b/src/main/java/gsm/gsmjava/domain/user/service/dto/res/UserInfoResDto.java index 362a7ef..bcaa55a 100644 --- a/src/main/java/gsm/gsmjava/domain/user/service/dto/res/UserInfoResDto.java +++ b/src/main/java/gsm/gsmjava/domain/user/service/dto/res/UserInfoResDto.java @@ -1,5 +1,6 @@ package gsm.gsmjava.domain.user.service.dto.res; +import gsm.gsmjava.domain.portfolio.service.dto.req.PortfolioReqDto; import gsm.gsmjava.domain.resume.service.dto.req.ResumeReqDto; import gsm.gsmjava.domain.user.type.Authority; import lombok.AllArgsConstructor; @@ -16,4 +17,5 @@ public class UserInfoResDto { private String phoneNumber; private Authority authority; private ResumeReqDto resume; + private PortfolioReqDto portfolio; }