Skip to content
Open
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
46 changes: 44 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,44 @@
# Test_Driven_Development
TDD Study
# 🏆 TDD 스터디 목적

- 리팩토링을 진행하면서 객체 지향적으로 코딩을 하면서 궁극적으로 좋은 코드, 확장 가능하기 쉬운 아키텍처를 설계하는 능력을 키우기 위함입니다.
- 테스트 모듈을 능숙하게 다루게 되면서 테스트 코드를 작성하는 시간이 줄고 전체적인 생산성을 증가 시킵니다.
- 테스트 코드를 작성하지 않는 환경이라도 향후 서비스가 커지고 안정적인 서비스를 유지하기 위해서는 테스트 코드를 작성 해야 합니다.
- 테스트 하기 쉬운 코드를 고민하게 되면서 중복 코드 및 기능의 모듈화를 좀 더 신경 쓰게 되고 점점 코드의 품질이 올라갑니다.

## 📋 TDD 스터디 진행 방식(1.0)

- 매주 책의 범위를 정하고 해당 목차에 맞는 요구 사항을 의논하고 해당 요구 사항에 맞는 기능을 구현합니다.
- 스터디원들은 해당 요구사항을 인지하고 TDD로 진행을 합니다.
- 기능을 구현 하였다면 pull Request를 올리고 다른 스터디원에게 리뷰를 받습니다.
- 서로 언어가 다를 수 있으니 해당 변수나 메서드들이 무슨 기능을 하는지 자세히 주석을 작성합니다.
- 스터디원은 최소 주 n회 이상 리뷰를 하도록 합니다. (상황에 따라 달라질 수 있습니다.)
- 주 1회 서로 온라인 세션을 통해서 서로 부족했던 부분이나 좋았던 부분을 공유합니다
- 스터디원은 서로 닉네임을 호칭으로 부르며 소통합니다.
- 매주 팀은 로테이션을 돌리며 바뀔 수 있습니다.

## 📢 코드 리뷰 규칙

- **LGTM** (Looks Good To Me, 나에게는 좋아 보인다)
- **NIT**: (Nitpick, 필수적으로 수정할 필요는 없다.)
- 상대를 존중 하면서 ‘제 생각은 이런데 어떻게 생각하시나요?’ 같은 제안하는 말로 해주세요~
- **불필요한 마찰**을 만들 필요는 없습니다.(애매한 성능 증가, 변경하기 애매한 변수명, if문 vs switch 문 등)
- 너무나 긴 로직, 하나의 메서드나 함수의 너무 많은 코드를 넣어 놓지 않도록 합니다.
- 세세한 주석을 작성하여 다른 스터디원이 봐도 알 수 있도록 합니다.
- 의미 없는 변수 명이나 함수 이름은 쓰지 않도록 합니다. (아무리 세세하게 주석을 작성해도 네이밍이 제대로 되어있지 않으면 의미가 없습니다.)
- 나의 **주관적인 생각**은 잠시 접어두고 어떤 의견이든 포용하는 자세로 리뷰를 나눌 수 있도록 합니다

## 📄 pull request template

```
## 요구사항
요구 사항 간단 요약

### [사용 언어]동작 과정
- 동작 과정 1
- 동작 과정 2
- 동작 과정 3

### 궁금한 점 (생략 가능)

### 느낀 점 (생략 가능)
```
5 changes: 5 additions & 0 deletions src/GimbabHeaven.java
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
public class GimbabHeaven {

public static void main(String[] args) {
new Order().mainOrder();
}
}

166 changes: 166 additions & 0 deletions src/Menu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
import exception.NotMenuException;

import java.util.Arrays;
import java.util.List;

public enum Menu {
없음(-1),
원조김밥(2500),
김치김밥 (3000),
참치김밥 (3000),
치즈김밥 (3000),
땡초김밥 (3000),
샐러드김밥 (3000),
소고기김밥 (3500),
돈까스김밥 (3500),
계란말이김밥 (4000),
소시지김밥 (3500),
새우김밥 (3500),
모듬김밥 (5000),
돈까스 (7000),
더블돈까스 (9000),
치킨까스 (7500),
생선까스 (7500),
새우까스 (7500),
치즈돈까스 (7500),
카레돈까스 (8000),
고구마돈까스 (7500),
갈릭스테이크 (7500),
스페셜정식 (8500),
유부우동 (5000),
오뎅 (4500),
바지락칼국수 (6000),
김치칼국수 (7000),
들깨칼국수 (7000),
바지락손수제비 (6000),
김치손수제비 (7000),
들깨손수제비 (7000),
잔치국수 (6000),
쫄면 (6000),
떡국 (6000),
만두국 (6000),
떡만두 (6000),
물냉면 (6000),
비빔냉면 (6000),
고기만두_8개 (4000),
김치만두_8개 (4000),
갈비만두_8개 (4000),
군만두_8개 (4000),
떡볶이 (4000),
깻잎떡볶이 (5000),
치즈떡볶이 (5000),
라볶이 (5000),
치즈라볶이 (5000),
쫄볶이 (5000),
치즈쫄볶이 (6000),
치즈스파게티 (6000),
열무냉면 (7000),
열무국수 (7000),
냉콩국수 (7000),
비빔국수 (7000),
메밀막국수 (7000),
냉모밀 (7000),
칠리탕수육 (7000),
카레덮밥 (6000),
참치덮밥 (6500),
소불고기덮밥 (6500),
제육덮밥 (6500),
김치제육덮밥 (7000),
오징어덮밥 (7000),
낙지덮밥 (8000),
오삼불고기덮밥 (8000),
낙삼덮밥 (8000),
쭈꾸미덮밥 (8000),
소고기볶음밥 (6500),
새우볶음밥 (6500),
김치볶음밥 (6500),
참치김치볶음밥 (7000),
야채비빔밥 (6000),
날치알비빔밥 (7000),
참치비빔밥 (7000),
소불고기비빔밥 (7000),
된장찌개 (6000),
우렁된장찌개 (7000),
청국장 (6000),
콩비지 (6000),
해물순두부찌개 (7000),
참치김치찌개 (7000),
돼지김치찌개 (7000),
김치고등어조림 (7000),
꽁치조림 (7000),
갈치조림 (7000),
스팸마요덮밥 (6000),
참치마요덮밥 (6000),
치킨마요덮밥 (6000),
돈까스마요덮밥 (6000),
오므라이스 (6500),
호불정식 (7000),
낙지소면 (12000),
콩나물국밥 (6000),
육개장 (7000),
갈비탕 (7000),
설렁탕 (7000),
순대국 (7000),
부대찌개 (7000),
동태탕 (7000),
황태탕 (7000),
양평해장국 (7000),
소머리국밥 (7000),
소고기미역국 (7000),
소고기무국 (7000),
내장탕 (8000),
해물알탕 (8000),
뼈해장국 (8000),
삼계탕(11000),
콜라_소 (1000),
사이다_소 (1000),
콜라_대 (3000),
사이다_대 (3000),
공기밥 (1000),
계란후라이 (1000),
계란찜 (5000);

private int price;

public int getPrice() {
return price;
}

// private final Map<String, Integer> foodMenu = new LinkedHashMap<>();

public static Menu getMenuByName(String name) throws NotMenuException {
return Arrays.stream(Menu.values()).filter(menu -> menu.name().equals(name)).findFirst().orElseThrow(() -> new NotMenuException());
}

Menu(int price) {
this.price = price;
}

// public void menuPrepare() {
// System.out.println("=================================감귤의 김밥천국에 오신것을 환영합니다=================================");
// int column = 4, row = foodMenu.size() / 4; //보여주고 싶은 열 수 = column, 행수 = row
// ArrayList key = new ArrayList<String>(foodMenu.keySet());
// for (int i = 0; i < foodMenu.size(); i++) {
// System.out.printf("%-11s\t%5d\t", String.valueOf(key.get(i / column + (row * i) % (column * row))), foodMenu.get(key.get(i / column + (row * i) % (column * row))));
// if (i % column == column - 1) System.out.println("|"); //get 뒷부분부터 나머지정리와 행수를 통해 행렬을 Transpose시켜서
// } //원하는 행수와 열수를 입력하여 메뉴판 모양(콘솔창)을 보여주도록 구성
// System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t|");
// System.out.println("================================================================================================");
// }

public static void menuPrepare() {
System.out.println("=================================감귤의 김밥천국에 오신것을 환영합니다=================================");
int column = 4, row = Menu.values().length / 4; //보여주고 싶은 열 수 = column, 행수 = row
List<Menu> key = Arrays.asList(Menu.values());
for (int i = 1; i < Menu.values().length; i++) {
System.out.printf("%-11s\t%5d\t", key.get(i / column + (row * i) % (column * row)).name(), key.get(i / column + (row * i) % (column * row)).price);
if (i % column == column - 1) System.out.println("|"); //get 뒷부분부터 나머지정리와 행수를 통해 행렬을 Transpose시켜서
} //원하는 행수와 열수를 입력하여 메뉴판 모양(콘솔창)을 보여주도록 구성
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t|");
System.out.println("================================================================================================");
}

public static int getFoodMenu(String ordered) throws NotMenuException {
return getMenuByName(ordered).price;
}
}
117 changes: 117 additions & 0 deletions src/Order.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
import exception.NotMenuException;

import java.util.Scanner;

public class Order {
private static int customercnt = 10000;

Scanner sc = new Scanner(System.in);

private boolean ordered = true;


public void mainOrder() {
System.out.println("주문을 시작합니다.\n");
order();
System.out.println("주문이 종료되었습니다. 감사합니다.");
sc.close();
customercnt++;
}

public void order() {
Menu.menuPrepare();
if (ordered) {
orderResult();
} else {
ordered = true;
}
System.out.println("메뉴를 선택해주세요, 주문을 취소하려면 x를 입력해주세요\n");
try {
if (selectOrder(sc.nextLine()) == 1) {

calPrice(OrderList.getSumCost(),sc.nextLine());
return;
}
} catch (NotMenuException e) {
System.out.println(e.getMessage() + "다시 주문해주세요.");
}
order();
}

public int doOrder(String ordered) throws NotMenuException {
return Menu.getFoodMenu(ordered);
}

public int selectOrder(String ordered) throws NotMenuException{
if (ordered.equals("x")) {
return 1;
} else {
final int orderedPrice = doOrder(ordered);
System.out.println("주문하신 " + ordered + "의 금액은 " + orderedPrice + "원입니다.");
OrderList.addList(new OrderItem(customercnt, ordered, orderedPrice));
return 3;
}
}

public int reOrderOptions(String ordered) {
if (ordered.equals("o")) {
return 0;

} else if (ordered.equals("x")) {
return 1;

} else {
System.out.println("잘못입력하셨습니다.");
return 2;
}
}

public void orderResult() {

System.out.println("주문하신 음식의 총 금액은 " + OrderList.getSumCost() + "원입니다.\n");

}


public void calPrice(int money,String paidMoney) {
int change = 0;
int payable = money;
System.out.printf("%d원을 결제해주세요\n\n", payable);


try {
change = Integer.parseInt(paidMoney) - payable;

} catch (ClassCastException cce) {
System.out.println("정상적으로 처리되지 않았습니다. 다시 금액을 입력해주세요.\n");
calPrice(money, sc.nextLine());
return;
}

if (Integer.parseInt(paidMoney) <= 0) {
System.out.println("정상적으로 처리되지 않았습니다. 다시 금액을 입력해주세요.\n");
calPrice(money, sc.nextLine());
return;
}

if (change < 0){
System.out.print("금액이 부족합니다.");
calPrice(-change, sc.nextLine());
return;
}

settlement(change, Integer.parseInt(paidMoney));

System.out.printf("%d원을 받았습니다.\n", OrderList.getSumCost());
System.out.printf("거스름돈은 %d원입니다. 감사합니다.\n", change);

}

public void settlement(int change, int paid) {
StoreWallet.priceUp(paid);
StoreWallet.priceDown(change);

System.out.println("결재가 완료되었습니다.");
}
}

24 changes: 24 additions & 0 deletions src/OrderItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
public class OrderItem {

private int customer;
private String foodName;
private int foodCost;

public OrderItem(int customer , String foodName,int foodCost){
this.customer = customer;
this.foodName = foodName;
this.foodCost = foodCost;
}

public int getFoodCost() {
return foodCost;
}

public int getCustomer() {
return customer;
}

public String getFoodName() {
return foodName;
}
}
28 changes: 28 additions & 0 deletions src/OrderList.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import java.util.ArrayList;
import java.util.List;

public class OrderList {

private static final List<OrderItem> orders = new ArrayList<>();

public static void addList(OrderItem orderItem){
orders.add(orderItem);
}

public static int getSumCost(){
int sum = 0;
for(OrderItem orderitem : orders){
sum += orderitem.getFoodCost();
}
return sum;
}
public static int getOrderList(){
System.out.printf("%d번 고객님의 주문내역%n",orders.get(orders.size()-1).getCustomer());
System.out.println("=====================");
for(OrderItem orderitem : orders){
System.out.println(orderitem.getFoodName()+ " : " + orderitem.getFoodCost() + "원");
}
return 1;
}

}
Loading