Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
b243445
feat: add convertor to read string easily
geoje Sep 3, 2024
a731539
feat: add static resource reader
geoje Sep 3, 2024
ee08db9
feat: use static resource reader on http processor
geoje Sep 3, 2024
01a069f
feat: add client request class
geoje Sep 3, 2024
b44fef3
feat: able to answer for root path with servlet
geoje Sep 3, 2024
07b0ec8
feat: able to answer for index.html but occur connection closed somet…
geoje Sep 3, 2024
b6be233
fix: read stream correctly until fitting http message
geoje Sep 3, 2024
cac052c
refactor: rename http 1.1 classes
geoje Sep 3, 2024
cf1baa0
refactor: revoke index.html origin with crlf
geoje Sep 3, 2024
320f1b4
feat: able to access login page and split parameters with decoding url
geoje Sep 3, 2024
2d90450
feat: add http 1.1 servlet response with builder
geoje Sep 4, 2024
dc668a1
feat: add converting to byte array method
geoje Sep 4, 2024
2531c6a
refactor: rename http request and response
geoje Sep 4, 2024
8ecae03
feat: apply http 1.1 response on processor
geoje Sep 4, 2024
088008c
feat: predicate request servlet on processing
geoje Sep 4, 2024
2165a00
feat: login with account and password
geoje Sep 4, 2024
e2d9514
feat: view register page
geoje Sep 4, 2024
c6266e5
feat: process register
geoje Sep 4, 2024
19b3bc8
feat: extract headers on request and response
geoje Sep 4, 2024
4041b65
feat: use session to login automatically
geoje Sep 4, 2024
6e79702
refactor: change session repository to session manager
geoje Sep 4, 2024
3c71906
refactor: rename request and response to general
geoje Sep 4, 2024
fa763c6
refactor: add controller interface and map all request with it
geoje Sep 4, 2024
b104eb1
fix: remove setCookie on response when empty
geoje Sep 5, 2024
d2f9c1c
test: add reading page tests
geoje Sep 5, 2024
df95aa9
test: add login and register tests
geoje Sep 5, 2024
316ea04
Merge remote-tracking branch 'upstream/main' into step1
geoje Sep 6, 2024
d16797b
test: solve study of file class
geoje Sep 6, 2024
c45c34a
test: solve study of io stream class
geoje Sep 6, 2024
a8f6c7a
feat: set SessionManager as singleton
geoje Sep 6, 2024
1b532f3
feat: add thymeleaf dependencies
geoje Sep 6, 2024
e15dc7b
test: solve study of http cache
geoje Sep 6, 2024
064b479
refactor: simplify checking incomplete headers received
geoje Sep 8, 2024
f2aa8d0
refactor: change log message for login with session
geoje Sep 8, 2024
68c4be7
refactor: extract CRLF to constant value
geoje Sep 8, 2024
c063895
refactor: extract reading functions on http reader
geoje Sep 8, 2024
3971630
refactor: rearrange parsing order
geoje Sep 8, 2024
accfb41
fix: use session manager as singleton
geoje Sep 8, 2024
79ba4ca
refactor: remove duplication finding session
geoje Sep 8, 2024
e117025
refactor: delegate checking attribute to http request
geoje Sep 8, 2024
26f1505
refactor: use defined method to set content type
geoje Sep 8, 2024
d3281a1
refactor: use stream when get controller
geoje Sep 8, 2024
f91dcee
refactor: use request mapping as static
geoje Sep 8, 2024
d222e3c
refactor: delegate getting session to session manager
geoje Sep 8, 2024
cb34c02
refactor: extract methods and simplify doGet on login
geoje Sep 8, 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
1 change: 1 addition & 0 deletions study/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ repositories {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.apache.commons:commons-lang3:3.14.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1'
implementation 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.4.1'
Expand Down
10 changes: 8 additions & 2 deletions study/src/main/java/cache/com/example/GreetingController.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package cache.com.example;

import cache.com.example.version.ResourceVersion;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.CacheControl;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import jakarta.servlet.http.HttpServletResponse;

@Controller
public class GreetingController {

private final ResourceVersion version;

public GreetingController(ResourceVersion version) {
this.version = version;
}

@GetMapping("/")
public String index() {
return "index";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package cache.com.example.cachecontrol;

import com.google.common.net.HttpHeaders;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.HandlerInterceptor;

public class CacheHandlerInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
CacheControl cacheControl = CacheControl.noCache().cachePrivate();
response.addHeader(HttpHeaders.CACHE_CONTROL, cacheControl.getHeaderValue());

return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package cache.com.example.cachecontrol;

import com.google.common.net.HttpHeaders;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.time.Duration;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

Expand All @@ -9,5 +15,14 @@ public class CacheWebConfig implements WebMvcConfigurer {

@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(new CacheHandlerInterceptor()).addPathPatterns("/");
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
CacheControl cacheControl = CacheControl.maxAge(Duration.ofDays(365)).cachePublic();
response.addHeader(HttpHeaders.CACHE_CONTROL, cacheControl.getHeaderValue());
return true;
}
}).addPathPatterns("/resources/**");
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package cache.com.example.etag;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.ShallowEtagHeaderFilter;

@Configuration
public class EtagFilterConfiguration {

// @Bean
// public FilterRegistrationBean<ShallowEtagHeaderFilter> shallowEtagHeaderFilter() {
// return null;
// }
@Bean
public FilterRegistrationBean<ShallowEtagHeaderFilter> shallowEtagHeaderFilter() {
return new FilterRegistrationBean<>(new ShallowEtagHeaderFilter());
}
}
3 changes: 3 additions & 0 deletions study/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ server:
threads:
min-spare: 2
max: 2
compression:
enabled: true
min-response-size: 10
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package cache.com.example;

import static cache.com.example.version.CacheBustingWebConfig.PREFIX_STATIC_RESOURCES;

import cache.com.example.version.ResourceVersion;
import java.time.Duration;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -10,10 +13,6 @@
import org.springframework.http.HttpHeaders;
import org.springframework.test.web.reactive.server.WebTestClient;

import java.time.Duration;

import static cache.com.example.version.CacheBustingWebConfig.PREFIX_STATIC_RESOURCES;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class GreetingControllerTest {

Expand Down Expand Up @@ -68,10 +67,8 @@ void testETag() {
}

/**
* http://localhost:8080/resource-versioning
* 위 url의 html 파일에서 사용하는 js, css와 같은 정적 파일에 캐싱을 적용한다.
* 보통 정적 파일을 캐싱 무효화하기 위해 캐싱과 함께 버전을 적용시킨다.
* 정적 파일에 변경 사항이 생기면 배포할 때 버전을 바꿔주면 적용된 캐싱을 무효화(Caching Busting)할 수 있다.
* http://localhost:8080/resource-versioning 위 url의 html 파일에서 사용하는 js, css와 같은 정적 파일에 캐싱을 적용한다. 보통 정적 파일을 캐싱 무효화하기
* 위해 캐싱과 함께 버전을 적용시킨다. 정적 파일에 변경 사항이 생기면 배포할 때 버전을 바꿔주면 적용된 캐싱을 무효화(Caching Busting)할 수 있다.
*/
@Test
void testCacheBustingOfStaticResources() {
Expand Down
43 changes: 23 additions & 20 deletions study/src/test/java/study/FileTest.java
Original file line number Diff line number Diff line change
@@ -1,53 +1,56 @@
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.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.nio.file.Paths;
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_디렉터리에_있는_파일의_경로를_찾는다() {
void resource_디렉터리에_있는_파일의_경로를_찾는다() throws IOException {
final String fileName = "nextstep.txt";

// todo
final String actual = "";
URL url = getClass().getClassLoader().getResource(fileName);
assertThat(url).isNotNull();
final String actual = url.toString();

assertThat(actual).endsWith(fileName);
}

/**
* 파일 내용 읽기
*
* 읽어온 파일의 내용을 I/O Stream을 사용해서 사용자에게 전달 해야 한다.
* File, Files 클래스를 사용하여 파일의 내용을 읽어보자.
* <p>
* 읽어온 파일의 내용을 I/O Stream을 사용해서 사용자에게 전달 해야 한다. File, Files 클래스를 사용하여 파일의 내용을 읽어보자.
*/
@Test
void 파일의_내용을_읽는다() {
void 파일의_내용을_읽는다() throws URISyntaxException, IOException {
final String fileName = "nextstep.txt";

// todo
final Path path = null;
URL url = getClass().getClassLoader().getResource(fileName);
assertThat(url).isNotNull();
final Path path = Paths.get(url.toURI());

// todo
final List<String> actual = Collections.emptyList();
final List<String> actual = Files.readAllLines(path);

assertThat(actual).containsOnly("nextstep");
}
Expand Down
Loading