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
39 changes: 39 additions & 0 deletions src/main/java/goorm_3team/company/controllers/AdminController.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
22 changes: 22 additions & 0 deletions src/main/java/goorm_3team/company/dto/CompanyRequestDto.java
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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;
}
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;
}
}
52 changes: 52 additions & 0 deletions src/main/java/goorm_3team/company/models/JobDescription.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
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);
}
Original file line number Diff line number Diff line change
@@ -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<JobDescription, Long> {

// 특정 회사 ID에 해당하는 모든 채용공고(JD) 리스트 조회
List<JobDescription> 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<JobDescription> searchJobsByFilters(
@Param("companyType") String companyType, // 대기업, 스타트업 등
@Param("career") Integer career // 최대 경력 요구 조건
);
}
41 changes: 41 additions & 0 deletions src/main/java/goorm_3team/company/services/AdminService.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Loading