Skip to content

Commit 33d6320

Browse files
authored
[톰캣 구현하기 - 1,2단계] 베로(김은솔) 미션 제출합니다. (#325)
* test: 학습 테스트 완료 * feat: index.html 응답하도록 수정 * feat: CSS, js 파일을 지원하도록 수정 * feat: 로그인 시 user 정보 logging 기능 추가 * feat: 로그인 결과에 따라 적절한 페이지로 리다이렉트 하도록 추가 * feat: 회원가입 기능 추가 * feat: 쿠키에 JSESSIONID 값 저장하는 기능 추가 * feat: 유효한 Session이 존재하면 index.html 로 리다이렉트하는 기능 추가 * test: 통합 테스트 추가 * fix: 헤더 알파벳 순 정렬 추가 * refactor: optional 값 변수로 추출 * refactor: stream 에 try-with-resources 적용 * fix: 로깅 삭제 * refactor: 생성자 접근 제어자 변경 * refactor: 불필요한 출력문 삭제 * refactor: 쿠키 파싱 로직 리팩터링 * refactor: static 클래스 private 생성자 추가 * refactor: EnumMap 으로 변경 * refactor: 변수 이름 변경 * refactor: assertAll 로 감싸도록 변경 * refactor: HttpMethod가 같은지 확인하는 메서드 추가 * refactor: 사용하지 않는 생성자 삭제 * refactor: 생성자 접근 제어자를 private 으로 변경 * refactor: 세션 검증 메서드 추가 * refactor: HttpRequest 생성 책임 분리 * refactor: 빈 favicon 파일 추가 * refactor: 메서드 이름 변경 * refactor: 어색하지 않은 변수 이름으로 변경 * refactor: 메서드 이름 오타 수정
1 parent 68db530 commit 33d6320

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1625
-211
lines changed
Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package cache.com.example;
22

3+
import static cache.com.example.version.CacheBustingWebConfig.PREFIX_STATIC_RESOURCES;
4+
35
import cache.com.example.version.ResourceVersion;
6+
import java.time.Duration;
47
import org.junit.jupiter.api.Test;
58
import org.slf4j.Logger;
69
import org.slf4j.LoggerFactory;
@@ -10,10 +13,6 @@
1013
import org.springframework.http.HttpHeaders;
1114
import org.springframework.test.web.reactive.server.WebTestClient;
1215

13-
import java.time.Duration;
14-
15-
import static cache.com.example.version.CacheBustingWebConfig.PREFIX_STATIC_RESOURCES;
16-
1716
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
1817
class GreetingControllerTest {
1918

@@ -28,75 +27,77 @@ class GreetingControllerTest {
2827
@Test
2928
void testNoCachePrivate() {
3029
final var response = webTestClient
31-
.get()
32-
.uri("/")
33-
.exchange()
34-
.expectStatus().isOk()
35-
.expectHeader().cacheControl(CacheControl.noCache().cachePrivate())
36-
.expectBody(String.class).returnResult();
30+
.get()
31+
.uri("/")
32+
.exchange()
33+
.expectStatus().isOk()
34+
.expectHeader().cacheControl(CacheControl.noCache().cachePrivate())
35+
.expectBody(String.class).returnResult();
3736

3837
log.info("response body\n{}", response.getResponseBody());
3938
}
4039

4140
@Test
4241
void testCompression() {
4342
final var response = webTestClient
44-
.get()
45-
.uri("/")
46-
.exchange()
47-
.expectStatus().isOk()
43+
.get()
44+
.uri("/")
45+
.exchange()
46+
.expectStatus().isOk()
4847

49-
// gzip으로 요청 보내도 어떤 방식으로 압축할지 서버에서 결정한다.
50-
// 웹브라우저에서 localhost:8080으로 접근하면 응답 헤더에 "Content-Encoding: gzip"이 있다.
51-
.expectHeader().valueEquals(HttpHeaders.TRANSFER_ENCODING, "chunked")
52-
.expectBody(String.class).returnResult();
48+
// gzip으로 요청 보내도 어떤 방식으로 압축할지 서버에서 결정한다.
49+
// 웹브라우저에서 localhost:8080으로 접근하면 응답 헤더에 "Content-Encoding: gzip"이 있다.
50+
.expectHeader().valueEquals(HttpHeaders.TRANSFER_ENCODING, "chunked")
51+
.expectBody(String.class).returnResult();
5352

5453
log.info("response body\n{}", response.getResponseBody());
5554
}
5655

5756
@Test
5857
void testETag() {
5958
final var response = webTestClient
60-
.get()
61-
.uri("/etag")
62-
.exchange()
63-
.expectStatus().isOk()
64-
.expectHeader().exists(HttpHeaders.ETAG)
65-
.expectBody(String.class).returnResult();
66-
59+
.get()
60+
.uri("/etag")
61+
.exchange()
62+
.expectStatus().isOk()
63+
.expectHeader().exists(HttpHeaders.ETAG)
64+
.expectBody(String.class).returnResult();
65+
log.info("response header\n{}", response.getResponseHeaders());
6766
log.info("response body\n{}", response.getResponseBody());
6867
}
6968

7069
/**
7170
* http://localhost:8080/resource-versioning
72-
* 위 url의 html 파일에서 사용하는 js, css와 같은 정적 파일에 캐싱을 적용한다.
73-
* 보통 정적 파일을 캐싱 무효화하기 위해 캐싱과 함께 버전을 적용시킨다.
71+
* 위 url의 html 파일에서 사용하는 js, css와 같은 정적 파일에 캐싱을 적용한다. 보통 정적 파일을 캐싱 무효화하기 위해 캐싱과 함께 버전을 적용시킨다.
7472
* 정적 파일에 변경 사항이 생기면 배포할 때 버전을 바꿔주면 적용된 캐싱을 무효화(Caching Busting)할 수 있다.
7573
*/
7674
@Test
7775
void testCacheBustingOfStaticResources() {
7876
final var uri = String.format("%s/%s/js/index.js", PREFIX_STATIC_RESOURCES, version.getVersion());
7977

78+
System.out.println(uri);
79+
8080
// "/resource-versioning/js/index.js" 경로의 정적 파일에 ETag를 사용한 캐싱이 적용되었는지 확인한다.
8181
final var response = webTestClient
82-
.get()
83-
.uri(uri)
84-
.exchange()
85-
.expectStatus().isOk()
86-
.expectHeader().exists(HttpHeaders.ETAG)
87-
.expectHeader().cacheControl(CacheControl.maxAge(Duration.ofDays(365)).cachePublic())
88-
.expectBody(String.class).returnResult();
89-
82+
.get()
83+
.uri(uri)
84+
.exchange()
85+
.expectStatus().isOk()
86+
.expectHeader().exists(HttpHeaders.ETAG)
87+
.expectHeader().cacheControl(CacheControl.maxAge(Duration.ofDays(365)).cachePublic())
88+
.expectBody(String.class).returnResult();
89+
90+
log.info("response header\n{}", response.getResponseHeaders());
9091
log.info("response body\n{}", response.getResponseBody());
9192

9293
final var etag = response.getResponseHeaders().getETag();
9394

9495
// 캐싱되었다면 "/resource-versioning/js/index.js"로 다시 호출했을때 HTTP status는 304를 반환한다.
9596
webTestClient.get()
96-
.uri(uri)
97-
.header(HttpHeaders.IF_NONE_MATCH, etag)
98-
.exchange()
99-
.expectStatus()
100-
.isNotModified();
97+
.uri(uri)
98+
.header(HttpHeaders.IF_NONE_MATCH, etag)
99+
.exchange()
100+
.expectStatus()
101+
.isNotModified();
101102
}
102103
}

study/src/test/java/study/FileTest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package study;
22

3+
import java.io.FileNotFoundException;
4+
import java.io.IOException;
5+
import java.nio.file.Files;
36
import org.junit.jupiter.api.DisplayName;
47
import org.junit.jupiter.api.Test;
58

69
import java.nio.file.Path;
710
import java.util.Collections;
811
import java.util.List;
12+
import org.springframework.util.ResourceUtils;
913

1014
import static org.assertj.core.api.Assertions.assertThat;
1115

@@ -24,11 +28,10 @@ class FileTest {
2428
* resource 디렉터리의 경로는 어떻게 알아낼 수 있을까?
2529
*/
2630
@Test
27-
void resource_디렉터리에_있는_파일의_경로를_찾는다() {
31+
void resource_디렉터리에_있는_파일의_경로를_찾는다() throws IOException {
2832
final String fileName = "nextstep.txt";
2933

30-
// todo
31-
final String actual = "";
34+
final String actual = ResourceUtils.getURL("classpath:" + fileName).getPath();
3235

3336
assertThat(actual).endsWith(fileName);
3437
}
@@ -40,14 +43,12 @@ class FileTest {
4043
* File, Files 클래스를 사용하여 파일의 내용을 읽어보자.
4144
*/
4245
@Test
43-
void 파일의_내용을_읽는다() {
46+
void 파일의_내용을_읽는다() throws IOException {
4447
final String fileName = "nextstep.txt";
4548

46-
// todo
47-
final Path path = null;
49+
final Path path = ResourceUtils.getFile("classpath:" + fileName).toPath();
4850

49-
// todo
50-
final List<String> actual = Collections.emptyList();
51+
final List<String> actual = Files.readAllLines(path);
5152

5253
assertThat(actual).containsOnly("nextstep");
5354
}

0 commit comments

Comments
 (0)