Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
eef183a
docs:(README.md): 구현해야할 기능 목록 작성
devFancy Nov 27, 2022
1edfe7e
feat : 패키치 구조 생성 및 기능의 종료를 출력하는 기능 구현
devFancy Nov 27, 2022
7197b4e
feat(MainController): 기능 선택하는 입력 기능 구현
devFancy Nov 27, 2022
45de4b2
feat(Application): Main에서 기능 선택하는 입력 기능 구현
devFancy Nov 27, 2022
b45c25c
docs : 현재 시점 기능 구현 완료 업데이트
devFancy Nov 27, 2022
6b6526f
feat(Outputview): 과정과 미션에 대한 내용을 출력
devFancy Nov 27, 2022
1d1718e
refactor: 1.기능 선택 구현 수정
devFancy Nov 27, 2022
eff21d8
feat(InputView): 과정, 레벨, 미션을 입력받는 기능 구현
devFancy Nov 27, 2022
415c758
feat : 과정, 레벨, 미션 정보에 관한 내용 추가
devFancy Nov 27, 2022
68084a1
feat: 2.페어 매칭 기능 구현
devFancy Nov 27, 2022
a10d723
refactor: 2.페어 매칭 기능 관련 패키지 위치 수정
devFancy Nov 27, 2022
54bb8b0
test: 기능 선택 예외 처리 구현
devFancy Nov 27, 2022
69ecc76
refactor: 1.기능 선택 구현 수정
devFancy Nov 27, 2022
fc47df1
refactor: 과정, 레벨, 미션에 대한 정보 출력하는 내용 수정
devFancy Nov 27, 2022
2018404
docs: 현재 시점 기능 목록 업데이트
devFancy Nov 27, 2022
3c1a578
refactor: 함수명 이름 수정
devFancy Nov 27, 2022
df9a849
feat: 매칭할 매칭하고자 하는 과정, 레벨, 미션을 입력 받는 기능 구현
devFancy Nov 27, 2022
77b8c7b
refactor: 함수명 이름 수정
devFancy Nov 27, 2022
d5e85b8
fix : 존재하지 않는 미션 입력에 대한 예외 처리 오류 수정
devFancy Nov 27, 2022
4d5043d
feat(Mission) : 개인별 미션에 enum 추가
devFancy Nov 27, 2022
b4cb139
refactor(Missions): 타입 String에서 Mission으로 변경
devFancy Nov 27, 2022
144e886
rafactor: enum 변수명 이름 정정
devFancy Nov 27, 2022
8160183
refactor: 매칭 기능 입력에 대한 비즈니스 로직 Service 클래스 추가 및 이동
devFancy Nov 27, 2022
41edff0
feat(Crew): 크루 정보를 받아오는 클래스 생성
devFancy Nov 27, 2022
840509f
feat: 백엔드,프론트 크루 정보 읽어서 저장하는 기능 구현
devFancy Nov 27, 2022
62484b4
feat: 페어를 매칭하는 기능 구현
devFancy Nov 27, 2022
96b2d65
feat: 페어 매칭 결과 출력하는 기능 구현
devFancy Nov 27, 2022
14ba633
fix : 매칭 결과 출력하는 내용 수정
devFancy Nov 27, 2022
e9f1fb0
style : 모든 클래스 정렬
devFancy Nov 27, 2022
793e252
docs: 현재 시점기준 에러 처리 기능 목록 업데이트
devFancy Nov 27, 2022
4f74f67
feat: 3.페어 조회 기능 구현
devFancy Nov 27, 2022
8434355
fix: 다시 매칭하고 저장시 수정이 아닌 새로운 객체로 저장으로 기능 수정
devFancy Nov 27, 2022
c8ad1fa
refactor: 불필요한 메서드 제거
devFancy Nov 27, 2022
383b3aa
feat: 3.페어 조회 기능 구현 추가
devFancy Nov 27, 2022
4ee2807
docs: 현재 시점 기능 목록 업데이트
devFancy Nov 27, 2022
f322fe0
feat: 4.페어 초기화 기능 구현
devFancy Nov 27, 2022
58d5974
style: 불필요한 Import 삭제
devFancy Nov 27, 2022
15f6d86
docs: 기능 목록 업데이트
devFancy Dec 4, 2022
4aa1e3a
style: 이름 수정
devFancy Dec 4, 2022
f92b68f
style: 이름 수정
devFancy Dec 4, 2022
ff179ad
style: 불필요한 클래스, import 삭제
devFancy Dec 4, 2022
c95ca55
docs: 추가 설명 업데이트
devFancy Dec 4, 2022
10af2aa
docs: 기능 목록 업데이트(최종)
devFancy Dec 9, 2022
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
90 changes: 90 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# 🚀미션 - 페어매칭관리 애플리케이션

## 진행방식

- 미션은 기능 요구 사항, 프로그래밍 요구 사항, 과제 요구 사항 세가지로 구성되어 있다.
- 세 개의 요구 사항을 만족하기 위해 노력한다.

---

### 💙구현 목표

- 과정과 미션에 해당하는 페어 프로그래밍을 구현한다.

### 📜구현 동작

1. 보기 중에서 원하는 기능을 선택한다.(숫자로 입력)
2. 과정, 레벨, 미션을 출력한다.
3. 과정, 레벨, 미션을 입력한다.(ex. 백엔드, 레벨1, 자동차경주)
4. 페어 매칭 결과를 출력한다.
5. Q(종료)를 입력하면 미션이 종료된다.

---

## 🔍구현 로직

- ### Main diagram

- [x] Application - 시작
- [x] controller - View 와 Service 에 위치한 메서드를 호출하여 최종적인 단일 기능의 메서드를 생성합니다.
- [x] MainController - 세 개의 컨트롤러와 연결(중앙 제어)
- [x] MatchingController - 페어 매칭
- [x] InquiryController - 페어 조회
- [x] InitializeController - 페어 초기화

- [x] domain(model) - 해당 프로그램에서 사용되는 객체 클래스 파일이 담겨있습니다.
- [x] Course - 과정(백엔드, 프론트엔드)
- [x] Crew - 크루 이름
- [x] Level - 레벨별 미션들
- [x] Mission - 각각의 미션들
- [x] Missions - 각각의 미션들을 트리맵으로 선언한뒤, 레벨별로 ArrayList 로 묶음

- [x] repository - Entity(domain 에 있는 클래스)에 의해 생성된 DB에 접근하는 메서드 들을 사용하기 위한 인터페이스입니다.
- [x] CrewRepository
- [x] MatchingService

- [x] service - Repository 와 Controller 사이에서 비즈니스 로직들이 위치하여 있습니다.
- Controller 로부터 알맞는 정보를 가공합니다. 즉, 비즈니스 로직을 수행하는 역할입니다.
- [x] InitializeService
- [x] InquiryService
- [x] MatchingService

- ### Util diagram

- [x] utils - 앞에서 말한 코드 외의 입력 값이 조건에 맞는 값인지 체크하는 로직이 담겨있습니다.
- [x] ExceptionMessage
- [x] Validate

- ### View diagram

- [x] view - 사용자 입출력을 해주는 로직이 담겨있습니다.
- [x] InputView
- [x] OutputView

---

## ✅기능 목록 checkList

- [x] 1.기능 선택
- [x] 프로그램이 시작하면 기능의 종료를 출력한다.
- [x] 기능의 종료를 출력하고, 그 중 하나를 입력 받는다.
- [x] 2.페어 매칭 기능 구현
- [x] 과정과 미션에 대한 내용을 출력한다.
- [x] 매칭하고자 하는 과정, 레벨, 미션을 입력 받는다.
- [x] 매칭이 정상적으로 수행되면 결과가 출력된다.
- [x] 3.페어 조회 기능 구현
- [x] 매칭 이력이 있으면 해당 미션의 페어 정보를 출력한다.
- [x] 매칭 이력이 없으면 매칭 이력이 없다는 에러 메세지를 출력한다.
- [x] 4.페어 초기화 기능 구현
- [x] 페어 초기화 숫자를 입력하면 페어 미션에 대한 정보가 초기화 된다.
- [x] 초기화 되었다는 내용을 출력한다.
- [x] 종료(Q)를 입력하면 게임이 종료된다.

## ✅예외 처리

- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고,
- [ERROR]로 시작하는 에러 메시지를 출력 후 해당 부분부터 다시 입력을 받는다.
- [x] 1.기능을 선택하는 숫자를 입력할 때, 1~3 이외에 다른 숫자를 입력하는 경우
- [x] Q 이외에 다른 문자를 입력하는 경우
- [x] 2.과정, 레벨, 미션에 있는 단어 이외에 다른 단어를 입력하는 경우
- [x] 3.페어 조회 기능에서 "네 | 아니오" 를 제외한 다른 단어를 입력하는 경우
7 changes: 7 additions & 0 deletions src/main/java/pairmatching/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package pairmatching;

import pairmatching.controller.MainController;

import static pairmatching.repository.CrewRepository.initCrewInfo;

public class Application {
private static final MainController mainController = new MainController();
public static void main(String[] args) {
// TODO 구현 진행
initCrewInfo();
mainController.run();
}
}
14 changes: 14 additions & 0 deletions src/main/java/pairmatching/controller/InitializeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package pairmatching.controller;

import pairmatching.service.InitializeService;

import static pairmatching.view.OutputView.printInitialize;

public class InitializeController {
public static final InitializeService initializeService = new InitializeService();

public void run() {
initializeService.matchInfo();
printInitialize();
}
}
29 changes: 29 additions & 0 deletions src/main/java/pairmatching/controller/InquiryController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package pairmatching.controller;

import pairmatching.service.InquiryService;

import static pairmatching.controller.MatchingController.missions;
import static pairmatching.view.InputView.getInquiryInfo;
import static pairmatching.view.OutputView.printMatchPair;
import static pairmatching.view.OutputView.printMissionInfo;

public class InquiryController {
private static final InquiryService inquiryService = new InquiryService();

public void run() {
boolean flag = false;
while (!flag) {
try {
printMissionInfo(missions);
printMatchInfo(getInquiryInfo());
flag = true;
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}

public void printMatchInfo(String input) {
printMatchPair(inquiryService.getMatchInfo(input));
}
}
39 changes: 39 additions & 0 deletions src/main/java/pairmatching/controller/MainController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package pairmatching.controller;

import pairmatching.utils.Validate;
import pairmatching.view.InputView;

public class MainController {
public static final Validate validate = new Validate();
public static final MatchingController matchingController = new MatchingController();
public static final InquiryController inquiryController = new InquiryController();
public static final InitializeController initializeController = new InitializeController();
public static final InputView inputView = new InputView();

public void run() {
boolean flag = false;
while (!flag) {
try {
String input = validate.checkMissionInfo(inputView.getMainSelect());
readSelect(input);
if (input.equals("Q")) {
flag = true;
}
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}

private void readSelect(String input) {
if (input.equals("1")) {
matchingController.run();
}
if (input.equals("2")) {
inquiryController.run();
}
if (input.equals("3")) {
initializeController.run();
}
}
}
64 changes: 64 additions & 0 deletions src/main/java/pairmatching/controller/MatchingController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package pairmatching.controller;

import pairmatching.domain.*;
import pairmatching.service.MatchingService;


import static pairmatching.utils.Validate.checkInfoCount;
import static pairmatching.utils.Validate.checkRematchAnswer;
import static pairmatching.view.InputView.getConfirmRematch;
import static pairmatching.view.InputView.getMatchingInfo;
import static pairmatching.view.OutputView.printMatchPair;
import static pairmatching.view.OutputView.printMissionInfo;

public class MatchingController {
public static final Missions missions = new Missions();
public static final MatchingService matchingService = new MatchingService();

public void run() {
boolean flag = false;
while (!flag) {
try {
printMissionInfo(missions);
String input = getMatchingInfo();
matchPair(input, missions);
flag = true;
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}

public void matchPair(String input, Missions missions) {
String[] infoArr = input.split(", ");
checkInfoCount(infoArr);
Course course = matchingService.checkCourse(infoArr[0]);
Level level = matchingService.checkLevel(infoArr[1]);
Mission mission = matchingService.checkMission(infoArr[1], infoArr[2], missions);

if (matchingService.checkExistPair(course,level,mission)) {
if (!getRematchAnswer()) {
return;
}
printMatchPair(matchingService.rematchAndSavePair(course, level, mission));
return;
}
printMatchPair(matchingService.firstMatch(course, level, mission));
}

public boolean getRematchAnswer() {
boolean flag = false;
while (!flag) {
try {
String input = checkRematchAnswer(getConfirmRematch());
if (input.equals("아니요")) {
return false;
}
flag = true;
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
return true;
}
}
44 changes: 44 additions & 0 deletions src/main/java/pairmatching/domain/Course.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package pairmatching.domain;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public enum Course {
BACKEND("백엔드"),
FRONTEND("프론트엔드");

private String name;

Course(String name) {
this.name = name;
}

// 추가 기능 구현
public String getName() {
return name;
}

public static List<String> getList() {
return Arrays.stream(Course.values())
.map(Course::getName)
.sequential()
.collect(Collectors.toList());
}

public static boolean isExist(String name) {
List<Course> result = Arrays.stream(Course.values())
.filter(course -> course.getName().equals(name))
.collect(Collectors.toList());
if (result.size() == 1) {
return true;
}
return false;
}

public static Course getEnumCourse(String name) {
return Arrays.stream(Course.values())
.filter((course -> course.getName().equals(name)))
.collect(Collectors.toList()).get(0);
}
}
16 changes: 16 additions & 0 deletions src/main/java/pairmatching/domain/Crew.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package pairmatching.domain;

public class Crew {
private Course course;
private String name;

public Crew(Course course, String name) {
this.course = course;
this.name = name;
}

@Override
public String toString() {
return name;
}
}
46 changes: 46 additions & 0 deletions src/main/java/pairmatching/domain/Level.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package pairmatching.domain;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public enum Level {
LEVEL1("레벨1"),
LEVEL2("레벨2"),
LEVEL3("레벨3"),
LEVEL4("레벨4"),
LEVEL5("레벨5");

private String name;

Level(String name) {
this.name = name;
}

// 추가 기능 구현
public String getName() {
return name;
}

public static List<Level> getList() {
return Arrays.stream(Level.values())
.sequential()
.collect(Collectors.toList());
}

public static Level getEnumLevel(String name) {
return Arrays.stream(Level.values())
.filter(level -> level.getName().equals(name))
.collect(Collectors.toList()).get(0);
}

public static boolean isExist(String name) {
List<Level> result = Arrays.stream(Level.values())
.filter(level -> level.getName().equals(name))
.collect(Collectors.toList());
if (result.size() == 1) {
return true;
}
return false;
}
}
Loading