diff --git a/.gitignore b/.gitignore index 3fefc442..29d7114a 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,6 @@ bin/ ### Mac OS ### .DS_Store\ntomcat.8080/ + +## tomcat +**/tomcat.8080 diff --git a/src/main/java/com/diy/app/LectureServlet.java b/src/main/java/com/diy/app/LectureServlet.java new file mode 100644 index 00000000..ba0d542b --- /dev/null +++ b/src/main/java/com/diy/app/LectureServlet.java @@ -0,0 +1,125 @@ +package com.diy.app; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; + +@WebServlet("/lectures") +public class LectureServlet extends HttpServlet { + + private final ObjectMapper objectMapper = new ObjectMapper(); + private final List lectures = new ArrayList<>(); + private Long idx = 1L; + + @Override + public void init() throws ServletException { + System.out.println("[INIT] servlet initialized"); + + IntStream.rangeClosed(1, 5) + .forEach(i -> lectures.add(new Lecture(idx++, "TEST"+i, BigDecimal.valueOf(i*10000)))); + + super.init(); + } + + /** + * 강의 목록 조회 + */ + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + System.out.println("[GET] lecture list"); + + req.setAttribute("lectures", lectures); + + req.getRequestDispatcher("/lecture-list.jsp").forward(req, resp); + } + + /** + * 강의 등록 + */ + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + System.out.println("[POST] lecture register"); + + Map payload = objectMapper.readValue(req.getReader(), Map.class); + Lecture lecture = new Lecture( + idx++, + payload.get("name").toString(), + new BigDecimal(payload.get("price").toString()) + ); + lectures.add(lecture); + + resp.sendRedirect("/lectures"); + } + + /** + * 강의 수정 + */ + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException { + System.out.println("[PUT] lecture modify"); + + // req: id, name, price + Map payload = objectMapper.readValue(req.getReader(), Map.class); + Long id = Long.valueOf(payload.get("id").toString()); + + for (int i = 0; i < lectures.size(); i++) { + var orgLecture = lectures.get(i); + if (id.equals(orgLecture.getId())) { + lectures.set(i, new Lecture( + orgLecture.getId(), + payload.get("name").toString(), + new BigDecimal(payload.get("price").toString()) + )); + break; + } + } + } + + /** + * 강의 삭제 + */ + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + System.out.println("[DELETE] lecture delete"); + + // req: id + Map payload = objectMapper.readValue(req.getReader(), Map.class); + Long id = Long.valueOf(payload.get("id").toString()); + + lectures.removeIf(lecture -> id.equals(lecture.getId())); + } + + public static class Lecture { + private final Long id; + private final String name; + private final BigDecimal price; + + private Lecture(Long id, String name, BigDecimal price) { + this.id = id; + this.name = name; + this.price = price; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + } +} diff --git a/src/main/java/com/diy/app/Main.java b/src/main/java/com/diy/app/Main.java index c81e36ae..d5c61195 100644 --- a/src/main/java/com/diy/app/Main.java +++ b/src/main/java/com/diy/app/Main.java @@ -1,6 +1,78 @@ package com.diy.app; +import com.diy.framework.web.server.TomcatWebServer; + public class Main { public static void main(String[] args) { + + final TomcatWebServer tomcatWebServer = new TomcatWebServer(); + tomcatWebServer.start(); + + + // version 3 + /* + final Tomcat tomcat = new Tomcat(); + tomcat.setPort(8080); + + try { + tomcat.start(); + final Thread awaitThread = new Thread(() -> tomcat.getServer().await()); + awaitThread.start(); + + System.out.println("서버 실행"); + } catch (LifecycleException e) { + throw new RuntimeException(e); + } + + */ + + // version 2 + /* + final Tomcat tomcat = new Tomcat(); + tomcat.setPort(8080); + + new Thread(() -> { + try { + tomcat.start(); + // while true 대신 await + // thread 를 blocking-> 서버가 다른 스택에서 멈춰서 다른 로직 수행 불가 + // -> 별도 스레드 실행하면 해결되지만, 톰캣 실행 흐름이 다른 스레드로 넘어가 스레드 간 컨텍스트 공유가 어려움 + // => 톰캣 실행은 메인 스레드에서 하고, await 로 스레드가 종료되지 않게 하는 메서드를 다른 스레드로 넘겨주면 됨 (v3) + tomcat.getServer().await(); + } catch ( + LifecycleException e) { + throw new RuntimeException(); + } + }).start(); + System.out.println("Hello, World!"); + + */ + + // version 1 + /* + // 웹 요청을 직접 받는 대신 => Spring Boot 의 Embedded Tomcat 사용 (v2) + try (final ServerSocket serverSocket = new ServerSocket(8080)) { + // 서버가 요청을 계속 받을 수 있도록 하기 위해 추가 + while (true) { + try (final Socket clientSocket = serverSocket.accept()) { + final BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + final PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); + + // HTTP 요청 읽기 + final String request = in.readLine(); + System.out.println("요청: " + request); + + // HTTP 응답 전송 + out.println("HTTP/1.1 200 OK"); + out.println("Content-Type: text/html; charset=UTF-8"); + out.println(); + out.println("

Hello, World!

"); + } + } + } catch (final IOException e) { + System.err.println("error = " + e.getMessage()); + } + + */ } } diff --git a/src/main/java/com/diy/framework/web/server/TomcatWebServer.java b/src/main/java/com/diy/framework/web/server/TomcatWebServer.java index 47dbb0e7..357a6b87 100644 --- a/src/main/java/com/diy/framework/web/server/TomcatWebServer.java +++ b/src/main/java/com/diy/framework/web/server/TomcatWebServer.java @@ -38,7 +38,7 @@ private void setServerContext() { final String resourcesPath = Paths.get("src", "main", "resources").toString(); final String absoluteResourcesPath = new File(resourcesPath).getAbsolutePath(); - final Context context = this.tomcat.addWebapp("/", absoluteResourcesPath); + final Context context = this.tomcat.addWebapp("", absoluteResourcesPath); context.setRequestCharacterEncoding("UTF-8"); context.setResponseCharacterEncoding("UTF-8"); diff --git a/src/main/resources/lecture-list.jsp b/src/main/resources/lecture-list.jsp index 343329ac..ef3b4142 100644 --- a/src/main/resources/lecture-list.jsp +++ b/src/main/resources/lecture-list.jsp @@ -11,8 +11,8 @@ 등록
  • id: ${lecture.id}
  • -
  • pw: ${lecture.name}
  • -
  • pw: ${lecture.price}
  • +
  • name: ${lecture.name}
  • +
  • price: ${lecture.price}

  • diff --git a/src/main/resources/lecture-registration.jsp b/src/main/resources/lecture-registration.jsp index 8f52f434..b4c3d9bc 100644 --- a/src/main/resources/lecture-registration.jsp +++ b/src/main/resources/lecture-registration.jsp @@ -8,7 +8,7 @@ 강의 등록 -
    +