/wanted-pre-onboarding-backend

원티드 프리온보딩 백엔드 과제 👨‍💻

Primary LanguageJava

원티드 프리온보딩 백엔드 인턴십 과제

요구사항 및 과정 정리

0. 회사 등록

회사에 대한 데이터를 저장

{
  "name" : "네이버",
  "nation" : "한국",
  "location" : "판교"
}

구현 과정 및 고려사항

회사가 있어야 채용 공고를 등록할 수 있기 때문에 회사(Company) 등록 기능 우선적으로 구현

0-1. 회사가 있어야 데이터를 등록할 수 있다.

  • 회사에 대한 Entity 설계 + 저장 기능 구현

0-2. 필드가 비어있으면 안 된다.

  • 필드 값이 비어있을 경우 데이터가 저장될 수 없는 테스트 구현
  • 필드 값이 비어있지 않을 경우 데이터가 저장되는 테스트 구현

1. 채용공고 등록

채용공고에 대한 데이터 저장

{
  "companyId" : 1,
  "position" : "백엔드 주니어 개발자",
  "compensation" : 1000000,
  "content" : "원티드랩에서 백엔드 주니어 개발자를 채용합니다. 자격요건은..",
  "techStack" : "Python"
}

구현 과정 및 고려사항

companyId에 맞는 회사를 찾아 채용 공고를 등록

1-1. 채용공고를 저장하기 전, 회사가 있는지 조회해야 한다.

R : Recruit
C : Company

  • Service(R) to Service(C)의 형태가 아닌 Service(R) to Repository(C)를 의존하도록 설정
    • 타 도메인의 저장소를 의존하고 있기 때문에 외부에서 접근하지 못하도록 private로 지정
    • 기존 Repository를 의존 받던 형태에서 파사드 패턴으로 리팩터링 진행

1-2. 필드가 비어있으면 안 된다.

  • 필드 값이 비어있을 경우 데이터가 저장될 수 없는 테스트 구현
  • 필드 값이 비어있지 않을 경우 데이터가 저장되는 테스트 구현

1-3. 회사와 채용공고의 연관관계가 매핑되어야 한다.

  • 1번 회사에서 저장한 공고는 1번 회사의 recruitList에 저장되어야 함
  • 채용공고(Recruit)에 FK로 회사(Company)의 PK를 등록

2. 채용공고 수정

회사가 특정 번호의 채용공고 수정

  • 회사 id 이외 모두 수정 가능
{
  "position" : "백엔드 주니어 개발자",
  "compensation" : 1500000,
  "content" : "원티드랩에서 백엔드 주니어 개발자를 '적극' 채용합니다. 자격요건은..", # 변경됨
  "techStack" : "Python"
}

구현 과정 및 고려사항

로그인에 대한 절차는 생략하기 때문에 특정 공고에 대한 수정 요청은 누구든 할 수 있음 또한, 수정할 때에도 데이터가 비어있으면 수정되지 않도록 해야함

2-1. 채용 공고가 있어야 수정할 수 있다.

  • 만약 채용 공고가 없을 경우 NotFoundException을 던짐
  • 채용 공고의 id가 존재하지 않을 경우에 대한 테스트 구현

2-2. 필드가 비어있으면 안 된다.

  • 필드 값이 비어있을 경우 데이터가 저장될 수 없는 테스트 구현
  • 필드 값이 비어있지 않을 경우 데이터가 저장되는 테스트 구현

3. 채용공고 삭제

DB에서 데이터 삭제

구현 과정 및 고려사항

Logical(Soft) Delete가 아닌 Hard Delete 방식으로 구현

3-1. 존재하는 채용 공고만 삭제할 수 있다.

  • 만약 채용 공고가 없을 경우 NotFoundException을 던짐
  • 채용 공고의 id가 존재하지 않을 경우에 대한 테스트 구현

4. 채용공고 조회 및 검색 기능

전체 체용공고 조회

[
    {
      "채용공고_id" : 채용공고_id,
      "회사명" : "원티드랩",
      "국가" : "한국",
      "지역" : "서울",
      "position" : "백엔드 주니어 개발자",
      "compensation" : 1500000,
      "techStack" : "Python"
    },
    {
      "채용공고_id" : 채용공고_id,
      "회사명" : "네이버",
      "국가" : "한국",
      "지역" : "판교",
      "position" : "Django 백엔드 개발자",
      "compensation" : 1000000,
      "techStack" : "Django"
    },
  ...
]

구현 과정 및 고려사항

4-1-1. 저장된 채용 공고를 모두 출력해야 한다.

[
  {
    "id":1,
    "name":"원티드랩",
    "nation":"한국",
    "location":"판교",
    "position":"백엔드 주니어 개발자",
    "compensation":1000000,
    "content":"원티드랩에서 백엔드 주니어 개발자를 채용합니다. 자격요건은..",
    "techStack":"Python"
  },
  {
    "id":2,
    "name":"네이버",
    "nation":"한국",
    "location":"정자",
    "position":"백엔드 시니어 개발자",
    "compensation":1000000,
    "content":"네이버에서 백엔드 개발자를 '적극' 채용합니다. 자격요건은..",
    "techStack":"Java"
  }
]

4-2-1. 키워드가 존재하면 검색한 결과를 반환한다.

[
  {
    "id":2,
    "name":"네이버",
    "nation":"한국",
    "location":"정자",
    "position":"백엔드 시니어 개발자",
    "compensation":1000000,
    "content":"네이버에서 백엔드 개발자를 '적극' 채용합니다. 자격요건은..",
    "techStack":"Java"
  }
]

5. 채용 상세 페이지 조회

채용 공고 상세 조회

{
  "채용공고_id" : "채용공고_id",
  "회사명" : "원티드랩",
  "국가" : "한국",
  "지역" : "서울",
  "position" : "백엔드 주니어 개발자",
  "compensation" : 1500000,
  "techStack" : "Python",
  "content" :  "원티드랩에서 백엔드 주니어 개발자를 채용합니다. 자격요건은..",
  "회사가올린다른채용공고" : [채용공고_id, 채용공고_id, ..] # id List **(선택사항 및 가산점요소).**
}

구현 과정 및 고려사항

5-1. 존재하지 않는 채용 공고는 조회할 수 없다.

  • 만약 채용 공고가 없을 경우 NotFoundException을 던짐
  • 채용 공고의 id가 존재하지 않을 경우에 대한 테스트 구현

5-2. 해당 회사가 올린 다른 채용공고를 추가적으로 포함한다. (선택 사항)

  • 조회될 시점을 기준으로 해당 회사의 다른 공고들을 추가로 포함
{
  "id":4,
  "name":"네이버",
  "nation":"한국",
  "location":"분당",
  "position":"백엔드 주니어 개발자",
  "compensation":1000000,
  "content":"네이버에서 백엔드 주니어 개발자를 채용합니다. 자격요건은..",
  "techStack":"Python",
  "otherList":[1,2,3]
}

6. 사용자가 채용공고에 지원(선택사항 및 가산점요소)

채용 공고 지원

  • 사용자는 1회만 지원 가능합니다.
Example)
{
  "채용공고_id" :  채용공고_id,
  "사용자_id" :  사용자_id
}

구현 과정 및 고려사항

6-1. 사용자를 등록한다.

  • 아이디(username), 비밀번호(password)를 입력하지 않은 경우에 대한 테스트 구현
  • 회원가입 성공에 대한 테스트 구현
  • 단, 비밀번호 암호화는 진행하지 않음

6-2. 채용 공고 지원 내역을 저장한다.

  • 존재하지 않는 채용 공고에 대한 테스트 구현
    • 만약 채용 공고가 없을 경우 NotFoundException을 던짐
  • 잘못된 값이 들어갈 경우에 대한 테스트 구현