Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
732ef7c
docs(README): 3단계 기능 구현 목록 작성
ehBeak Sep 10, 2024
04de9a3
refactor(HttpRequest): HttpRequest 객체 수정
ehBeak Sep 10, 2024
5381543
fix(HttpRequest): 파싱 로직 수정
ehBeak Sep 10, 2024
bf452f5
test(HttpRequestTest): 요청 데이터 수정
ehBeak Sep 10, 2024
9e235f9
refactor(HttpResponse): 응답 객체 리팩토링
ehBeak Sep 11, 2024
3b02da5
refactor(HttpResponse): 응답 객체 리팩토링
ehBeak Sep 11, 2024
b0178cd
refactor(controller): servlet 명명 대신 controller 사
ehBeak Sep 11, 2024
8d2a81c
refactor(HttpRequest): RequestLine 객체 분리
ehBeak Sep 11, 2024
1adb942
refactor(HttpRequest): HttpVersion 추가
ehBeak Sep 11, 2024
6089328
refactor(HttpResponse): 버전을 String이 아닌, HttpVersion으로 수정
ehBeak Sep 11, 2024
243bbb7
test(HttpResponseTest): 응답 출력에 관한 테스트 작성
ehBeak Sep 11, 2024
7fc8d2a
test(Http11Processor): 서비스로직에 대한 테스트 코드 작성
ehBeak Sep 11, 2024
b5c69ef
refactor(ControllerMapper): 각각의 controller 싱글톤으로 설정
ehBeak Sep 11, 2024
aa72740
refactor(ContentType): ContentType 분리
ehBeak Sep 11, 2024
f8fed92
refactor(request): 변수명 수정 및 줄바꿈 삭제
ehBeak Sep 12, 2024
a757ac3
fix(HttpRequest): 필요없는 매개변수 삭제
ehBeak Sep 12, 2024
bbf8f43
refactor(servlet): controller 네이밍을 servlet으로 변경
ehBeak Sep 12, 2024
da6cf38
refactor(LoginController): login의 비즈니스 로직 분리
ehBeak Sep 12, 2024
020aa56
refactor(RegisterController): 회원가입의 비즈니스 로직 분리
ehBeak Sep 12, 2024
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
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,9 @@
- [x] 쿠키에서 전달 받은 JSESSIONID의 값으로 로그인 여부를 체크
- [x] 로그인에 성공하면 Session 객체의 값으로 User 객체를 저장
- [x] 로그인된 상태에서 /login 페이지에 HTTP GET method로 접근하면 이미 로그인한 상태니 index.html 페이지로 리다이렉트

### 3단계 리팩토링
- [x] HttpRequest 구현하기
- [x] HttpResponse 구현하기
- [x] Controller 인터페이스 추가하기
- [x] 컨트롤러 인터페이스를 추가하고 각 분기에 있는 로직마다 AbstractController를 상속한 구현체로 만들기
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.techcourse.controller;

import com.techcourse.db.InMemoryUserRepository;
import com.techcourse.model.User;
import org.apache.catalina.servlet.http.Cookie;
import org.apache.catalina.servlet.http.Session;
import org.apache.catalina.servlet.http.SessionManager;
import org.apache.catalina.servlet.http.request.HttpRequest;
import org.apache.catalina.servlet.http.response.HttpResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoginController {

private static final Logger log = LoggerFactory.getLogger(LoginController.class);

public String getLoginPage(HttpRequest request, HttpResponse response) {
if (request.hasCookie()) {
Cookie cookie = request.getCookie();
SessionManager sessionManager = SessionManager.getInstance();
if (sessionManager.hasSession(cookie.getValue())) {
response.sendRedirect("/index.html");
}
}
return "/login";
}

public void login(HttpRequest request, HttpResponse response) {
String account = request.getParameter("account");
InMemoryUserRepository.findByAccount(account)
.ifPresentOrElse(user -> login(request, response, user), () -> response.sendRedirect("/401.html"));
}

private void login(HttpRequest request, HttpResponse response, User user) {
if (user.checkPassword(request.getParameter("password"))) {
log.info("user : {}", user);
Session session = request.getSession();
session.setAttribute("user", user);
response.addCookie(new Cookie("JSESSIONID", session.getId()));
response.sendRedirect("/index.html");
return;
}
response.sendRedirect("/401.html");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.techcourse.controller;

import com.techcourse.db.InMemoryUserRepository;
import com.techcourse.model.User;
import org.apache.catalina.servlet.http.request.HttpRequest;
import org.apache.catalina.servlet.http.response.HttpResponse;
import org.apache.catalina.servlet.http.response.HttpStatus;

public class RegisterController {

public String getRegisterPage() {
return "/register";
}

public void register(HttpRequest request, HttpResponse response) {
String account = request.getParameter("account");
String email = request.getParameter("email");
String password = request.getParameter("password");
InMemoryUserRepository.save(new User(account, password, email));
response.setStatus(HttpStatus.OK.getStatusCode());
response.sendRedirect("/index.html");
}
}
2 changes: 1 addition & 1 deletion tomcat/src/main/java/org/apache/catalina/Manager.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.apache.catalina;

import java.io.IOException;
import org.apache.catalina.servlets.http.Session;
import org.apache.catalina.servlet.http.Session;

/**
* A <b>Manager</b> manages the pool of Sessions that are associated with a
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,32 @@
package org.apache.catalina.mapper;

import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.regex.Pattern;
import org.apache.catalina.servlets.DefaultServlet;
import org.apache.catalina.servlets.LoginServlet;
import org.apache.catalina.servlets.RegisterServlet;
import org.apache.catalina.servlets.Servlet;
import org.apache.catalina.servlet.DefaultServlet;
import org.apache.catalina.servlet.LoginServlet;
import org.apache.catalina.servlet.RegisterServlet;
import org.apache.catalina.servlet.Servlet;

/**
* 요청의 URL을 실제 정적 파일 절대 경로로 매핑해준다.(동적 파일만)
*/
public class Mapper {
public class ControllerMapper {

private static final Map<Pattern, Servlet> values = Map.of(
Pattern.compile(".*\\..*"), new DefaultServlet(),
Pattern.compile("/"), new DefaultServlet(),
Pattern.compile("^/login$"), new LoginServlet(),
Pattern.compile("^/register$"), new RegisterServlet()
Pattern.compile(".*\\..*"), DefaultServlet.getInstance(),
Pattern.compile("/"), DefaultServlet.getInstance(),
Pattern.compile("^/login$"), LoginServlet.getInstance(),
Pattern.compile("^/register$"), RegisterServlet.getInstance()
);

private static Mapper instance;
private static ControllerMapper instance;

private Mapper() {}
private ControllerMapper() {}

public static Mapper getInstance() {
public static ControllerMapper getInstance() {
if (instance == null) {
instance = new Mapper();
instance = new ControllerMapper();
}
return instance;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
package org.apache.catalina.servlets;
package org.apache.catalina.servlet;

import java.io.IOException;
import org.apache.catalina.servlets.http.request.HttpRequest;
import org.apache.catalina.servlets.http.response.HttpResponse;
import org.apache.catalina.servlet.http.request.HttpMethod;
import org.apache.catalina.servlet.http.request.HttpRequest;
import org.apache.catalina.servlet.http.response.HttpResponse;

public abstract class HttpServlet implements Servlet {
public abstract class AbstractServlet implements Servlet {

@Override
public void service(HttpRequest request, HttpResponse response) throws IOException {
if (request.getMethod().equals("GET")) {
if (request.getMethod() == HttpMethod.GET) {
doGet(request, response);
return;
}
if (request.getMethod().equals("POST")) {
if (request.getMethod() == HttpMethod.POST) {
doPost(request, response);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,39 @@
package org.apache.catalina.servlets;
package org.apache.catalina.servlet;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.catalina.servlets.http.request.HttpRequest;
import org.apache.catalina.servlets.http.response.HttpResponse;
import org.apache.catalina.servlet.http.ContentType;
import org.apache.catalina.servlet.http.request.HttpRequest;
import org.apache.catalina.servlet.http.response.HttpResponse;

/**
* 정적 리소스를 관리하는 서블릿입니다.
*/
public class DefaultServlet implements Servlet {

private final Map<String, String> contentTypes = Map.of(
"html", "text/html;charset=utf-8",
"css", "text/css",
"js", "application/javascript"
);
private static DefaultServlet instance;

@Override
public void service(HttpRequest request, HttpResponse response) throws IOException {
public static DefaultServlet getInstance() {
if (instance == null) {
instance = new DefaultServlet();
}
return instance;
}

URL resource = getClass().getClassLoader().getResource("static" + request.getRequestURI());
private DefaultServlet() {}

@Override
public void service(HttpRequest request, HttpResponse response) {
URL resource = getClass().getClassLoader().getResource("static" + request.getRequestURI());
String fileContent = getFileContent(resource);
String resourceType = getResourceType(resource);
String contentType = contentTypes.getOrDefault(resourceType, "text/html;charset=utf-8");

response.setContentType(contentType);
ContentType contentType = ContentType.of(resourceType);
response.setContentType(contentType.getValue());
response.setContentLength(fileContent.getBytes().length);
response.setResponseBody(fileContent);
}
Expand Down
55 changes: 55 additions & 0 deletions tomcat/src/main/java/org/apache/catalina/servlet/LoginServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.apache.catalina.servlet;

import com.techcourse.controller.LoginController;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.stream.Collectors;
import org.apache.catalina.servlet.http.request.HttpRequest;
import org.apache.catalina.servlet.http.response.HttpResponse;

public class LoginServlet extends AbstractServlet {

private static LoginServlet instance;
private final LoginController loginController = new LoginController();

private LoginServlet() {
}

public static LoginServlet getInstance() {
if (instance == null) {
instance = new LoginServlet();
}
return instance;
}

@Override
public void doGet(HttpRequest request, HttpResponse response) {
loginController.getLoginPage(request, response);
URL resource = getClass().getClassLoader().getResource("static" + request.getRequestURI() + ".html");
String fileContent = getFileContent(resource);
response.setContentType("text/html");
response.setContentLength(fileContent.getBytes().length);
response.setResponseBody(fileContent);
}

private String getFileContent(URL resourceURL) {
if (resourceURL == null) {
return "";
}
File file = new File(resourceURL.getFile());
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String collect = reader.lines().collect(Collectors.joining("\n"));
return collect + "\n";
} catch (IOException e) {
return "Hello world!";
}
}

@Override
public void doPost(HttpRequest request, HttpResponse response) {
loginController.login(request, response);
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
package org.apache.catalina.servlets;
package org.apache.catalina.servlet;

import com.techcourse.db.InMemoryUserRepository;
import com.techcourse.model.User;
import com.techcourse.controller.RegisterController;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.stream.Collectors;
import org.apache.catalina.servlets.http.request.HttpRequest;
import org.apache.catalina.servlets.http.response.HttpResponse;
import org.apache.catalina.servlets.http.response.HttpStatus;
import org.apache.catalina.servlet.http.request.HttpRequest;
import org.apache.catalina.servlet.http.response.HttpResponse;

public class RegisterServlet extends HttpServlet {
public class RegisterServlet extends AbstractServlet {

private static RegisterServlet instance;
private final RegisterController registerController = new RegisterController();

private RegisterServlet() {
}

public static RegisterServlet getInstance() {
if (instance == null) {
instance = new RegisterServlet();
}
return instance;
}

@Override
public void doGet(HttpRequest request, HttpResponse response) throws IOException {
URL resource = getClass().getClassLoader().getResource("static" + request.getRequestURI() + ".html");
String registerPage = registerController.getRegisterPage();
URL resource = getClass().getClassLoader().getResource("static" + registerPage + ".html");
String fileContent = getFileContent(resource);

response.setContentType("text/html");
Expand All @@ -38,14 +50,8 @@ private String getFileContent(URL resourceURL) {
}

@Override
public void doPost(HttpRequest request, HttpResponse response) throws IOException {
String account = request.getParameter("account");
String email = request.getParameter("email");
String password = request.getParameter("password");
InMemoryUserRepository.save(new User(account, password, email));

public void doPost(HttpRequest request, HttpResponse response) {
registerController.register(request, response);
response.setContentType("text/html");
response.setStatus(HttpStatus.OK.getStatusCode());
response.sendRedirect("/index.html");
}
}
9 changes: 9 additions & 0 deletions tomcat/src/main/java/org/apache/catalina/servlet/Servlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.apache.catalina.servlet;

import java.io.IOException;
import org.apache.catalina.servlet.http.request.HttpRequest;
import org.apache.catalina.servlet.http.response.HttpResponse;

public interface Servlet {
void service(HttpRequest request, HttpResponse response) throws IOException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.apache.catalina.servlet.http;

import java.util.Arrays;

public enum ContentType {

HTML("text/html;charset=utf-8", "html"),
CSS("text/css", "css"),
JS("application/javascript", "js");

private final String value;
private final String resourceType;

ContentType(String value, String resourceType) {
this.value = value;
this.resourceType = resourceType;
}

public static ContentType of(String resourceType) {
return Arrays.stream(values())
.filter(contentType -> contentType.resourceType.equals(resourceType))
.findFirst()
.orElse(HTML);
}

public String getValue() {
return value;
}

public String getResourceType() {
return resourceType;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.apache.catalina.servlets.http;
package org.apache.catalina.servlet.http;

public class Cookie {

Expand Down
Loading