diff --git a/src/main/java/goorm_3team/company/controllers/AdminController.java b/src/main/java/goorm_3team/company/controllers/AdminController.java new file mode 100644 index 0000000..59e9bd3 --- /dev/null +++ b/src/main/java/goorm_3team/company/controllers/AdminController.java @@ -0,0 +1,39 @@ +package goorm_3team.company.controllers; + +import goorm_3team.company.dto.CompanyRequestDto; +import goorm_3team.company.dto.JobDescriptionRequestDto; +import goorm_3team.company.services.AdminService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +// 관리자용 API 컨트롤러 +@RestController +@RequestMapping("/api/admin") +@RequiredArgsConstructor +public class AdminController { + + // AdminService 주입됨 (생성자 통해 자동 주입됨) + private final AdminService adminService; + + // 회사 등록 요청 처리 + @PostMapping("/register/company") + public ResponseEntity registerCompany(@RequestBody CompanyRequestDto req) { + // 서비스 레이어에 등록 요청 전달 + adminService.registerCompany(req); + // 응답은 상태 코드 200 OK만 반환함 + return ResponseEntity.ok().build(); + } + + // 채용 공고 등록 요청 처리 + @PostMapping("/register/job-description") + public ResponseEntity registerJobDescription(@RequestBody JobDescriptionRequestDto req) { + // 서비스에 JD 등록 요청 전달 + adminService.registerJobDescription(req); + // 성공 시 OK 반환 + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/goorm_3team/company/dto/CompanyRequestDto.java b/src/main/java/goorm_3team/company/dto/CompanyRequestDto.java new file mode 100644 index 0000000..e6cbb4c --- /dev/null +++ b/src/main/java/goorm_3team/company/dto/CompanyRequestDto.java @@ -0,0 +1,22 @@ +package goorm_3team.company.dto; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +// 회사 등록 요청 시 사용하는 데이터 전달 객체 (DTO) +// 클라이언트 → 서버로 전달되는 데이터를 담는 용도임 +@Data // Lombok 어노테이션: 모든 필드에 대해 Getter, Setter, toString 등을 자동 생성함 +@Getter // 명시적으로도 추가돼 있음 (Data 어노테이션에 포함되어 있으므로 중복임) +@Setter +public class CompanyRequestDto { + + // 회사 이름 (예: 카카오, 네이버 등) + private String name; + + // 회사 주소 (예: 서울특별시 강남구 ...) + private String address; + + // 회사 유형 (예: 대기업, 스타트업, 중견기업 등) + private String companyType; +} diff --git a/src/main/java/goorm_3team/company/dto/JobDescriptionRequestDto.java b/src/main/java/goorm_3team/company/dto/JobDescriptionRequestDto.java new file mode 100644 index 0000000..9a02b7e --- /dev/null +++ b/src/main/java/goorm_3team/company/dto/JobDescriptionRequestDto.java @@ -0,0 +1,29 @@ +package goorm_3team.company.dto; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +// 채용공고 등록 시 사용하는 요청 DTO +// 클라이언트가 입력한 채용 정보가 이 객체에 담겨 서버로 전달됨 +@Data // Lombok 어노테이션: Getter, Setter, toString 등을 자동 생성함 +@Getter // 중복 선언되어 있으나, 실사용에 큰 문제는 없음 +@Setter +public class JobDescriptionRequestDto { + + // 모집 직무명 (예: 백엔드 개발자, 디자이너 등) + private String position; + + + + // 필요 경력 기간 (예: 0년, 1년, 3년 등) + private int requiredCareerPeriod; + + // 연봉 (단위: 만 원) + private int salary; + + // 스킬 + private String skills; + + private Long companyId; +} 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/models/JobDescription.java b/src/main/java/goorm_3team/company/models/JobDescription.java new file mode 100644 index 0000000..79b63df --- /dev/null +++ b/src/main/java/goorm_3team/company/models/JobDescription.java @@ -0,0 +1,52 @@ +package goorm_3team.company.models; + +import goorm_3team.company.dto.JobDescriptionRequestDto; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +// 채용공고 정보를 담는 JPA 엔티티 +// 하나의 회사(Company)에 여러 개의 JD가 연결될 수 있음 +@Entity //필수 +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class JobDescription { + + @Id // 기본 키 + @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동 증가 ID + private Long id; + + // 직무명 (예: 백엔드 개발자, 마케팅 매니저 등) + private String position; + + // 직무 상세 설명 + @Column(length = 500) // 최대 500자 제한 + private String description; + + // 필요 경력 기간 (단위: 년) + private int requiredCareerPeriod; + + // 연봉 (단위: 만 원) + private int salary; + + // 스킬 + private String skills; + + // 어떤 회사의 JD인지 나타내는 외래 키 관계 + @ManyToOne + @JoinColumn(name = "company_id") // FK 컬럼명 설정 + private Company company; + + // 요청 DTO와 연결된 회사 엔티티를 받아서 JD 객체를 생성함 + public JobDescription(JobDescriptionRequestDto req, Company company) { + setPosition(req.getPosition()); + setRequiredCareerPeriod(req.getRequiredCareerPeriod()); + setSalary(req.getSalary()); + setSkills(req.getSkills()); + setCompany(company); + } +} 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/repositories/JobDescriptionRepository.java b/src/main/java/goorm_3team/company/repositories/JobDescriptionRepository.java new file mode 100644 index 0000000..3ecf1e1 --- /dev/null +++ b/src/main/java/goorm_3team/company/repositories/JobDescriptionRepository.java @@ -0,0 +1,26 @@ +package goorm_3team.company.repositories; + +import goorm_3team.company.models.JobDescription; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +// 채용공고 엔티티(JobDescription)에 대한 DB 접근 인터페이스 +public interface JobDescriptionRepository extends JpaRepository { + + // 특정 회사 ID에 해당하는 모든 채용공고(JD) 리스트 조회 + List findByCompanyId(Long companyId); + + // 회사 유형과 경력 조건으로 JD를 필터링해서 조회하는 커스텀 쿼리 + @Query("SELECT j FROM JobDescription j " + + "JOIN j.company c " + // JD와 연결된 회사 정보도 함께 조회함 + "WHERE (:companyType IS NULL OR c.companyType = :companyType) " + // 회사 유형 필터 (null이면 조건 생략) + "AND (:career IS NULL OR j.requiredCareerPeriod <= :career)" // 경력 조건 필터 (null이면 조건 생략) + ) + List searchJobsByFilters( + @Param("companyType") String companyType, // 대기업, 스타트업 등 + @Param("career") Integer career // 최대 경력 요구 조건 + ); +} diff --git a/src/main/java/goorm_3team/company/services/AdminService.java b/src/main/java/goorm_3team/company/services/AdminService.java new file mode 100644 index 0000000..eed055f --- /dev/null +++ b/src/main/java/goorm_3team/company/services/AdminService.java @@ -0,0 +1,41 @@ +package goorm_3team.company.services; + +import goorm_3team.company.dto.CompanyRequestDto; +import goorm_3team.company.dto.JobDescriptionRequestDto; +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.stereotype.Service; + +// 관리자 기능을 담당하는 서비스 클래스 +// 회사 등록, 채용공고 등록 기능을 포함함 +@Service +@RequiredArgsConstructor // 생성자 주입 자동 생성 +public class AdminService { + + private final CompanyRepository companyRepository; + private final JobDescriptionRepository jobDescriptionRepository; + + // 회사 등록 처리 + public void registerCompany(CompanyRequestDto req) { + // 요청 DTO를 Company 엔티티로 변환 + Company company = new Company(req); + // DB에 저장 + companyRepository.save(company); + } + + // 채용공고 등록 처리 + public void registerJobDescription(JobDescriptionRequestDto req) { + // DTO에 포함된 companyId로 실제 회사 조회 + Company company = companyRepository.findById(req.getCompanyId()) + .orElseThrow(() -> new RuntimeException("Can't find company with ID : " + req.getCompanyId())); + + // 요청 DTO와 회사 정보를 바탕으로 JD 생성 + JobDescription jobDescription = new JobDescription(req, company); + + // DB에 저장 + jobDescriptionRepository.save(jobDescription); + } +}