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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,6 @@ bin/

### Mac OS ###
.DS_Store\ntomcat.8080/

## tomcat
**/tomcat.8080
125 changes: 125 additions & 0 deletions src/main/java/com/diy/app/LectureServlet.java
Original file line number Diff line number Diff line change
@@ -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<Lecture> 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<String, Object> 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<String, Object> 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<String, Object> 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;
}
}
}
72 changes: 72 additions & 0 deletions src/main/java/com/diy/app/Main.java
Original file line number Diff line number Diff line change
@@ -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("<html><body><h1>Hello, World!</h1></body></html>");
}
}
} catch (final IOException e) {
System.err.println("error = " + e.getMessage());
}

*/
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/lecture-list.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
<a href="/lecture-registration.jsp">등록</a>
<c:forEach var="lecture" items="${lectures}">
<li>id: ${lecture.id}</li>
<li>pw: ${lecture.name}</li>
<li>pw: ${lecture.price}</li>
<li>name: ${lecture.name}</li>
<li>price: ${lecture.price}</li>
<br>
</c:forEach>
</body>
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/lecture-registration.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<title>강의 등록</title>
</head>
<body>
<form id="registrationForm">
<form id="registrationForm" action="/lectures" method="post">
<label for="name">이름:</label>
<input type="text" id="name" name="name" required>
<label for="price">가격:</label>
Expand Down