Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions src/main/java/goorm_3team/company/controllers/UserController.java
Original file line number Diff line number Diff line change
@@ -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<DataResponse> 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<DataResponse> 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<CompanyDetailResponseDto> getCompany(@PathVariable Long id) {
// 회사 ID 기준으로 JD 리스트 반환함
return ResponseEntity.ok(userService.searchJobDescriptionByCompany(id));
}

// 필터 조건(기업유형, 경력)에 따른 채용공고 검색
@GetMapping("/jobs/filter")
public ResponseEntity<List<JobDescriptionSimpleDto>> searchJobs(
@RequestParam(required = false, defaultValue = "") String companyType,
@RequestParam(required = false, defaultValue = "0") Integer career) {
// 필터 기준에 맞는 JD 리스트 반환함
return ResponseEntity.ok(userService.searchJobDescriptionByFilter(companyType, career));
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
13 changes: 13 additions & 0 deletions src/main/java/goorm_3team/company/dto/DataResponse.java
Original file line number Diff line number Diff line change
@@ -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;
}
54 changes: 54 additions & 0 deletions src/main/java/goorm_3team/company/models/Company.java
Original file line number Diff line number Diff line change
@@ -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<JobDescription> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Company, Long> {

// 회사 유형(companyType)에 따라 회사 목록을 조회함
// 예: "대기업", "스타트업" 등으로 필터링할 때 사용함
List<Company> findByCompanyType(String companyType);
}
76 changes: 76 additions & 0 deletions src/main/java/goorm_3team/company/services/UserService.java
Original file line number Diff line number Diff line change
@@ -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<Company> companies; // 변수 선언
if (isAll) {
// 전체 회사 리스트 반환
companies = companyRepository.findAll(pageable);
} else {
// 최신 회사 4개만 조회 (ID 기준 내림차순 정렬)
companies = companyRepository.findAll(PageRequest.of(0, 4, Sort.Direction.DESC, "id"));
}
List<CompanySimpleResponseDto> companyDtos = companies.stream().map(company -> CompanySimpleResponseDto.toDto(company)).collect(Collectors.toList());
//여기서는 각 Company 객체를 → CompanySimpleResponseDto로 바꿈
return new DataResponse(companies.hasNext(), companyDtos);
}

// 회사 유형(companyType)으로 회사 검색
//대기업이나 스타트업 회사 유형에ㄷ 따라서 검색!
public List<Company> searchCompany(String companyType) {
// 빈 문자열로 들어오면 null 처리

if (companyType.equals("")) {
companyType = null;
}
return companyRepository.findByCompanyType(companyType);
}

// 특정 회사 하나를 기준으로 회사의 모든 채용공고를 함께 조회한다.
public CompanyDetailResponseDto searchJobDescriptionByCompany(Long companyId) {
// List<JobDescription> 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<JobDescriptionSimpleDto> searchJobDescriptionByFilter(String companyType, Integer career) {
List<JobDescription> jds = jobDescriptionRepository.searchJobsByFilters(companyType, career);
return jds.stream().map(jobDescription -> JobDescriptionSimpleDto.toDto(jobDescription)).collect(Collectors.toList());
}
}
Loading