인프런 커뮤니티 질문&답변

leetekwoo님의 프로필 이미지
leetekwoo

작성한 질문수

비전공자를 위한 진짜 입문 올인원 개발 부트캠프

그랩마켓 웹과 상품 정보 연동하기

localhost 브라우저 접속 시 문제가 발생합니다

작성

·

1.1K

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요 ! 질문 남깁니다.
이전 강의까지는 아무 문제 없이 단계 대로 잘 진행되고 있었는데,
이번서부터 나아가지 않고 있습니다.
 
1. 크롬 브라우저로 localhost:8080에 접속할 시 Cannot Get /
이라는 문구가 나타납니다. localhost:8080/products에 들어가면 server.js에 입력한 상품 정보들은 잘 나타나고 있습니다.
 
2. localhost:3000로 접속하면 상품들이 나열되지 않고 빈화면만 나타납니다.
 
1번의 문제로 인해 2번 과정에서 문제가 있지 않을까 싶습니다.
무엇이 문제일까 싶어 올려주신 코드(index.js, server.js)를 복사 붙여넣기 하여도 같은 문제가 발생하네요.. 무엇이 문제일까요?
 
강의 잘 듣고 있습니다. 감사합니다!
 
작성한 코드 첨부합니다!
 
server.js , index.js
 
const express = require("express");
const cors = require("cors");
const app = express();
const port = 8080;

app.use(express.json());
app.use(cors());

app.get("/products", (req, res) => {
  res.send({
    products: [
      {
        id: 1,
        name: "농구공",
        price: 100000,
        seller: "조던",
        imageUrl: "images/images/products/basketball1.jpeg",
      },
      {
        id: 2,
        name: "축구공",
        price: 50000,
        seller: "메시",
        imageUrl: "images/images/products/soccerball1.jpg",
      },
      {
        id: 3,
        name: "키보드",
        price: 10000,
        seller: "그랩",
        imageUrl: "images/images/products/keyboard1.jpg",
      },
    ],
  });
});

app.post("/products", (req, res) => {
  res.send("상품이 등록됨");
});

app.listen(port, () => {
  console.log("쇼핑몰 서버가 돌아간다");
});
var http = require("http");
var hostname = "127.0.0.1";
var port = 8080;

const server = http.createServer(function (req, res) {
  const path = req.url;
  const method = req.method;
  if (path === "/products") {
    if (method === "GET") {
      res.writeHead(200, { "Content-Type": "application/json" });
      const products = JSON.stringify([
        {
          name: "농구공",
          price: 5000,
        },
      ]);
      res.end(products);
    } else if (method === "POST") {
      res.end("생성됨");
    }
  } else {
    res.end("hello Client!");
  }
});

server.listen(port, hostname);

console.log("market server on!");

답변 2

2

 첫번째 코드에서 localhost:8080으로 접속했을때는 " Cannot GET / " 이 출력되었고 /product에 접속했을때는 상품 정보가 잘 출력되었다 하셨죠? 질문자님의 코드에서는 아주 정상적인 출력입니다. 두 번째 코드에서는 express 대신 http 모듈을 사용하셔서 서버를 작성하셨는데 출력이 정상적인 이유는 클라이언트 쪽에서 웹사이트에 접속 할 떄에는 해당 웹사이트의 서버로 'GET'요청을 필수적으로 보내게 됩니다. 두 번째 코드에서 http 모듈로 서버를 만든 후 서버에 접속 했을때는 조건문으로 메서드와 URL(주소)를 지정해주지 않는 한 GET "메서드" 로 / "URL"에 접속한 상황이 됩니다.

  http 모듈로 만든 서버가 돌아가고 있을 때 클라이언트가 URL이 localhost:8080인 웹사이트에 접속했다고 가정할 때 질문자님께서 만드신 index.js 안에 코드를 보시면 아래와 같습니다.

const server = http.createServer(function (req, res) {
  const path = req.url;
  const method = req.method;
  if (path === "/products") {
    if (method === "GET") {
      res.writeHead(200, { "Content-Type": "application/json" });
      const products = JSON.stringify([
        {
          name: "농구공",
          price: 5000,
        },
      ]);
      res.end(products);
    } else if (method === "POST") {
      res.end("생성됨");
    }
  } else {
    res.end("hello Client!");
  }
});

  조건문 부터 천천히 봅시다. path가 "/products"라면 그 다음 조건인 method가 "GET"인 조건을 찾습니다. 만약 localhost:8080에 접속해서 URL에 "/products"를 입력하면 위에 조건이 성사되게 됩니다. else if를 보시면 method가 "POST"인 조건을 찾는데 이는 저희가 웹브라우저로 주소를 입력한다고 사용할 수 있는 메서드가 아닙니다. 만약 "POST" 요청을 어떻게 보내는지 궁금하시다면 

https://testmanager.tistory.com/342

위에 주소에 들어가서 확인해보세요.

 else에 경우를 봅시다. 이는 위에 조건과 아무것도 성사 되지 않을 때 사용하는 예약어(키워드)입니다. 만약 저희가 localhost:8080에 접속했다면 else부분이 바로 실행되게 될 것입니다. index.js에서 만든 코드에 조건에 해당하는게 없기 때문이죠. 이런식으로 조건문 분기를 통해서 서버를 작성하는게 여간 까다로운게 아닙니다. 그래서 node.js에서 제공하는 express라는 모듈을 사용 할 수 있습니다.  express로 작성된 server.js를 같이 봅시다.

const express = require("express");
const cors = require("cors");
const app = express();
const port = 8080;

app.use(express.json());
app.use(cors());

app.get("/products", (req, res) => {
  res.send({
    products: [
      {
        id: 1,
        name: "농구공",
        price: 100000,
        seller: "조던",
        imageUrl: "images/images/products/basketball1.jpeg",
      },
      {
        id: 2,
        name: "축구공",
        price: 50000,
        seller: "메시",
        imageUrl: "images/images/products/soccerball1.jpg",
      },
      {
        id: 3,
        name: "키보드",
        price: 10000,
        seller: "그랩",
        imageUrl: "images/images/products/keyboard1.jpg",
      },
    ],
  });
});

app.post("/products", (req, res) => {
  res.send("상품이 등록됨");
});

app.listen(port, () => {
  console.log("쇼핑몰 서버가 돌아간다");
});

 전체를 다 설명해드리기 보단 질문자님께서 궁금하신 내용인 왜 localhost에 접속했는데 "Cannot Get / "이 나오는가에 대해서만 설명드리겠습니다. express의 장점은 미들웨어(app.use(), app.get()등등)를 사용해서 서버에 필요한 코드를 작성하기 쉽다는 것입니다. 특정 URL에 원하는 메서드를 보내고 싶다한다면 

app.get("/products", (req, res) ...) 이런식으로 사용할 수 있다는 것이죠. 근데 여기서 코드가 실행되고 서버에 접속했을 떄 "Cannot Get / "이 왜나오고 "/products"를 입력하면 상품정보는 잘만나오는가에 대해서 살펴봅시다. "/products"만 잘나오는 이유는 미들웨어로 app.get("/products")를 작성하셨기 때문입니다. 이는 지금 서버가 잘 돌아가고 있음을 알려줍니다. "Cannot Get /"을 해석해보면 "/"으로 GET 할수 없다 입니다. 저희가 브라우저로 웹에 접속한다면 예를 들어 구글에 접속해 본다고 가정해 봅시다. URL이 www.google.com인 것을 확인해 볼수 있을겁니다. 그런데 여기에는 사실 "/"이 생략되어 있습니다. 따라서 얼래 URL은 www.google.com/인 것이죠 server.js 에서도 GET메서드로 "/"에 접속한다는 미들웨어를 만들어 주신다면 해결되는 문제입니다. 예를 들면 아래처럼 만들 수 있습니다.

app.get("/", (req, res) => {
    res.send("여기는 서버에 처음 접속 할 때 나오는 화면입니다!");
});

 이런식으로 만드시고 서버를 다시 실행 후 localhost:8080(index.js에서 만든 port번호, port번호는 본인이 원하는 숫자를 입력할 수 있습니다.)로 접속하신다면 이제 더이상 Cannot get / 이 나오지 않게 될 것입니다. 코드 전체를 다시 올려드리겠습니다.

const express = require("express");
const cors = require("cors");
const app = express();
const port = 8080;

app.use(express.json());
app.use(cors());

app.get("/", (req, res) => {
    res.send("여기는 서버에 처음 접속했을 때 나오는 화면입니다!");
});

app.get("/products", (req, res) => {
    res.send({
        products: [
            {
                id: 1,
                name: "농구공",
                price: 100000,
                seller: "조던",
                imageUrl: "images/images/products/basketball1.jpeg",
            },
            {
                id: 2,
                name: "축구공",
                price: 50000,
                seller: "메시",
                imageUrl: "images/images/products/soccerball1.jpg",
            },
            {
                id: 3,
                name: "키보드",
                price: 10000,
                seller: "그랩",
                imageUrl: "images/images/products/keyboard1.jpg",
            },
        ],
    });
});

app.post("/products", (req, res) => {
    res.send("상품이 등록됨");
});

app.listen(port, () => {
    console.log("쇼핑몰 서버가 돌아간다");
});

 

두 번째 질문에서 localhost:3000에 접속했을 때 화면이 아무것도 나오지 않으셨다 했는데 포트번호를 3000으로 설정하지 않으시면 나오지 않는게 정상입니다. 포트는 작성하신 코드에서 port변수를 원하는 숫자로 해주시면 될 거 같습니다.

답변이 너무 길어서 죄송하지만 질문자님께 최대한 도움 드리고자  말이 두서없이 길어진 거 같습니다. 너무 직설적인 답변은 답변을 이해하는데 어려움이 있을까 해서 길게 적게되었습니다. 도움이 되셨으면 좋겠네요.

사랑하고 감사합니다,,,

1

그랩님의 프로필 이미지
그랩
지식공유자

localhost:3000은 웹 서버의 URL 입니다! 말씀하신 1번 내용을 봤을 때 API 서버(8080)에서는 정상적으로 데이터를 제공해주는 것 같아요.

따라서 웹에서 이슈가 있는 것 같습니다. 제대로 된 API 서버로 요청을 하고 있는지 먼저 확인해보면 좋을 것 같아요. 개발자도구를 열어서 Console에 무슨 로그가 보이는지 확인해보면 좋을 것 같아요. 또한 웹 소스코드에 문제가 없는지도 보면 좋을 것 같아요

leetekwoo님의 프로필 이미지
leetekwoo

작성한 질문수

질문하기