@@ -0,0 +1,115 @@
+package store.io;
+
+import static store.constants.InputMessages.ADDITIONAL_PURCHASE_MESSAGE;
+import static store.constants.InputMessages.FREEBIE_ADDITION_MESSAGE;
+import static store.constants.InputMessages.INPUT_PRODUCT_NAME_AND_QUANTITY;
+import static store.constants.InputMessages.MEMBERSHIP_DISCOUNT_CHOICE_MESSAGE;
+import static store.constants.InputMessages.REGULAR_PRICE_BUY_MESSAGE;
+import static store.constants.StringConstants.NEW_LINE;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import store.domain.Choice;
+import store.domain.Product;
+import store.domain.StoreHouse;
+import store.dto.PromotionInfo;
+import store.dto.Purchase;
+import store.io.parser.InputParser;
+import store.io.parser.ProductsFileLineParser;
+import store.io.parser.PromotionsFileLineParser;
+import store.io.reader.FileReader;
+import store.io.reader.Reader;
+import store.io.writer.Writer;
+
+public class InputView {
+
+    private final Reader reader;
+    private final Writer writer;
+    private final InputValidator validator;
+
+    public InputView(Reader reader, Writer writer, InputValidator validator) {
+        this.reader = reader;
+        this.writer = writer;
+        this.validator = validator;
+    }
+
+    public StoreHouse readProductsFileInput(String fileName) {
+        try {
+            return readProductsFile(fileName);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private StoreHouse readProductsFile(String fileName) throws IOException {
+        Reader reader = new FileReader(fileName);
+        reader.readLine();
+        String line;
+        StoreHouse storeHouse = new StoreHouse();
+        while ((line = reader.readLine()) != null) {
+            Product product = new ProductsFileLineParser(line).parseLine();
+            storeHouse.addProduct(product);
+        }
+        return storeHouse;
+    }
+
+    public List<PromotionInfo> readPromotionsFileInput(String fileName) {
+        try {
+            return readPromotionsFile(fileName);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private List<PromotionInfo> readPromotionsFile(String fileName) throws IOException {
+        Reader reader = new FileReader(fileName);
+        reader.readLine();
+        String line;
+        List<PromotionInfo> promotionInfos = new ArrayList<>();
+        while ((line = reader.readLine()) != null) {
+            promotionInfos.add(new PromotionsFileLineParser(line).parseLine());
+        }
+        return promotionInfos;
+    }
+
+    public List<Purchase> readProductNameAndQuantity() {
+        writer.write(INPUT_PRODUCT_NAME_AND_QUANTITY);
+        String inputProductAndQuantity = reader.readLine();
+        writer.write(NEW_LINE);
+        validator.validateEmptyInput(inputProductAndQuantity);
+        return new InputParser().parse(inputProductAndQuantity);
+    }
+
+    public Choice readFreebieAdditionChoice(String productName) {
+        writer.write(String.format(FREEBIE_ADDITION_MESSAGE, productName));
+        String input = reader.readLine();
+        writer.write(NEW_LINE);
+        validator.validateEmptyInput(input);
+        return Choice.checkYesOrNo(input);
+    }
+
+    public Choice readRegularPricePaymentChoice(String productName, int quantity) {
+        writer.write(String.format(REGULAR_PRICE_BUY_MESSAGE, productName, quantity));
+        String input = reader.readLine();
+        writer.write(NEW_LINE);
+        validator.validateEmptyInput(input);
+        return Choice.checkYesOrNo(input);
+    }
+
+    public Choice readMembershipDiscountApplicationChoice() {
+        writer.write(MEMBERSHIP_DISCOUNT_CHOICE_MESSAGE);
+        String input = reader.readLine();
+        writer.write(NEW_LINE);
+        validator.validateEmptyInput(input);
+        return Choice.checkYesOrNo(input);
+    }
+
+    public Choice readAdditionalPurchaseChoice() {
+        writer.write(ADDITIONAL_PURCHASE_MESSAGE);
+        String input = reader.readLine();
+        writer.write(NEW_LINE);
+        validator.validateEmptyInput(input);
+        return Choice.checkYesOrNo(input);
+    }
+}

리뷰: inputView는 사용자로부터 입력을 받는 UI 역할로, 파일을 읽고 데이터를 처리하는 과정은 parser로 빼주시면 좋을 것 같습니다! (파일 읽기는 FileReader로, 해당 파일의 데이터 처리는 parser로!)
아니면 setup service를 만들어서 그곳에서 setup을 진행하고 controller에서 불러오는 것도 좋을 것 같습니다!

그리고 파일 읽기 기능을 줄 단위로 읽어와 처리하는 것도 좋은 방법이지만, readAllLines (지우님께서 리뷰 해주셨던!) 메서드를 사용하면 한번에 읽어와서 코드를 읽어오는 부분을 단축 시킬 수 있답니다!