diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 63c83769..d8bdd611 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,8 @@ name: Merge Dev to Main on: push: branches: [ main ] + paths-ignore: + - 'README.md' jobs: build: diff --git a/build.gradle b/build.gradle index 52e13fb5..b07c5a78 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,9 @@ +buildscript { + ext { + queryDslVersion = "5.0.0" + } +} + plugins { id 'java' id 'org.springframework.boot' version '3.3.1' @@ -24,8 +30,6 @@ repositories { } dependencies { - - // Spring Boot implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-mail' @@ -46,6 +50,12 @@ dependencies { runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' implementation 'org.springframework.boot:spring-boot-starter-data-redis' + // QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + // AWS SDK for java implementation platform('software.amazon.awssdk:bom:2.20.56') implementation 'software.amazon.awssdk:s3' @@ -70,3 +80,21 @@ dependencies { tasks.named('test') { useJUnitPlatform() } + +// Querydsl 설정부 +def generated = 'src/main/generated' + +// querydsl QClass 파일 생성 위치를 지정 +tasks.withType(JavaCompile) { + options.getGeneratedSourceOutputDirectory().set(file(generated)) +} + +// java source set 에 querydsl QClass 위치 추가 +sourceSets { + main.java.srcDirs += [generated] +} + +// gradle clean 시에 QClass 디렉토리 삭제 +clean { + delete file(generated) +} \ No newline at end of file diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QApplicantEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QApplicantEntity.java new file mode 100644 index 00000000..2782163c --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QApplicantEntity.java @@ -0,0 +1,51 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QApplicantEntity is a Querydsl query type for ApplicantEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QApplicantEntity extends EntityPathBase { + + private static final long serialVersionUID = 104035295L; + + public static final QApplicantEntity applicantEntity = new QApplicantEntity("applicantEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath candidateKey = createString("candidateKey"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final NumberPath score = createNumber("score", Integer.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QApplicantEntity(String variable) { + super(ApplicantEntity.class, forVariable(variable)); + } + + public QApplicantEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QApplicantEntity(PathMetadata metadata) { + super(ApplicantEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QAppliedJobPostingEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QAppliedJobPostingEntity.java new file mode 100644 index 00000000..10c20157 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QAppliedJobPostingEntity.java @@ -0,0 +1,49 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QAppliedJobPostingEntity is a Querydsl query type for AppliedJobPostingEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAppliedJobPostingEntity extends EntityPathBase { + + private static final long serialVersionUID = 2052919295L; + + public static final QAppliedJobPostingEntity appliedJobPostingEntity = new QAppliedJobPostingEntity("appliedJobPostingEntity"); + + public final DatePath appliedDate = createDate("appliedDate", java.time.LocalDate.class); + + public final StringPath candidateKey = createString("candidateKey"); + + public final DatePath endDate = createDate("endDate", java.time.LocalDate.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final StringPath stepName = createString("stepName"); + + public final StringPath title = createString("title"); + + public QAppliedJobPostingEntity(String variable) { + super(AppliedJobPostingEntity.class, forVariable(variable)); + } + + public QAppliedJobPostingEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QAppliedJobPostingEntity(PathMetadata metadata) { + super(AppliedJobPostingEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QBaseEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QBaseEntity.java new file mode 100644 index 00000000..26d5c993 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QBaseEntity.java @@ -0,0 +1,39 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = -674539654L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QCandidateEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QCandidateEntity.java new file mode 100644 index 00000000..8432edac --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QCandidateEntity.java @@ -0,0 +1,55 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCandidateEntity is a Querydsl query type for CandidateEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCandidateEntity extends EntityPathBase { + + private static final long serialVersionUID = -1385478752L; + + public static final QCandidateEntity candidateEntity = new QCandidateEntity("candidateEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath candidateKey = createString("candidateKey"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath email = createString("email"); + + public final StringPath name = createString("name"); + + public final StringPath password = createString("password"); + + public final StringPath phoneNumber = createString("phoneNumber"); + + public final EnumPath role = createEnum("role", com.ctrls.auto_enter_view.enums.UserRole.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QCandidateEntity(String variable) { + super(CandidateEntity.class, forVariable(variable)); + } + + public QCandidateEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCandidateEntity(PathMetadata metadata) { + super(CandidateEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QCandidateListEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QCandidateListEntity.java new file mode 100644 index 00000000..d779e4bf --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QCandidateListEntity.java @@ -0,0 +1,53 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCandidateListEntity is a Querydsl query type for CandidateListEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCandidateListEntity extends EntityPathBase { + + private static final long serialVersionUID = 723930462L; + + public static final QCandidateListEntity candidateListEntity = new QCandidateListEntity("candidateListEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath candidateKey = createString("candidateKey"); + + public final StringPath candidateListKey = createString("candidateListKey"); + + public final StringPath candidateName = createString("candidateName"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final NumberPath jobPostingStepId = createNumber("jobPostingStepId", Long.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QCandidateListEntity(String variable) { + super(CandidateListEntity.class, forVariable(variable)); + } + + public QCandidateListEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCandidateListEntity(PathMetadata metadata) { + super(CandidateListEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QCompanyEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QCompanyEntity.java new file mode 100644 index 00000000..b6b741d6 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QCompanyEntity.java @@ -0,0 +1,55 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCompanyEntity is a Querydsl query type for CompanyEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCompanyEntity extends EntityPathBase { + + private static final long serialVersionUID = -1772742758L; + + public static final QCompanyEntity companyEntity = new QCompanyEntity("companyEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath companyKey = createString("companyKey"); + + public final StringPath companyName = createString("companyName"); + + public final StringPath companyNumber = createString("companyNumber"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath email = createString("email"); + + public final StringPath password = createString("password"); + + public final EnumPath role = createEnum("role", com.ctrls.auto_enter_view.enums.UserRole.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QCompanyEntity(String variable) { + super(CompanyEntity.class, forVariable(variable)); + } + + public QCompanyEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCompanyEntity(PathMetadata metadata) { + super(CompanyEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QCompanyInfoEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QCompanyInfoEntity.java new file mode 100644 index 00000000..156d36a7 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QCompanyInfoEntity.java @@ -0,0 +1,59 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCompanyInfoEntity is a Querydsl query type for CompanyInfoEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCompanyInfoEntity extends EntityPathBase { + + private static final long serialVersionUID = -678495640L; + + public static final QCompanyInfoEntity companyInfoEntity = new QCompanyInfoEntity("companyInfoEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath address = createString("address"); + + public final StringPath boss = createString("boss"); + + public final DatePath companyAge = createDate("companyAge", java.time.LocalDate.class); + + public final StringPath companyInfoKey = createString("companyInfoKey"); + + public final StringPath companyKey = createString("companyKey"); + + public final StringPath companyName = createString("companyName"); + + public final StringPath companyUrl = createString("companyUrl"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath employees = createNumber("employees", Integer.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QCompanyInfoEntity(String variable) { + super(CompanyInfoEntity.class, forVariable(variable)); + } + + public QCompanyInfoEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCompanyInfoEntity(PathMetadata metadata) { + super(CompanyInfoEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QInterviewScheduleEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QInterviewScheduleEntity.java new file mode 100644 index 00000000..6276ce63 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QInterviewScheduleEntity.java @@ -0,0 +1,53 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QInterviewScheduleEntity is a Querydsl query type for InterviewScheduleEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QInterviewScheduleEntity extends EntityPathBase { + + private static final long serialVersionUID = -1551986283L; + + public static final QInterviewScheduleEntity interviewScheduleEntity = new QInterviewScheduleEntity("interviewScheduleEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DatePath firstInterviewDate = createDate("firstInterviewDate", java.time.LocalDate.class); + + public final StringPath interviewScheduleKey = createString("interviewScheduleKey"); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final NumberPath jobPostingStepId = createNumber("jobPostingStepId", Long.class); + + public final DatePath lastInterviewDate = createDate("lastInterviewDate", java.time.LocalDate.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QInterviewScheduleEntity(String variable) { + super(InterviewScheduleEntity.class, forVariable(variable)); + } + + public QInterviewScheduleEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QInterviewScheduleEntity(PathMetadata metadata) { + super(InterviewScheduleEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QInterviewScheduleParticipantsEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QInterviewScheduleParticipantsEntity.java new file mode 100644 index 00000000..6a7a4586 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QInterviewScheduleParticipantsEntity.java @@ -0,0 +1,59 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QInterviewScheduleParticipantsEntity is a Querydsl query type for InterviewScheduleParticipantsEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QInterviewScheduleParticipantsEntity extends EntityPathBase { + + private static final long serialVersionUID = -2127412651L; + + public static final QInterviewScheduleParticipantsEntity interviewScheduleParticipantsEntity = new QInterviewScheduleParticipantsEntity("interviewScheduleParticipantsEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath candidateKey = createString("candidateKey"); + + public final StringPath candidateName = createString("candidateName"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final DateTimePath interviewEndDatetime = createDateTime("interviewEndDatetime", java.time.LocalDateTime.class); + + public final StringPath interviewScheduleKey = createString("interviewScheduleKey"); + + public final DateTimePath interviewStartDatetime = createDateTime("interviewStartDatetime", java.time.LocalDateTime.class); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final NumberPath jobPostingStepId = createNumber("jobPostingStepId", Long.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QInterviewScheduleParticipantsEntity(String variable) { + super(InterviewScheduleParticipantsEntity.class, forVariable(variable)); + } + + public QInterviewScheduleParticipantsEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QInterviewScheduleParticipantsEntity(PathMetadata metadata) { + super(InterviewScheduleParticipantsEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingEntity.java new file mode 100644 index 00000000..14619936 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingEntity.java @@ -0,0 +1,71 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QJobPostingEntity is a Querydsl query type for JobPostingEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QJobPostingEntity extends EntityPathBase { + + private static final long serialVersionUID = -308060690L; + + public static final QJobPostingEntity jobPostingEntity = new QJobPostingEntity("jobPostingEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath career = createNumber("career", Integer.class); + + public final StringPath companyKey = createString("companyKey"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final EnumPath education = createEnum("education", com.ctrls.auto_enter_view.enums.Education.class); + + public final StringPath employmentType = createString("employmentType"); + + public final DatePath endDate = createDate("endDate", java.time.LocalDate.class); + + public final EnumPath jobCategory = createEnum("jobCategory", com.ctrls.auto_enter_view.enums.JobCategory.class); + + public final StringPath jobPostingContent = createString("jobPostingContent"); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final NumberPath passingNumber = createNumber("passingNumber", Integer.class); + + public final NumberPath salary = createNumber("salary", Long.class); + + public final DatePath startDate = createDate("startDate", java.time.LocalDate.class); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final StringPath workLocation = createString("workLocation"); + + public final StringPath workTime = createString("workTime"); + + public QJobPostingEntity(String variable) { + super(JobPostingEntity.class, forVariable(variable)); + } + + public QJobPostingEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QJobPostingEntity(PathMetadata metadata) { + super(JobPostingEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingImageEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingImageEntity.java new file mode 100644 index 00000000..ce7d90f6 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingImageEntity.java @@ -0,0 +1,49 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QJobPostingImageEntity is a Querydsl query type for JobPostingImageEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QJobPostingImageEntity extends EntityPathBase { + + private static final long serialVersionUID = -1953636877L; + + public static final QJobPostingImageEntity jobPostingImageEntity = new QJobPostingImageEntity("jobPostingImageEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath companyImageUrl = createString("companyImageUrl"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QJobPostingImageEntity(String variable) { + super(JobPostingImageEntity.class, forVariable(variable)); + } + + public QJobPostingImageEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QJobPostingImageEntity(PathMetadata metadata) { + super(JobPostingImageEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingStepEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingStepEntity.java new file mode 100644 index 00000000..5055a7ae --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingStepEntity.java @@ -0,0 +1,41 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QJobPostingStepEntity is a Querydsl query type for JobPostingStepEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QJobPostingStepEntity extends EntityPathBase { + + private static final long serialVersionUID = 1894189658L; + + public static final QJobPostingStepEntity jobPostingStepEntity = new QJobPostingStepEntity("jobPostingStepEntity"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final StringPath step = createString("step"); + + public QJobPostingStepEntity(String variable) { + super(JobPostingStepEntity.class, forVariable(variable)); + } + + public QJobPostingStepEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QJobPostingStepEntity(PathMetadata metadata) { + super(JobPostingStepEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingTechStackEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingTechStackEntity.java new file mode 100644 index 00000000..003075e9 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QJobPostingTechStackEntity.java @@ -0,0 +1,41 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QJobPostingTechStackEntity is a Querydsl query type for JobPostingTechStackEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QJobPostingTechStackEntity extends EntityPathBase { + + private static final long serialVersionUID = -199476630L; + + public static final QJobPostingTechStackEntity jobPostingTechStackEntity = new QJobPostingTechStackEntity("jobPostingTechStackEntity"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final EnumPath techName = createEnum("techName", com.ctrls.auto_enter_view.enums.TechStack.class); + + public QJobPostingTechStackEntity(String variable) { + super(JobPostingTechStackEntity.class, forVariable(variable)); + } + + public QJobPostingTechStackEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QJobPostingTechStackEntity(PathMetadata metadata) { + super(JobPostingTechStackEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QMailAlarmInfoEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QMailAlarmInfoEntity.java new file mode 100644 index 00000000..f550c56d --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QMailAlarmInfoEntity.java @@ -0,0 +1,55 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QMailAlarmInfoEntity is a Querydsl query type for MailAlarmInfoEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMailAlarmInfoEntity extends EntityPathBase { + + private static final long serialVersionUID = 50273797L; + + public static final QMailAlarmInfoEntity mailAlarmInfoEntity = new QMailAlarmInfoEntity("mailAlarmInfoEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath interviewScheduleKey = createString("interviewScheduleKey"); + + public final StringPath jobPostingKey = createString("jobPostingKey"); + + public final NumberPath jobPostingStepId = createNumber("jobPostingStepId", Long.class); + + public final StringPath mailContent = createString("mailContent"); + + public final DateTimePath mailSendDateTime = createDateTime("mailSendDateTime", java.time.LocalDateTime.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QMailAlarmInfoEntity(String variable) { + super(MailAlarmInfoEntity.class, forVariable(variable)); + } + + public QMailAlarmInfoEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMailAlarmInfoEntity(PathMetadata metadata) { + super(MailAlarmInfoEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeCareerEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeCareerEntity.java new file mode 100644 index 00000000..6c9cbfc6 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeCareerEntity.java @@ -0,0 +1,49 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QResumeCareerEntity is a Querydsl query type for ResumeCareerEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QResumeCareerEntity extends EntityPathBase { + + private static final long serialVersionUID = 1089985844L; + + public static final QResumeCareerEntity resumeCareerEntity = new QResumeCareerEntity("resumeCareerEntity"); + + public final NumberPath calculatedCareer = createNumber("calculatedCareer", Integer.class); + + public final StringPath companyName = createString("companyName"); + + public final DatePath endDate = createDate("endDate", java.time.LocalDate.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final EnumPath jobCategory = createEnum("jobCategory", com.ctrls.auto_enter_view.enums.JobCategory.class); + + public final StringPath resumeKey = createString("resumeKey"); + + public final DatePath startDate = createDate("startDate", java.time.LocalDate.class); + + public QResumeCareerEntity(String variable) { + super(ResumeCareerEntity.class, forVariable(variable)); + } + + public QResumeCareerEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QResumeCareerEntity(PathMetadata metadata) { + super(ResumeCareerEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeCertificateEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeCertificateEntity.java new file mode 100644 index 00000000..eb0151ab --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeCertificateEntity.java @@ -0,0 +1,43 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QResumeCertificateEntity is a Querydsl query type for ResumeCertificateEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QResumeCertificateEntity extends EntityPathBase { + + private static final long serialVersionUID = -741748729L; + + public static final QResumeCertificateEntity resumeCertificateEntity = new QResumeCertificateEntity("resumeCertificateEntity"); + + public final DatePath certificateDate = createDate("certificateDate", java.time.LocalDate.class); + + public final StringPath certificateName = createString("certificateName"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath resumeKey = createString("resumeKey"); + + public QResumeCertificateEntity(String variable) { + super(ResumeCertificateEntity.class, forVariable(variable)); + } + + public QResumeCertificateEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QResumeCertificateEntity(PathMetadata metadata) { + super(ResumeCertificateEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeEntity.java new file mode 100644 index 00000000..939aa87b --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeEntity.java @@ -0,0 +1,69 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QResumeEntity is a Querydsl query type for ResumeEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QResumeEntity extends EntityPathBase { + + private static final long serialVersionUID = 879813206L; + + public static final QResumeEntity resumeEntity = new QResumeEntity("resumeEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath address = createString("address"); + + public final DatePath birthDate = createDate("birthDate", java.time.LocalDate.class); + + public final StringPath candidateKey = createString("candidateKey"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final EnumPath education = createEnum("education", com.ctrls.auto_enter_view.enums.Education.class); + + public final StringPath email = createString("email"); + + public final StringPath gender = createString("gender"); + + public final EnumPath jobWant = createEnum("jobWant", com.ctrls.auto_enter_view.enums.JobCategory.class); + + public final StringPath name = createString("name"); + + public final StringPath phoneNumber = createString("phoneNumber"); + + public final StringPath portfolio = createString("portfolio"); + + public final StringPath resumeKey = createString("resumeKey"); + + public final StringPath schoolName = createString("schoolName"); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QResumeEntity(String variable) { + super(ResumeEntity.class, forVariable(variable)); + } + + public QResumeEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QResumeEntity(PathMetadata metadata) { + super(ResumeEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeExperienceEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeExperienceEntity.java new file mode 100644 index 00000000..fc24af0a --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeExperienceEntity.java @@ -0,0 +1,45 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QResumeExperienceEntity is a Querydsl query type for ResumeExperienceEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QResumeExperienceEntity extends EntityPathBase { + + private static final long serialVersionUID = -742343520L; + + public static final QResumeExperienceEntity resumeExperienceEntity = new QResumeExperienceEntity("resumeExperienceEntity"); + + public final DatePath endDate = createDate("endDate", java.time.LocalDate.class); + + public final StringPath experienceName = createString("experienceName"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath resumeKey = createString("resumeKey"); + + public final DatePath startDate = createDate("startDate", java.time.LocalDate.class); + + public QResumeExperienceEntity(String variable) { + super(ResumeExperienceEntity.class, forVariable(variable)); + } + + public QResumeExperienceEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QResumeExperienceEntity(PathMetadata metadata) { + super(ResumeExperienceEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeImageEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeImageEntity.java new file mode 100644 index 00000000..1e1ab978 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeImageEntity.java @@ -0,0 +1,49 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QResumeImageEntity is a Querydsl query type for ResumeImageEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QResumeImageEntity extends EntityPathBase { + + private static final long serialVersionUID = 1846205067L; + + public static final QResumeImageEntity resumeImageEntity = new QResumeImageEntity("resumeImageEntity"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath resumeImageUrl = createString("resumeImageUrl"); + + public final StringPath resumeKey = createString("resumeKey"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QResumeImageEntity(String variable) { + super(ResumeImageEntity.class, forVariable(variable)); + } + + public QResumeImageEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QResumeImageEntity(PathMetadata metadata) { + super(ResumeImageEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeTechStackEntity.java b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeTechStackEntity.java new file mode 100644 index 00000000..ea8eac05 --- /dev/null +++ b/src/main/generated/com/ctrls/auto_enter_view/entity/QResumeTechStackEntity.java @@ -0,0 +1,41 @@ +package com.ctrls.auto_enter_view.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QResumeTechStackEntity is a Querydsl query type for ResumeTechStackEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QResumeTechStackEntity extends EntityPathBase { + + private static final long serialVersionUID = 538520322L; + + public static final QResumeTechStackEntity resumeTechStackEntity = new QResumeTechStackEntity("resumeTechStackEntity"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath resumeKey = createString("resumeKey"); + + public final EnumPath techStackName = createEnum("techStackName", com.ctrls.auto_enter_view.enums.TechStack.class); + + public QResumeTechStackEntity(String variable) { + super(ResumeTechStackEntity.class, forVariable(variable)); + } + + public QResumeTechStackEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QResumeTechStackEntity(PathMetadata metadata) { + super(ResumeTechStackEntity.class, metadata); + } + +} + diff --git a/src/main/java/com/ctrls/auto_enter_view/config/QuerydslConfig.java b/src/main/java/com/ctrls/auto_enter_view/config/QuerydslConfig.java new file mode 100644 index 00000000..0eab2727 --- /dev/null +++ b/src/main/java/com/ctrls/auto_enter_view/config/QuerydslConfig.java @@ -0,0 +1,21 @@ +package com.ctrls.auto_enter_view.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QuerydslConfig { + + private final EntityManager entityManager; + + public QuerydslConfig(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} \ No newline at end of file diff --git a/src/main/java/com/ctrls/auto_enter_view/controller/SearchController.java b/src/main/java/com/ctrls/auto_enter_view/controller/SearchController.java new file mode 100644 index 00000000..e1c25e20 --- /dev/null +++ b/src/main/java/com/ctrls/auto_enter_view/controller/SearchController.java @@ -0,0 +1,40 @@ +package com.ctrls.auto_enter_view.controller; + +import com.ctrls.auto_enter_view.enums.Education; +import com.ctrls.auto_enter_view.enums.JobCategory; +import com.ctrls.auto_enter_view.enums.TechStack; +import com.ctrls.auto_enter_view.service.SearchService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/job-postings") +public class SearchController { + + private final SearchService searchService; + + @GetMapping("/filter") + public List searchJobPostings( + @RequestParam(required = false) JobCategory position, + @RequestParam(required = false) List techStacks, + @RequestParam(required = false) String employmentType, + @RequestParam(required = false) Integer minCareer, + @RequestParam(required = false) Integer maxCareer, + @RequestParam(required = false) Education education, + @RequestParam(required = false) Long minSalary, + @RequestParam(required = false) Long maxSalary) { + + return searchService.searchJobPostings(position, techStacks, employmentType, minCareer, + maxCareer, education, minSalary, maxSalary); + } + + @GetMapping("/search") + public List searchJobPostings(@RequestParam("keyword") String keyword) { + return searchService.searchJobPostingsByKeyword(keyword); + } +} diff --git a/src/main/java/com/ctrls/auto_enter_view/entity/JobPostingEntity.java b/src/main/java/com/ctrls/auto_enter_view/entity/JobPostingEntity.java index b1f38985..df215950 100644 --- a/src/main/java/com/ctrls/auto_enter_view/entity/JobPostingEntity.java +++ b/src/main/java/com/ctrls/auto_enter_view/entity/JobPostingEntity.java @@ -5,6 +5,8 @@ import com.ctrls.auto_enter_view.enums.JobCategory; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.Id; import jakarta.persistence.Table; import java.time.LocalDate; @@ -31,6 +33,7 @@ public class JobPostingEntity extends BaseEntity { private String title; @Column(nullable = false) + @Enumerated(EnumType.STRING) private JobCategory jobCategory; private Integer career; @@ -39,6 +42,7 @@ public class JobPostingEntity extends BaseEntity { private String workLocation; @Column(nullable = false) + @Enumerated(EnumType.STRING) private Education education; @Column(nullable = false) diff --git a/src/main/java/com/ctrls/auto_enter_view/repository/JobPostingRepositoryCustom.java b/src/main/java/com/ctrls/auto_enter_view/repository/JobPostingRepositoryCustom.java new file mode 100644 index 00000000..e761824a --- /dev/null +++ b/src/main/java/com/ctrls/auto_enter_view/repository/JobPostingRepositoryCustom.java @@ -0,0 +1,32 @@ +package com.ctrls.auto_enter_view.repository; + +import com.ctrls.auto_enter_view.enums.Education; +import com.ctrls.auto_enter_view.enums.JobCategory; +import com.ctrls.auto_enter_view.enums.TechStack; +import java.util.List; + +public interface JobPostingRepositoryCustom { + + /** + * 필터링된 채용 공고의 jobPostingKey 조회 + * + * @param jobCategory 채용 직무 + * @param techStacks 기술 스택 목록 + * @param employmentType 고용 형태 + * @param minCareer 최소 경력 + * @param maxCareer 최소 경력 + * @param education 학력 + * @return 필터링된 jobPostingKey 목록 + */ + List searchJobPostings( + JobCategory jobCategory, + List techStacks, + String employmentType, + Integer minCareer, + Integer maxCareer, + Education education, + Long minSalary, + Long maxSalary); + + List searchJobPostingsByKeyword(String keyword); +} diff --git a/src/main/java/com/ctrls/auto_enter_view/repository/JobPostingRepositoryCustomImpl.java b/src/main/java/com/ctrls/auto_enter_view/repository/JobPostingRepositoryCustomImpl.java new file mode 100644 index 00000000..9cc83cdd --- /dev/null +++ b/src/main/java/com/ctrls/auto_enter_view/repository/JobPostingRepositoryCustomImpl.java @@ -0,0 +1,109 @@ +package com.ctrls.auto_enter_view.repository; + +import static com.ctrls.auto_enter_view.entity.QCompanyEntity.companyEntity; +import static com.ctrls.auto_enter_view.entity.QJobPostingEntity.jobPostingEntity; +import static com.ctrls.auto_enter_view.entity.QJobPostingTechStackEntity.jobPostingTechStackEntity; + +import com.ctrls.auto_enter_view.entity.QJobPostingEntity; +import com.ctrls.auto_enter_view.entity.QJobPostingTechStackEntity; +import com.ctrls.auto_enter_view.enums.Education; +import com.ctrls.auto_enter_view.enums.JobCategory; +import com.ctrls.auto_enter_view.enums.TechStack; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class JobPostingRepositoryCustomImpl implements JobPostingRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + @Override + public List searchJobPostings( + JobCategory jobCategory, + List techStacks, + String employmentType, + Integer minCareer, + Integer maxCareer, + Education education, + Long minSalary, + Long maxSalary) { + + QJobPostingEntity jobPosting = jobPostingEntity; + QJobPostingTechStackEntity jobPostingTechStack = jobPostingTechStackEntity; + + BooleanBuilder jobPostingPredicate = new BooleanBuilder(); + BooleanBuilder techStackPredicate = new BooleanBuilder(); + + if (jobCategory != null) { + jobPostingPredicate.and(jobPosting.jobCategory.eq(jobCategory)); + } + + if (techStacks != null && !techStacks.isEmpty()) { + for (TechStack techStack : techStacks) { + techStackPredicate.and(jobPostingTechStack.techName.eq(techStack)); + } + } + + if (employmentType != null && !employmentType.isEmpty()) { + jobPostingPredicate.and(jobPosting.employmentType.eq(employmentType)); + } + + if (minCareer != null && maxCareer != null) { + jobPostingPredicate.and(jobPosting.career.between(minCareer, maxCareer)); + } else if (minCareer != null) { + jobPostingPredicate.and(jobPosting.career.goe(minCareer)); + } else if (maxCareer != null) { + jobPostingPredicate.and(jobPosting.career.loe(maxCareer)); + } + + if (education != null) { + jobPostingPredicate.and(jobPosting.education.eq(education)); + } + + if (minSalary != null && maxSalary != null) { + jobPostingPredicate.and(jobPosting.salary.between(minSalary, maxSalary)); + } else if (minSalary != null) { + jobPostingPredicate.and(jobPosting.salary.goe(minSalary)); + } else if (maxSalary != null) { + jobPostingPredicate.and(jobPosting.salary.loe(maxSalary)); + } + + List matchingJobPostingKeys = queryFactory.selectDistinct(jobPosting.jobPostingKey) + .from(jobPosting) + .leftJoin(jobPostingTechStack) + .on(jobPosting.jobPostingKey.eq(jobPostingTechStack.jobPostingKey)) + .where(jobPostingPredicate.and(techStackPredicate)) + .fetch(); + + return matchingJobPostingKeys; + } + + @Override + public List searchJobPostingsByKeyword(String keyword) { + BooleanExpression jobPostingCondition = jobPostingEntity.title.containsIgnoreCase(keyword) + .or(jobPostingEntity.jobCategory.stringValue().containsIgnoreCase(keyword)) + .or(jobPostingEntity.career.stringValue().containsIgnoreCase(keyword)) + .or(jobPostingEntity.education.stringValue().containsIgnoreCase(keyword)) + .or(jobPostingEntity.employmentType.containsIgnoreCase(keyword)) + .or(jobPostingEntity.salary.stringValue().containsIgnoreCase(keyword)) + .or(jobPostingEntity.jobPostingContent.containsIgnoreCase(keyword)); + + BooleanExpression techStackCondition = jobPostingTechStackEntity.techName.stringValue() + .containsIgnoreCase(keyword); + + BooleanExpression companyCondition = companyEntity.companyName.containsIgnoreCase(keyword); + + return queryFactory.selectDistinct(jobPostingEntity.jobPostingKey) + .from(jobPostingEntity) + .leftJoin(jobPostingTechStackEntity) + .on(jobPostingEntity.jobPostingKey.eq(jobPostingTechStackEntity.jobPostingKey)) + .leftJoin(companyEntity).on(jobPostingEntity.companyKey.eq(companyEntity.companyKey)) + .where(jobPostingCondition.or(techStackCondition).or(companyCondition)) + .fetch(); + } +} diff --git a/src/main/java/com/ctrls/auto_enter_view/security/SecurityConfig.java b/src/main/java/com/ctrls/auto_enter_view/security/SecurityConfig.java index 89c6e5e4..44767724 100644 --- a/src/main/java/com/ctrls/auto_enter_view/security/SecurityConfig.java +++ b/src/main/java/com/ctrls/auto_enter_view/security/SecurityConfig.java @@ -53,6 +53,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .authorizeHttpRequests(authHttpRequest -> authHttpRequest // 권한 없이 접근 가능 + .requestMatchers("/job-postings/search", "/job-postings/filter").permitAll() .requestMatchers("/api-test/**").permitAll() .requestMatchers("/companies/signup", "/candidates/signup").permitAll() .requestMatchers("/candidates/find-email").permitAll() diff --git a/src/main/java/com/ctrls/auto_enter_view/service/SearchService.java b/src/main/java/com/ctrls/auto_enter_view/service/SearchService.java new file mode 100644 index 00000000..cf03b329 --- /dev/null +++ b/src/main/java/com/ctrls/auto_enter_view/service/SearchService.java @@ -0,0 +1,34 @@ +package com.ctrls.auto_enter_view.service; + +import com.ctrls.auto_enter_view.enums.Education; +import com.ctrls.auto_enter_view.enums.JobCategory; +import com.ctrls.auto_enter_view.enums.TechStack; +import com.ctrls.auto_enter_view.repository.JobPostingRepositoryCustom; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class SearchService { + + private final JobPostingRepositoryCustom jobPostingRepositoryCustom; + + public List searchJobPostings( + JobCategory jobCategory, + List techStacks, + String employmentType, + Integer minCareer, + Integer maxCareer, + Education education, + Long minSalary, + Long maxSalary) { + + return jobPostingRepositoryCustom.searchJobPostings(jobCategory, techStacks, employmentType, + minCareer, maxCareer, education, minSalary, maxSalary); + } + + public List searchJobPostingsByKeyword(String keyword) { + return jobPostingRepositoryCustom.searchJobPostingsByKeyword(keyword); + } +}