-
Notifications
You must be signed in to change notification settings - Fork 309
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[톰캣 구현하기 1, 2단계] 쥬니(전정준) 미션 제출합니다. (#349)
* test: IOStreamTest 구현 * test: FileTest 구현 * docs: 1단계 기능 요구 사항 작성 * feat: index.html 반환 기능 구현 * feat: css, js 대응 기능 구현 * feat: Query String 파싱 기능 및 로그인 구현 * docs: 2단계 기능 요구 사항 작성 * feat: 로그인 여부에 따른 리다이렉트 기능 구현 * refactor: Http 관련 클래스 구현 * feat: 회원 가입 기능 구현 * feat: Cookie 기능 구현 * feat: Session 기능 구현 * refactor: 메서드 분리 및 순서 변경 * refactor: 중복 메서드 제거 * test: 테스트 실패 수정
- Loading branch information
Showing
29 changed files
with
1,105 additions
and
117 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,54 +1,58 @@ | ||
package study; | ||
|
||
import org.junit.jupiter.api.DisplayName; | ||
import org.junit.jupiter.api.Test; | ||
import static org.assertj.core.api.Assertions.assertThat; | ||
|
||
import java.io.IOException; | ||
import java.net.URL; | ||
import java.nio.charset.StandardCharsets; | ||
import java.nio.file.Files; | ||
import java.nio.file.Path; | ||
import java.util.Collections; | ||
import java.util.List; | ||
|
||
import static org.assertj.core.api.Assertions.assertThat; | ||
import org.junit.jupiter.api.DisplayName; | ||
import org.junit.jupiter.api.Test; | ||
|
||
/** | ||
* 웹서버는 사용자가 요청한 html 파일을 제공 할 수 있어야 한다. | ||
* File 클래스를 사용해서 파일을 읽어오고, 사용자에게 전달한다. | ||
* 웹서버는 사용자가 요청한 html 파일을 제공 할 수 있어야 한다. File 클래스를 사용해서 파일을 읽어오고, 사용자에게 전달한다. | ||
*/ | ||
@DisplayName("File 클래스 학습 테스트") | ||
class FileTest { | ||
|
||
/** | ||
* resource 디렉터리 경로 찾기 | ||
* | ||
* File 객체를 생성하려면 파일의 경로를 알아야 한다. | ||
* 자바 애플리케이션은 resource 디렉터리에 HTML, CSS 같은 정적 파일을 저장한다. | ||
* resource 디렉터리의 경로는 어떻게 알아낼 수 있을까? | ||
* <p> | ||
* File 객체를 생성하려면 파일의 경로를 알아야 한다. 자바 애플리케이션은 resource 디렉터리에 HTML, CSS 같은 정적 파일을 저장한다. resource 디렉터리의 경로는 어떻게 알아낼 수 | ||
* 있을까? | ||
*/ | ||
@Test | ||
void resource_디렉터리에_있는_파일의_경로를_찾는다() { | ||
final String fileName = "nextstep.txt"; | ||
|
||
ClassLoader classLoader = getClass().getClassLoader(); | ||
URL url = classLoader.getResource(fileName); | ||
|
||
// todo | ||
final String actual = ""; | ||
final String actual = url.getPath(); | ||
|
||
assertThat(actual).endsWith(fileName); | ||
} | ||
|
||
/** | ||
* 파일 내용 읽기 | ||
* | ||
* 읽어온 파일의 내용을 I/O Stream을 사용해서 사용자에게 전달 해야 한다. | ||
* File, Files 클래스를 사용하여 파일의 내용을 읽어보자. | ||
* <p> | ||
* 읽어온 파일의 내용을 I/O Stream을 사용해서 사용자에게 전달 해야 한다. File, Files 클래스를 사용하여 파일의 내용을 읽어보자. | ||
*/ | ||
@Test | ||
void 파일의_내용을_읽는다() { | ||
void 파일의_내용을_읽는다() throws IOException { | ||
final String fileName = "nextstep.txt"; | ||
URL url = getClass().getClassLoader().getResource(fileName); | ||
|
||
// todo | ||
final Path path = null; | ||
final Path path = Path.of(url.getPath()); | ||
|
||
// todo | ||
final List<String> actual = Collections.emptyList(); | ||
final List<String> actual = Files.readAllLines(path, StandardCharsets.UTF_8); | ||
|
||
assertThat(actual).containsOnly("nextstep"); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
## 1단계 - HTTP 서버 구현하기 | ||
|
||
- [X] GET /index.html 요청이 들어오면, index.html을 반환한다. | ||
### Request | ||
```http request | ||
GET /index.html HTTP/1.1 | ||
Host: localhost:8080 | ||
Connection: keep-alive | ||
Accept: */* | ||
``` | ||
|
||
- [X] GET /index.html 요청이 들어오면, 관련된 js, css 파일도 반환한다. | ||
### Request | ||
```http request | ||
GET /css/styles.css HTTP/1.1 | ||
Host: localhost:8080 | ||
Accept: text/css,*/*;q=0.1 | ||
Connection: keep-alive | ||
``` | ||
|
||
- [X] Query String을 파싱한다. | ||
- [X] Login Page를 반환한다. | ||
- [X] 로그인이 가능(아이디, 비밀번호 일치)하면, 콘솔 로그에 회원 정보를 출력한다. | ||
|
||
## 2단계 - 로그인 구현하기 | ||
|
||
- [X] 로그인 여부에 따라 다른 페이지로 리다이렉트 한다. | ||
- [X] 로그인에 성공하면, 302 status code와 함께 /index.html로 리다이렉트 한다. | ||
- [X] 로그인에 실패하면, 302 status code와 함께 /401.html로 리다이렉트 한다. | ||
|
||
- [X] 회원가입 | ||
- [X] GET /register 요청이 들어오면, register.html을 반환한다. | ||
- [X] 회원가입 버튼을 누르면 POST 요청을 보낸다. | ||
- [X] 회원가입이 완료되면, index.html로 리다이렉트 한다. | ||
|
||
- [X] Cookie에 JSESSIONID 값 저장하기 | ||
- [X] 요청 헤더에 JSESSIONID가 없을 경우, 응답 헤더에 Set-Cookie를 추가한다. | ||
|
||
- [X] Session 구현하기 | ||
- [X] 쿠키에서 전달받은 JSESSIONID 값으로 로그인 여부를 체크한다. | ||
- [X] 로그인에 성공하면, SESSION 객체의 값으로 USER를 저장한다. | ||
- [X] 로그인 된 상태에서 /login 페이지에 GET 요청을 보낼 경우, /index.html로 리다이렉트 한다. |
Oops, something went wrong.