From fd954e5079acd325d38422f455096f5a265bd67d Mon Sep 17 00:00:00 2001 From: chanmin9929 Date: Sun, 11 May 2025 22:56:21 +0900 Subject: [PATCH] =?UTF-8?q?=ED=9A=8C=EC=82=AC=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4/4=EA=B0=9C=EB=A7=8C=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A7=80=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/controllers/UserController.java | 58 ++++++++++++++ .../company/dto/CompanySimpleResponseDto.java | 22 ++++++ .../goorm_3team/company/dto/DataResponse.java | 13 ++++ .../goorm_3team/company/models/Company.java | 54 +++++++++++++ .../repositories/CompanyRepository.java | 15 ++++ .../company/services/UserService.java | 76 +++++++++++++++++++ 6 files changed, 238 insertions(+) create mode 100644 src/main/java/goorm_3team/company/controllers/UserController.java create mode 100644 src/main/java/goorm_3team/company/dto/CompanySimpleResponseDto.java create mode 100644 src/main/java/goorm_3team/company/dto/DataResponse.java create mode 100644 src/main/java/goorm_3team/company/models/Company.java create mode 100644 src/main/java/goorm_3team/company/repositories/CompanyRepository.java create mode 100644 src/main/java/goorm_3team/company/services/UserService.java diff --git a/src/main/java/goorm_3team/company/controllers/UserController.java b/src/main/java/goorm_3team/company/controllers/UserController.java new file mode 100644 index 0000000..6ebfeec --- /dev/null +++ b/src/main/java/goorm_3team/company/controllers/UserController.java @@ -0,0 +1,58 @@ +package goorm_3team.company.controllers; + +import goorm_3team.company.dto.CompanyDetailResponseDto; +import goorm_3team.company.dto.CompanySimpleResponseDto; +import goorm_3team.company.dto.DataResponse; +import goorm_3team.company.dto.JobDescriptionSimpleDto; +import goorm_3team.company.models.Company; +import goorm_3team.company.models.JobDescription; +import goorm_3team.company.services.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.util.List; + + +// 사용자용 API 컨트롤러 +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/user") +public class UserController { + + // UserService 주입됨 + private final UserService userService; + + // 모든 회사 리스트 조회 + @GetMapping("/companies/all") + public ResponseEntity getCompanies(@PageableDefault(sort = "id", direction = Sort.Direction.DESC, size = 10) Pageable pageable) { + //내림차순 + // true 전달 → 전체 회사 리스트 조회함 + return ResponseEntity.ok(userService.findCompanies(true, pageable)); + } + + // 최신 회사 4개만 조회 + @GetMapping("/companies/latest") + public ResponseEntity getLastestCompanies(@PageableDefault(sort = "id", direction = Sort.Direction.DESC, size = 4) Pageable pageable) { + // false 전달 → 최신 회사 4개만 조회함 + return ResponseEntity.ok(userService.findCompanies(false, pageable)); + } + + // 특정 회사의 채용공고 리스트 조회 + @GetMapping("/jobs/company/{id}") + public ResponseEntity getCompany(@PathVariable Long id) { + // 회사 ID 기준으로 JD 리스트 반환함 + return ResponseEntity.ok(userService.searchJobDescriptionByCompany(id)); + } + + // 필터 조건(기업유형, 경력)에 따른 채용공고 검색 + @GetMapping("/jobs/filter") + public ResponseEntity> searchJobs( + @RequestParam(required = false, defaultValue = "") String companyType, + @RequestParam(required = false, defaultValue = "0") Integer career) { + // 필터 기준에 맞는 JD 리스트 반환함 + return ResponseEntity.ok(userService.searchJobDescriptionByFilter(companyType, career)); + } +} diff --git a/src/main/java/goorm_3team/company/dto/CompanySimpleResponseDto.java b/src/main/java/goorm_3team/company/dto/CompanySimpleResponseDto.java new file mode 100644 index 0000000..79ec6b2 --- /dev/null +++ b/src/main/java/goorm_3team/company/dto/CompanySimpleResponseDto.java @@ -0,0 +1,22 @@ +package goorm_3team.company.dto; + +import goorm_3team.company.models.Company; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class CompanySimpleResponseDto { + private Long id; + private String name; + private String companyType; + private String address; + + public static CompanySimpleResponseDto toDto(Company company) { + Long id = company.getId(); + String name = company.getName(); + String companyType = company.getCompanyType(); + String address = company.getAddress(); + return new CompanySimpleResponseDto(id, name, companyType, address); + } +} diff --git a/src/main/java/goorm_3team/company/dto/DataResponse.java b/src/main/java/goorm_3team/company/dto/DataResponse.java new file mode 100644 index 0000000..17c3e27 --- /dev/null +++ b/src/main/java/goorm_3team/company/dto/DataResponse.java @@ -0,0 +1,13 @@ +package goorm_3team.company.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +@Data +@AllArgsConstructor +public class DataResponse { + private boolean hasNext; + private List list; +} diff --git a/src/main/java/goorm_3team/company/models/Company.java b/src/main/java/goorm_3team/company/models/Company.java new file mode 100644 index 0000000..db661fe --- /dev/null +++ b/src/main/java/goorm_3team/company/models/Company.java @@ -0,0 +1,54 @@ +package goorm_3team.company.models; + +import goorm_3team.company.dto.CompanyRequestDto; +import goorm_3team.company.dto.JobDescriptionRequestDto; +import java.util.List; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.FetchType; +import jakarta.persistence.OneToMany; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +// 회사 정보를 나타내는 JPA 엔티티 클래스 +// DB의 company 테이블과 매핑됨 +@Entity +@Setter +@Getter +@NoArgsConstructor // 기본 생성자 필요 (JPA에서 필수로 사용함) +public class Company { + + @Id // 기본 키 지정 + @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동 증가 값 사용 (MySQL 기준) + private Long id; + + // 회사명 (예: 삼성전자) + private String name; + + // 주소 (예: 서울 강남구 ...) + private String address; + + // 회사 유형 (예: 대기업, 스타트업 등) + private String companyType; + + @OneToMany(mappedBy = "company", targetEntity = JobDescription.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List jobDescriptions; + + // DTO를 받아서 Company 객체로 변환하는 생성자 + public Company(CompanyRequestDto req) { + setName(req.getName()); + setAddress(req.getAddress()); + setCompanyType(req.getCompanyType()); + } + + public Company(String name, String address, String companyType) { + this.name = name; + this.address = address; + this.companyType = companyType; + } +} diff --git a/src/main/java/goorm_3team/company/repositories/CompanyRepository.java b/src/main/java/goorm_3team/company/repositories/CompanyRepository.java new file mode 100644 index 0000000..812b7de --- /dev/null +++ b/src/main/java/goorm_3team/company/repositories/CompanyRepository.java @@ -0,0 +1,15 @@ +package goorm_3team.company.repositories; + +import goorm_3team.company.models.Company; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +// 회사 엔티티(Company)에 대한 DB 접근 인터페이스 +// JpaRepository를 상속받으면 기본적인 CRUD 메서드가 자동으로 생성됨 +public interface CompanyRepository extends JpaRepository { + + // 회사 유형(companyType)에 따라 회사 목록을 조회함 + // 예: "대기업", "스타트업" 등으로 필터링할 때 사용함 + List findByCompanyType(String companyType); +} diff --git a/src/main/java/goorm_3team/company/services/UserService.java b/src/main/java/goorm_3team/company/services/UserService.java new file mode 100644 index 0000000..31badfa --- /dev/null +++ b/src/main/java/goorm_3team/company/services/UserService.java @@ -0,0 +1,76 @@ +package goorm_3team.company.services; + +import goorm_3team.company.dto.CompanyDetailResponseDto; +import goorm_3team.company.dto.CompanySimpleResponseDto; +import goorm_3team.company.dto.DataResponse; +import goorm_3team.company.dto.JobDescriptionSimpleDto; +import goorm_3team.company.models.Company; +import goorm_3team.company.models.JobDescription; +import goorm_3team.company.repositories.CompanyRepository; +import goorm_3team.company.repositories.JobDescriptionRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; + +import java.util.List; +import java.util.stream.Collectors; + +// 사용자 요청을 처리하는 서비스 클래스 +// 회사 목록 조회, JD 검색 등의 기능을 제공함 +@Service +@RequiredArgsConstructor +public class UserService { + + private final CompanyRepository companyRepository; + private final JobDescriptionRepository jobDescriptionRepository; + + // 회사 목록 조회 + // isAll이 true면 전체, false면 최신 4개만 반환함 + public DataResponse findCompanies(boolean isAll, Pageable pageable) { + Page companies; // 변수 선언 + if (isAll) { + // 전체 회사 리스트 반환 + companies = companyRepository.findAll(pageable); + } else { + // 최신 회사 4개만 조회 (ID 기준 내림차순 정렬) + companies = companyRepository.findAll(PageRequest.of(0, 4, Sort.Direction.DESC, "id")); + } + List companyDtos = companies.stream().map(company -> CompanySimpleResponseDto.toDto(company)).collect(Collectors.toList()); + //여기서는 각 Company 객체를 → CompanySimpleResponseDto로 바꿈 + return new DataResponse(companies.hasNext(), companyDtos); + } + + // 회사 유형(companyType)으로 회사 검색 + //대기업이나 스타트업 회사 유형에ㄷ 따라서 검색! + public List searchCompany(String companyType) { + // 빈 문자열로 들어오면 null 처리 + + if (companyType.equals("")) { + companyType = null; + } + return companyRepository.findByCompanyType(companyType); + } + + // 특정 회사 하나를 기준으로 회사의 모든 채용공고를 함께 조회한다. + public CompanyDetailResponseDto searchJobDescriptionByCompany(Long companyId) { +// List jdList = jobDescriptionRepository.findByCompanyId(companyId); +// return jdList.stream().map(jobDescription -> JobDescriptionSimpleDto.toDto(jobDescription)).collect(Collectors.toList()); + Company company = companyRepository.findById(companyId) + .orElseThrow(() -> new IllegalArgumentException("해당 ID의 회사가 존재하지 않습니다.")); + return CompanyDetailResponseDto.toDto(company); + } + + + + + + + // 회사 유형과 경력 조건으로 JD 리스트 필터링 + public List searchJobDescriptionByFilter(String companyType, Integer career) { + List jds = jobDescriptionRepository.searchJobsByFilters(companyType, career); + return jds.stream().map(jobDescription -> JobDescriptionSimpleDto.toDto(jobDescription)).collect(Collectors.toList()); + } +}