From ce3e1935e66f8013a7c5046767e7a0f8427a182e Mon Sep 17 00:00:00 2001 From: coco Date: Thu, 25 Jun 2026 22:44:22 +0900 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20Job=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ilson/spotwork/domain/job/entity/Job.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/main/java/com/ilson/spotwork/domain/job/entity/Job.java diff --git a/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java b/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java new file mode 100644 index 0000000..0cfdb2a --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java @@ -0,0 +1,68 @@ +package com.ilson.spotwork.domain.job.entity; + +import com.ilson.spotwork.common.entity.BaseEntity; +import com.ilson.spotwork.domain.user.entity.User; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDate; +import java.time.LocalTime; + +@Entity +@Table(name = "jobs") +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Job extends BaseEntity { + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "employer_id", nullable = false) + private User employer; + + @Column(nullable = false) + private String title; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private JobCategory category; + + @Column + private String description; + + @Column(nullable = false) + private int hourlyWage; + + @Column(nullable = false) + private LocalDate workDate; // 근무 날짜 + + @Column(nullable = false) + private LocalTime startTime; + @Column(nullable = false) + private LocalTime endTime; + + @Column(nullable = false) + private int headcount; // 모집인원 + + @Column(nullable = false) + private String address; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private JobStatus status; + + @Column(nullable = false) + private double latitude; // 위도 + @Column(nullable = false) + private double longitude; // 경도 + + public void close() { + this.status = JobStatus.CLOSED; + } + + public void updateInfo(String title, String description, int hourlyWage) { + this.title = title; + this.description = description; + this.hourlyWage = hourlyWage; + } +} From 9e17dd6719fbde4ffe123c29142a2bcf3f3da7d3 Mon Sep 17 00:00:00 2001 From: coco Date: Thu, 25 Jun 2026 22:46:44 +0900 Subject: [PATCH 02/16] =?UTF-8?q?chore:=20gradlew=20LF=20=EC=A4=84?= =?UTF-8?q?=EB=B0=94=EA=BF=88=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 gradlew diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 From 65fe9e2ebba185643dad25b193c11be8c2083b4b Mon Sep 17 00:00:00 2001 From: coco Date: Thu, 25 Jun 2026 22:47:19 +0900 Subject: [PATCH 03/16] =?UTF-8?q?feat:=20JobCategory,=20JobStatus=20enum?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ilson/spotwork/domain/job/entity/JobCategory.java | 11 +++++++++++ .../ilson/spotwork/domain/job/entity/JobStatus.java | 7 +++++++ 2 files changed, 18 insertions(+) create mode 100644 src/main/java/com/ilson/spotwork/domain/job/entity/JobCategory.java create mode 100644 src/main/java/com/ilson/spotwork/domain/job/entity/JobStatus.java diff --git a/src/main/java/com/ilson/spotwork/domain/job/entity/JobCategory.java b/src/main/java/com/ilson/spotwork/domain/job/entity/JobCategory.java new file mode 100644 index 0000000..bf99939 --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/entity/JobCategory.java @@ -0,0 +1,11 @@ +package com.ilson.spotwork.domain.job.entity; + +public enum JobCategory { + SERVING, + DELIVERY, + EVENT, + LOGISTICS, + CAFE, + CLEANING, + ETC +} diff --git a/src/main/java/com/ilson/spotwork/domain/job/entity/JobStatus.java b/src/main/java/com/ilson/spotwork/domain/job/entity/JobStatus.java new file mode 100644 index 0000000..c6232b5 --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/entity/JobStatus.java @@ -0,0 +1,7 @@ +package com.ilson.spotwork.domain.job.entity; + +public enum JobStatus { + OPEN, + CLOSED, + COMPLETED +} From 86105a05b9dec34538669b8b7d7ecfb68c6a87eb Mon Sep 17 00:00:00 2001 From: coco Date: Fri, 26 Jun 2026 12:25:20 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat:=20JobService=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20repository=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/job/repository/JobRepository.java | 21 +++ .../domain/job/service/JobService.java | 127 ++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 src/main/java/com/ilson/spotwork/domain/job/repository/JobRepository.java create mode 100644 src/main/java/com/ilson/spotwork/domain/job/service/JobService.java diff --git a/src/main/java/com/ilson/spotwork/domain/job/repository/JobRepository.java b/src/main/java/com/ilson/spotwork/domain/job/repository/JobRepository.java new file mode 100644 index 0000000..337457f --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/repository/JobRepository.java @@ -0,0 +1,21 @@ +package com.ilson.spotwork.domain.job.repository; + +import com.ilson.spotwork.domain.job.entity.Job; +import com.ilson.spotwork.domain.job.entity.JobStatus; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDate; +import java.util.List; + +public interface JobRepository extends JpaRepository { + // 공고 목록 (OPEN 상태만) + Page findByStatus(JobStatus status, Pageable pageable); + + // 자동 마감용 (날짜 지난 OPEN 공고) + List findByStatusAndWorkDateBefore(JobStatus status, LocalDate date); + + // 내 공고 목록 + Page findByEmployerId(Long employerId, Pageable pageable); +} diff --git a/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java b/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java new file mode 100644 index 0000000..8f97825 --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java @@ -0,0 +1,127 @@ +package com.ilson.spotwork.domain.job.service; + +import com.ilson.spotwork.common.exception.CustomException; +import com.ilson.spotwork.common.exception.ErrorCode; +import com.ilson.spotwork.domain.job.dto.JobCreateRequestDto; +import com.ilson.spotwork.domain.job.dto.JobResponseDto; +import com.ilson.spotwork.domain.job.dto.JobUpdateRequestDto; +import com.ilson.spotwork.domain.job.entity.Job; +import com.ilson.spotwork.domain.job.entity.JobStatus; +import com.ilson.spotwork.domain.job.repository.JobRepository; +import com.ilson.spotwork.domain.user.entity.User; +import com.ilson.spotwork.domain.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional +public class JobService { + + private final JobRepository jobRepository; + private final UserRepository userRepository; + + // 공고 등록 + public JobResponseDto register(Long userId, JobCreateRequestDto request) { + User employer = userRepository.findById(userId) + .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); + + Job job =Job.builder() + .title(request.getTitle()) + .description(request.getDescription()) + .category(request.getCategory()) + .hourlyWage(request.getHourlyWage()) + .workDate(request.getWorkDate()) + .startTime(request.getStartTime()) + .endTime(request.getEndTime()) + .headcount(request.getHeadcount()) + .address(request.getAddress()) + .latitude(request.getLatitude()) + .longitude(request.getLongitude()) + .status(JobStatus.OPEN) + .employer(employer) + .build(); + + Job saved = jobRepository.save(job); + log.info("[Job] 공고 등록 완료 jobId = {}", job.getId()); + return JobResponseDto.from(saved); + } + + // 공고 목록 조회 + @Transactional(readOnly = true) + public Page getList(Pageable pageable) { + return jobRepository.findByStatus(JobStatus.OPEN, pageable) + .map(JobResponseDto::from); + } + + //공고 상세 조회 + public JobResponseDto getDetail(Long jobId) { + Job job = jobRepository.findById(jobId) + .orElseThrow(() -> new CustomException(ErrorCode.JOB_NOT_FOUND)); + return JobResponseDto.from(job); + } + + //공고 수정 + public JobResponseDto update(Long userId, Long jobId, JobUpdateRequestDto request) { + Job job = jobRepository.findById(jobId) + .orElseThrow(() -> new CustomException(ErrorCode.JOB_NOT_FOUND)); + + //본인 공고인지 검증 + if (!job.getEmployer().getId().equals(userId)) { + throw new CustomException(ErrorCode.FORBIDDEN); + } + + // OPEN 상태인 공고만 수정 가능 + if (!job.getStatus().equals(JobStatus.OPEN)) { + throw new CustomException(ErrorCode.INVALID_INPUT); + } + + job.updateInfo( + request.getTitle(), + request.getDescription(), + request.getHourlyWage(), + request.getWorkDate(), + request.getStartTime(), + request.getEndTime(), + request.getHeadcount(), + request.getAddress() + ); + + Job saved = jobRepository.save(job); + log.info("[Job] 공고 수정 완료 jobId = {}", job.getId()); + return JobResponseDto.from(saved); + } + + // 내 공고 목록 조회 + @Transactional(readOnly = true) + public Page getMyJobs(Long userId, Pageable pageable) { + return jobRepository.findByEmployerId(userId, pageable) + .map(JobResponseDto::from); + } + + // 공고 삭제 + public void delete(Long userId, Long jobId) { + Job job = jobRepository.findById(userId) + .orElseThrow(() -> new CustomException(ErrorCode.JOB_NOT_FOUND)); + + if (!job.getEmployer().getId().equals(userId)) { + throw new CustomException(ErrorCode.FORBIDDEN); + } + + jobRepository.delete(job); + log.info("[Job] 공고 삭제 완료 jobId = {}", jobId); + } + + // 공고 마감(스케쥴러에서 호출) + public void closeJob(Long jobId) { + Job job = jobRepository.findById(jobId) + .orElseThrow(() -> new CustomException(ErrorCode.JOB_NOT_FOUND)); + job.close(); + log.info("[Job] 공고 마감 처리됨 jobId = {}", jobId); + } +} From 6e2e5117a38d5c8dde6b6090990625f4dffe2048 Mon Sep 17 00:00:00 2001 From: coco Date: Fri, 26 Jun 2026 12:25:44 +0900 Subject: [PATCH 05/16] =?UTF-8?q?feat:=20dto=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/job/dto/JobCreateRequestDto.java | 45 +++++++++++++ .../domain/job/dto/JobResponseDto.java | 64 +++++++++++++++++++ .../domain/job/dto/JobUpdateRequestDto.java | 36 +++++++++++ 3 files changed, 145 insertions(+) create mode 100644 src/main/java/com/ilson/spotwork/domain/job/dto/JobCreateRequestDto.java create mode 100644 src/main/java/com/ilson/spotwork/domain/job/dto/JobResponseDto.java create mode 100644 src/main/java/com/ilson/spotwork/domain/job/dto/JobUpdateRequestDto.java diff --git a/src/main/java/com/ilson/spotwork/domain/job/dto/JobCreateRequestDto.java b/src/main/java/com/ilson/spotwork/domain/job/dto/JobCreateRequestDto.java new file mode 100644 index 0000000..dbebbf7 --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/dto/JobCreateRequestDto.java @@ -0,0 +1,45 @@ +package com.ilson.spotwork.domain.job.dto; + +import com.ilson.spotwork.domain.job.entity.JobCategory; +import jakarta.validation.constraints.*; +import lombok.Getter; + +import java.time.LocalDate; +import java.time.LocalTime; + +@Getter +public class JobCreateRequestDto { + + @NotBlank(message = "제목은 필수입니다.") + private String title; + + private String description; + + @NotNull(message = "업종은 필수입니다.") + private JobCategory category; + + @Min(value = 10030, message = "최저시급 이상이어야 합니다.") + private int hourlyWage; + + @NotNull(message = "근무 날짜는 필수입니다.") + @FutureOrPresent(message = "근무 날짜는 오늘 이후여야 합니다.") + private LocalDate workDate; + + @NotNull(message = "시작 시간은 필수입니다.") + private LocalTime startTime; + + @NotNull(message = "종료 시간은 필수입니다.") + private LocalTime endTime; + + @Min(value = 1, message = "모집 인원은 1명 이상이어야 합니다.") + private int headcount; + + @NotBlank(message = "주소는 필수입니다.") + private String address; + + @NotNull(message = "위도는 필수입니다.") + private Double latitude; + + @NotNull(message = "경도는 필수입니다.") + private Double longitude; +} \ No newline at end of file diff --git a/src/main/java/com/ilson/spotwork/domain/job/dto/JobResponseDto.java b/src/main/java/com/ilson/spotwork/domain/job/dto/JobResponseDto.java new file mode 100644 index 0000000..d2cb8d2 --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/dto/JobResponseDto.java @@ -0,0 +1,64 @@ +package com.ilson.spotwork.domain.job.dto; + +import com.ilson.spotwork.domain.job.entity.Job; +import com.ilson.spotwork.domain.job.entity.JobCategory; +import com.ilson.spotwork.domain.job.entity.JobStatus; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; +import java.time.LocalTime; + +@Getter +@Builder +public class JobResponseDto { + + private Long id; + private String title; + private String description; + private JobCategory category; + private int hourlyWage; + private LocalDate workDate; + private LocalTime startTime; + private LocalTime endTime; + private int headcount; + private String address; + private double latitude; + private double longitude; + private JobStatus status; + private EmployerInfo employer; + + // 사업자 정보 (중첩 DTO) + @Getter + @Builder + public static class EmployerInfo { + private Long id; + private String nickname; + private Double avgRating; + } + + public static JobResponseDto from(Job job) { + return JobResponseDto.builder() + .id(job.getId()) + .title(job.getTitle()) + .description(job.getDescription()) + .category(job.getCategory()) + .hourlyWage(job.getHourlyWage()) + .workDate(job.getWorkDate()) + .startTime(job.getStartTime()) + .endTime(job.getEndTime()) + .headcount(job.getHeadcount()) + .address(job.getAddress()) + .latitude(job.getLatitude()) + .longitude(job.getLongitude()) + .status(job.getStatus()) + .employer(EmployerInfo.builder() + .id(job.getEmployer().getId()) + .nickname(job.getEmployer().getNickname()) + .avgRating(job.getEmployer().getAvgRating() != null + ? job.getEmployer().getAvgRating().doubleValue() + : null) + .build()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/ilson/spotwork/domain/job/dto/JobUpdateRequestDto.java b/src/main/java/com/ilson/spotwork/domain/job/dto/JobUpdateRequestDto.java new file mode 100644 index 0000000..72d32a4 --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/dto/JobUpdateRequestDto.java @@ -0,0 +1,36 @@ +package com.ilson.spotwork.domain.job.dto; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; + +import java.time.LocalDate; +import java.time.LocalTime; + +@Getter +public class JobUpdateRequestDto { + + @NotBlank(message = "제목은 필수입니다.") + private String title; + + private String description; + + @Min(value = 10030, message = "최저시급 이상이어야 합니다.") + private int hourlyWage; + + @NotNull + private LocalDate workDate; + + @NotNull + private LocalTime startTime; + + @NotNull + private LocalTime endTime; + + @Min(value = 1, message = "모집 인원은 1명 이상이어야 합니다.") + private int headcount; + + @NotBlank(message = "주소는 필수입니다.") + private String address; +} \ No newline at end of file From c9595e250d470d40fe49c49ec4f8dcd894223c5d Mon Sep 17 00:00:00 2001 From: coco Date: Fri, 26 Jun 2026 12:26:12 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=EA=B3=B5=EA=B3=A0=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20enum=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ilson/spotwork/domain/job/entity/JobStatus.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/ilson/spotwork/domain/job/entity/JobStatus.java b/src/main/java/com/ilson/spotwork/domain/job/entity/JobStatus.java index c6232b5..11399e1 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/entity/JobStatus.java +++ b/src/main/java/com/ilson/spotwork/domain/job/entity/JobStatus.java @@ -2,6 +2,5 @@ public enum JobStatus { OPEN, - CLOSED, - COMPLETED + CLOSED } From d31d88eec18333a13c5d957c5b687145f309add1 Mon Sep 17 00:00:00 2001 From: coco Date: Fri, 26 Jun 2026 12:26:51 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat:=20job.updatInfo()=20=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ilson/spotwork/domain/job/entity/Job.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java b/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java index 0cfdb2a..194b916 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java +++ b/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java @@ -60,9 +60,15 @@ public void close() { this.status = JobStatus.CLOSED; } - public void updateInfo(String title, String description, int hourlyWage) { + public void updateInfo(String title, String description, int hourlyWage, LocalDate workDate, LocalTime startTime, LocalTime endTime, int headcount, String address) { this.title = title; this.description = description; this.hourlyWage = hourlyWage; + this.workDate = workDate; + this.startTime = startTime; + this.endTime = endTime; + this.headcount = headcount; + this.address = address; + } } From 98b76acf81ae8c51bfadc2622b5d21dbb8272dd0 Mon Sep 17 00:00:00 2001 From: coco Date: Sat, 27 Jun 2026 01:21:50 +0900 Subject: [PATCH 08/16] =?UTF-8?q?feat:=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20Slice=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spotwork/domain/job/repository/JobRepository.java | 6 +++--- .../ilson/spotwork/domain/job/service/JobService.java | 9 +++++---- src/main/resources/application.yml | 5 ++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ilson/spotwork/domain/job/repository/JobRepository.java b/src/main/java/com/ilson/spotwork/domain/job/repository/JobRepository.java index 337457f..deb06c7 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/repository/JobRepository.java +++ b/src/main/java/com/ilson/spotwork/domain/job/repository/JobRepository.java @@ -2,8 +2,8 @@ import com.ilson.spotwork.domain.job.entity.Job; import com.ilson.spotwork.domain.job.entity.JobStatus; -import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import java.time.LocalDate; @@ -11,11 +11,11 @@ public interface JobRepository extends JpaRepository { // 공고 목록 (OPEN 상태만) - Page findByStatus(JobStatus status, Pageable pageable); + Slice findByStatus(JobStatus status, Pageable pageable); // 자동 마감용 (날짜 지난 OPEN 공고) List findByStatusAndWorkDateBefore(JobStatus status, LocalDate date); // 내 공고 목록 - Page findByEmployerId(Long employerId, Pageable pageable); + Slice findByEmployerId(Long employerId, Pageable pageable); } diff --git a/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java b/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java index 8f97825..04eea1b 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java +++ b/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java @@ -12,8 +12,8 @@ import com.ilson.spotwork.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,12 +54,13 @@ public JobResponseDto register(Long userId, JobCreateRequestDto request) { // 공고 목록 조회 @Transactional(readOnly = true) - public Page getList(Pageable pageable) { + public Slice getList(Pageable pageable) { return jobRepository.findByStatus(JobStatus.OPEN, pageable) .map(JobResponseDto::from); } //공고 상세 조회 + @Transactional(readOnly = true) public JobResponseDto getDetail(Long jobId) { Job job = jobRepository.findById(jobId) .orElseThrow(() -> new CustomException(ErrorCode.JOB_NOT_FOUND)); @@ -99,14 +100,14 @@ public JobResponseDto update(Long userId, Long jobId, JobUpdateRequestDto reques // 내 공고 목록 조회 @Transactional(readOnly = true) - public Page getMyJobs(Long userId, Pageable pageable) { + public Slice getMyJobs(Long userId, Pageable pageable) { return jobRepository.findByEmployerId(userId, pageable) .map(JobResponseDto::from); } // 공고 삭제 public void delete(Long userId, Long jobId) { - Job job = jobRepository.findById(userId) + Job job = jobRepository.findById(jobId) .orElseThrow(() -> new CustomException(ErrorCode.JOB_NOT_FOUND)); if (!job.getEmployer().getId().equals(userId)) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5faafaf..f600307 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,7 @@ spring: + Jackson: + serialization: + write-dates-as-timestamps: false datasource: url: jdbc:postgresql://localhost:5432/${DB_NAME} username: ${DB_USERNAME} @@ -6,7 +9,7 @@ spring: driver-class-name: org.postgresql.Driver jpa: hibernate: - ddl-auto: create + ddl-auto: update show-sql: true properties: hibernate: From be07faa4bfc5a9b53da0bb4e21ae26fa82bd7e5b Mon Sep 17 00:00:00 2001 From: coco Date: Sat, 27 Jun 2026 01:22:10 +0900 Subject: [PATCH 09/16] =?UTF-8?q?feat:=20JobController=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + .../domain/job/controller/JobController.java | 81 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/main/java/com/ilson/spotwork/domain/job/controller/JobController.java diff --git a/.gitignore b/.gitignore index 687b70e..cbc3552 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ logs/ ### Local config ### application-local.yml .env + +# 정적 리소스 +src/main/resources/static/ \ No newline at end of file diff --git a/src/main/java/com/ilson/spotwork/domain/job/controller/JobController.java b/src/main/java/com/ilson/spotwork/domain/job/controller/JobController.java new file mode 100644 index 0000000..1ae5f98 --- /dev/null +++ b/src/main/java/com/ilson/spotwork/domain/job/controller/JobController.java @@ -0,0 +1,81 @@ +package com.ilson.spotwork.domain.job.controller; + +import com.ilson.spotwork.common.response.ApiResponse; +import com.ilson.spotwork.domain.job.dto.JobCreateRequestDto; +import com.ilson.spotwork.domain.job.dto.JobResponseDto; +import com.ilson.spotwork.domain.job.dto.JobUpdateRequestDto; +import com.ilson.spotwork.domain.job.service.JobService; +import com.ilson.spotwork.infra.security.jwt.CustomUserDetails; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/jobs") +@RequiredArgsConstructor +public class JobController { + + private final JobService jobService; + + // 공고 등록 + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public ApiResponse register( + @AuthenticationPrincipal CustomUserDetails userDetails, + @RequestBody @Valid JobCreateRequestDto request) { + JobResponseDto response = jobService.register(userDetails.getUserId(), request); + return ApiResponse.success(response); + } + + // 공고 목록 조회 + @GetMapping + public ApiResponse> getList( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); + Slice response = jobService.getList(pageable); + return ApiResponse.success(response); + } + + // 공고 상세 조회 + @GetMapping("/{jobId}") + public ApiResponse getDetail(@PathVariable Long jobId) { + JobResponseDto response = jobService.getDetail(jobId); + return ApiResponse.success(response); + } + + // 공고 수정 + @PatchMapping("/{jobId}") + public ApiResponse update( + @AuthenticationPrincipal CustomUserDetails userDetails, + @PathVariable Long jobId, + @RequestBody @Valid JobUpdateRequestDto request) { + return ApiResponse.success(jobService.update(userDetails.getUserId(), jobId, request)); + } + + // 공고 삭제 + @DeleteMapping("/{jobId}") + public ApiResponse delete( + @AuthenticationPrincipal CustomUserDetails userDetails, + @PathVariable Long jobId) { + jobService.delete(userDetails.getUserId(), jobId); + return ApiResponse.success(); + } + + // 내 공고 목록 조회 + @GetMapping("/me") + public ApiResponse> getMyJobs( + @AuthenticationPrincipal CustomUserDetails userDetails, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); + return ApiResponse.success(jobService.getMyJobs(userDetails.getUserId(), pageable)); + } + +} From 26eb1acf13b73ada50d2706e3d7980d042a8fe8d Mon Sep 17 00:00:00 2001 From: coco Date: Sat, 27 Jun 2026 01:47:01 +0900 Subject: [PATCH 10/16] =?UTF-8?q?fix:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20Erro?= =?UTF-8?q?rCode=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ilson/spotwork/domain/job/service/JobService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java b/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java index 04eea1b..2f65253 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java +++ b/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java @@ -79,7 +79,7 @@ public JobResponseDto update(Long userId, Long jobId, JobUpdateRequestDto reques // OPEN 상태인 공고만 수정 가능 if (!job.getStatus().equals(JobStatus.OPEN)) { - throw new CustomException(ErrorCode.INVALID_INPUT); + throw new CustomException(ErrorCode.JOB_CLOSED); } job.updateInfo( From 5ef4ba6bc1ac86921b36ba5f1659d65e9421e0ee Mon Sep 17 00:00:00 2001 From: coco Date: Sun, 28 Jun 2026 00:04:57 +0900 Subject: [PATCH 11/16] =?UTF-8?q?chore:=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=EC=97=90=20=EB=94=B0=EB=A5=B8=20ddl-auto=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f600307..9a4022f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -9,7 +9,7 @@ spring: driver-class-name: org.postgresql.Driver jpa: hibernate: - ddl-auto: update + ddl-auto: validate show-sql: true properties: hibernate: From d5db5ae14b174b2223283d6d59f63635a6fc558d Mon Sep 17 00:00:00 2001 From: coco Date: Sun, 28 Jun 2026 00:07:36 +0900 Subject: [PATCH 12/16] =?UTF-8?q?chore:=20=EC=9D=91=EB=8B=B5=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B6=88=EC=9D=BC=EC=B9=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 24 +++++++++++-------- .../spotwork/common/response/ApiResponse.java | 16 ++++++------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/ilson/spotwork/common/exception/GlobalExceptionHandler.java b/src/main/java/com/ilson/spotwork/common/exception/GlobalExceptionHandler.java index 5acfe3d..8e35f10 100644 --- a/src/main/java/com/ilson/spotwork/common/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/ilson/spotwork/common/exception/GlobalExceptionHandler.java @@ -1,6 +1,7 @@ package com.ilson.spotwork.common.exception; import com.ilson.spotwork.common.response.ApiResponse; +import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; @@ -24,10 +25,7 @@ public ResponseEntity> handleCustomException(CustomException e log.error("CustomException: {}", errorCode.getMessage()); return ResponseEntity .status(errorCode.getHttpStatus()) - .body(ApiResponse.error( - errorCode.getHttpStatus().value(), - errorCode.getMessage() - )); + .body(ApiResponse.error(errorCode.getMessage())); } // 이메일 확인 동시 요청으로 인한 DB 유니크 제약 위반 처리 @@ -36,10 +34,7 @@ public ResponseEntity> handleDataIntegrityViolation(DataIntegr log.error("DataIntegrityViolationException: {}", e.getMessage()); return ResponseEntity .status(HttpStatus.CONFLICT) - .body(ApiResponse.error( - ErrorCode.DUPLICATE_EMAIL.getHttpStatus().value(), - ErrorCode.DUPLICATE_EMAIL.getMessage() - )); + .body(ApiResponse.error(ErrorCode.DUPLICATE_EMAIL.getMessage())); } // Validation 에러 처리 @@ -53,7 +48,16 @@ public ResponseEntity>> handleValidationExceptio log.error("ValidationException: {}", errors); return ResponseEntity .badRequest() - .body(ApiResponse.error(400, "입력값이 올바르지 않습니다.", errors)); + .body(ApiResponse.error("입력값이 올바르지 않습니다.", errors)); + } + + // @Validated 파라미터 검증 실패 처리 + @ExceptionHandler(ConstraintViolationException.class) + public ResponseEntity> handleConstraintViolation(ConstraintViolationException e) { + log.error("ConstraintViolationException: {}", e.getMessage()); + return ResponseEntity + .badRequest() + .body(ApiResponse.error("입력값이 올바르지 않습니다.")); } // 전체 예외 처리 (fallback) @@ -62,6 +66,6 @@ public ResponseEntity> handleException(Exception e) { log.error("Unexpected Exception: {}", e.getMessage()); return ResponseEntity .internalServerError() - .body(ApiResponse.error(500, "서버 오류가 발생했습니다.")); + .body(ApiResponse.error("서버 오류가 발생했습니다.")); } } diff --git a/src/main/java/com/ilson/spotwork/common/response/ApiResponse.java b/src/main/java/com/ilson/spotwork/common/response/ApiResponse.java index 72c1b11..3e19f4d 100644 --- a/src/main/java/com/ilson/spotwork/common/response/ApiResponse.java +++ b/src/main/java/com/ilson/spotwork/common/response/ApiResponse.java @@ -10,29 +10,27 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class ApiResponse { - private int code; private String message; private T data; - private ApiResponse(int code, String message, T data) { - this.code = code; + private ApiResponse(String message, T data) { this.message = message; this.data = data; } public static ApiResponse success(T data) { - return new ApiResponse<>(200, "success", data); + return new ApiResponse<>("success", data); } public static ApiResponse success() { - return new ApiResponse<>(200, "success", null); + return new ApiResponse<>("success", null); } - public static ApiResponse error(int code, String message) { - return new ApiResponse<>(code, message, null); + public static ApiResponse error(String message) { + return new ApiResponse<>(message, null); } - public static ApiResponse error(int code, String message, T data) { - return new ApiResponse<>(code, message, data); + public static ApiResponse error(String message, T data) { + return new ApiResponse<>(message, data); } } From 5916052d77ef93dafeca1578f8c517fd3a179865 Mon Sep 17 00:00:00 2001 From: coco Date: Sun, 28 Jun 2026 00:12:10 +0900 Subject: [PATCH 13/16] =?UTF-8?q?fix:=20=EC=A3=BC=EC=86=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=8B=9C=20=EC=9C=84,=EA=B2=BD=EB=8F=84=20?= =?UTF-8?q?=ED=95=A8=EA=BB=98=20=EC=88=98=EC=A0=95=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/job/dto/JobCreateRequestDto.java | 9 +++++++++ .../domain/job/dto/JobUpdateRequestDto.java | 16 +++++++++++++--- .../ilson/spotwork/domain/job/entity/Job.java | 5 +++-- .../spotwork/domain/job/service/JobService.java | 9 ++++++++- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ilson/spotwork/domain/job/dto/JobCreateRequestDto.java b/src/main/java/com/ilson/spotwork/domain/job/dto/JobCreateRequestDto.java index dbebbf7..6394bcc 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/dto/JobCreateRequestDto.java +++ b/src/main/java/com/ilson/spotwork/domain/job/dto/JobCreateRequestDto.java @@ -31,6 +31,11 @@ public class JobCreateRequestDto { @NotNull(message = "종료 시간은 필수입니다.") private LocalTime endTime; + @AssertTrue(message = "종료 시간은 시작 시간보다 늦어야 합니다.") + private boolean isValidTimeRange() { + return startTime == null || endTime == null || endTime.isAfter(startTime); + } + @Min(value = 1, message = "모집 인원은 1명 이상이어야 합니다.") private int headcount; @@ -38,8 +43,12 @@ public class JobCreateRequestDto { private String address; @NotNull(message = "위도는 필수입니다.") + @DecimalMin(value = "-90.0", message = "위도는 -90 이상이어야 합니다.") + @DecimalMax(value = "90.0", message = "위도는 90 이하여야 합니다.") private Double latitude; @NotNull(message = "경도는 필수입니다.") + @DecimalMin(value = "-180.0", message = "경도는 -180 이상이어야 합니다.") + @DecimalMax(value = "180.0", message = "경도는 180 이하여야 합니다.") private Double longitude; } \ No newline at end of file diff --git a/src/main/java/com/ilson/spotwork/domain/job/dto/JobUpdateRequestDto.java b/src/main/java/com/ilson/spotwork/domain/job/dto/JobUpdateRequestDto.java index 72d32a4..975e707 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/dto/JobUpdateRequestDto.java +++ b/src/main/java/com/ilson/spotwork/domain/job/dto/JobUpdateRequestDto.java @@ -1,8 +1,7 @@ package com.ilson.spotwork.domain.job.dto; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.*; + import lombok.Getter; import java.time.LocalDate; @@ -20,6 +19,7 @@ public class JobUpdateRequestDto { private int hourlyWage; @NotNull + @FutureOrPresent(message = "근무 날짜는 오늘 이후여야 합니다.") private LocalDate workDate; @NotNull @@ -33,4 +33,14 @@ public class JobUpdateRequestDto { @NotBlank(message = "주소는 필수입니다.") private String address; + + @NotNull(message = "위도는 필수입니다.") + @DecimalMin(value = "-90.0", message = "위도는 -90 이상이어야 합니다.") + @DecimalMax(value = "90.0", message = "위도는 90 이하여야 합니다.") + private Double latitude; + + @NotNull(message = "경도는 필수입니다.") + @DecimalMin(value = "-180.0", message = "경도는 -180 이상이어야 합니다.") + @DecimalMax(value = "180.0", message = "경도는 180 이하여야 합니다.") + private Double longitude; } \ No newline at end of file diff --git a/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java b/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java index 194b916..335494c 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java +++ b/src/main/java/com/ilson/spotwork/domain/job/entity/Job.java @@ -60,7 +60,7 @@ public void close() { this.status = JobStatus.CLOSED; } - public void updateInfo(String title, String description, int hourlyWage, LocalDate workDate, LocalTime startTime, LocalTime endTime, int headcount, String address) { + public void updateInfo(String title, String description, int hourlyWage, LocalDate workDate, LocalTime startTime, LocalTime endTime, int headcount, String address, double latitude, double longitude) { this.title = title; this.description = description; this.hourlyWage = hourlyWage; @@ -69,6 +69,7 @@ public void updateInfo(String title, String description, int hourlyWage, LocalDa this.endTime = endTime; this.headcount = headcount; this.address = address; - + this.latitude = latitude; + this.longitude = longitude; } } diff --git a/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java b/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java index 2f65253..3d4adf9 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java +++ b/src/main/java/com/ilson/spotwork/domain/job/service/JobService.java @@ -8,6 +8,7 @@ import com.ilson.spotwork.domain.job.entity.Job; import com.ilson.spotwork.domain.job.entity.JobStatus; import com.ilson.spotwork.domain.job.repository.JobRepository; +import com.ilson.spotwork.domain.user.entity.Role; import com.ilson.spotwork.domain.user.entity.User; import com.ilson.spotwork.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; @@ -31,6 +32,10 @@ public JobResponseDto register(Long userId, JobCreateRequestDto request) { User employer = userRepository.findById(userId) .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); + if (employer.getRole() != Role.EMPLOYER) { + throw new CustomException(ErrorCode.FORBIDDEN); + } + Job job =Job.builder() .title(request.getTitle()) .description(request.getDescription()) @@ -90,7 +95,9 @@ public JobResponseDto update(Long userId, Long jobId, JobUpdateRequestDto reques request.getStartTime(), request.getEndTime(), request.getHeadcount(), - request.getAddress() + request.getAddress(), + request.getLatitude(), + request.getLongitude() ); Job saved = jobRepository.save(job); From 1430e6d301421d071e1bba33069c337506de09f3 Mon Sep 17 00:00:00 2001 From: coco Date: Sun, 28 Jun 2026 00:12:35 +0900 Subject: [PATCH 14/16] =?UTF-8?q?fix:=20=EA=B7=BC=EB=AC=B4=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EC=97=AD=EC=A0=84=20=EA=B2=80=EC=A6=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/job/controller/JobController.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ilson/spotwork/domain/job/controller/JobController.java b/src/main/java/com/ilson/spotwork/domain/job/controller/JobController.java index 1ae5f98..212d95e 100644 --- a/src/main/java/com/ilson/spotwork/domain/job/controller/JobController.java +++ b/src/main/java/com/ilson/spotwork/domain/job/controller/JobController.java @@ -7,6 +7,8 @@ import com.ilson.spotwork.domain.job.service.JobService; import com.ilson.spotwork.infra.security.jwt.CustomUserDetails; import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Positive; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -14,8 +16,10 @@ import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +@Validated @RestController @RequestMapping("/api/jobs") @RequiredArgsConstructor @@ -36,8 +40,8 @@ public ApiResponse register( // 공고 목록 조회 @GetMapping public ApiResponse> getList( - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size) { + @RequestParam(defaultValue = "0") @Min(0) int page, + @RequestParam(defaultValue = "10") @Positive int size) { Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); Slice response = jobService.getList(pageable); return ApiResponse.success(response); @@ -72,8 +76,8 @@ public ApiResponse delete( @GetMapping("/me") public ApiResponse> getMyJobs( @AuthenticationPrincipal CustomUserDetails userDetails, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size) { + @RequestParam(defaultValue = "0") @Min(0) int page, + @RequestParam(defaultValue = "10") @Positive int size) { Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); return ApiResponse.success(jobService.getMyJobs(userDetails.getUserId(), pageable)); } From 422aeb4a4b4e7abe8f25f86e56115de5fe5062c3 Mon Sep 17 00:00:00 2001 From: coco Date: Sun, 28 Jun 2026 00:41:03 +0900 Subject: [PATCH 15/16] =?UTF-8?q?fix:=20ApiResponse.error()=20=EC=8B=9C?= =?UTF-8?q?=EA=B7=B8=EB=8B=88=EC=B2=98=20=EB=B6=88=EC=9D=BC=EC=B9=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spotwork/infra/security/SecurityConfig.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ilson/spotwork/infra/security/SecurityConfig.java b/src/main/java/com/ilson/spotwork/infra/security/SecurityConfig.java index 956c255..22522c4 100644 --- a/src/main/java/com/ilson/spotwork/infra/security/SecurityConfig.java +++ b/src/main/java/com/ilson/spotwork/infra/security/SecurityConfig.java @@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; @@ -35,21 +36,13 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte response.setContentType("application/json;charset=UTF-8"); response.getWriter().write( objectMapper.writeValueAsString( - ApiResponse.error(401, "인증이 필요합니다."))); + ApiResponse.error("인증이 필요합니다."))); }) ) .authorizeHttpRequests(auth -> auth - .requestMatchers( - "/api/auth/signup", - "/api/auth/login", - "/api/auth/reissue", - "/api/jobs", - "/api/jobs/{jobId}", - "/api/jobs/search", - "/api/jobs/nearby", - "/swagger-ui/**", - "/v3/api-docs/**" - ).permitAll() + .requestMatchers(HttpMethod.GET, "/api/jobs", "/api/jobs/search", "/api/jobs/nearby").permitAll() + .requestMatchers("/api/auth/signup", "/api/auth/login", "/api/auth/reissue").permitAll() + .requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll() .anyRequest().authenticated() ) .addFilterBefore( From 2a28f2be1f005ac1b69e8ed0a7f5554472ae89fa Mon Sep 17 00:00:00 2001 From: coco Date: Sun, 28 Jun 2026 00:57:30 +0900 Subject: [PATCH 16/16] =?UTF-8?q?chore:=20ci=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=9A=A9=20=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/test/resources/application.yml diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 0000000..40ed868 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,19 @@ +spring: + datasource: + url: jdbc:postgresql://localhost:5432/ilson + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + driver-class-name: org.postgresql.Driver + jpa: + hibernate: + ddl-auto: create-drop + show-sql: true + data: + redis: + host: localhost + port: 6379 + +jwt: + secret: ${JWT_SECRET} + access-token-expiration: 1800000 + refresh-token-expiration: 604800000 \ No newline at end of file