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}
-