분류 전체보기
-
ThreadLocal 과 SpringSecuritySpring/Spring 2020. 8. 9. 14:54
ThreadLocal Java.lang 패키지에서 제공하는 스레드 범위 변수이다. 스레드 수준의 데이터 저장소로써 같은 스레드 내에서만 공유한다. 따라서 같은 스레드라면 해당 데이터를 메서드 매개변수로 넘겨줄 필요가 없게 된다. 클래스에서 한 변수를 선언한다면 해당 변수의 scope은 해당 클래스가 될 것이다 메서드 안의 변수의 scope은 해당 메서드가 될 것이다. ThreadLocal에서 변수의 scope은 Thread가 되며 한 스레드 내에서 변수를 공유한다. 요청이 한 쓰레드내에서 사용된다면 파라미터로 전달하지 않아도 된다. 1. 가져온 유저의 정보를 ThreadLocal을 통해 setAccount에 저장해보자. 2. SpringSecurityContextHolder에는 Authentication..
-
AuthenticationManager와 AuthenticationSpring/Spring 2020. 8. 9. 03:05
SecurityContextHolder는 Authentication을 담고 있는 곳이며 실제 Authentication을 만들고 인증을 처리하는 인터페이스는 AuthenticationManager이다. AuthenticationManager는 authenticate라는 메서드만을 가지며 여기서 authentication은 유저가 입력한 username, password 등의 인증정보를 담고 있다. 유효한지 확인 후 UserDetailsService가 return 한 객체를 Principal로 담고 있는 Authentication 객체를 return 해준다. 실제 이러한 인증의 구현체로 ProviderManager을 사용하게 된다. ProviderManager에 Debug을 걸어서 어떠한 과정으로 인증이 ..
-
Spring Boot mockMvc 한글 깨짐 처리Spring/Spring Boot 2020. 7. 31. 15:58
SpringBoot + SpringSecurity ( JWT ) 기반으로 REST 기반의 API 서버를 만드는 도중 API 문서 자동화를 위해 RestDocs를 쓰기로 결정했다. 그 외 후보로 Swagger등도 있겠지만 테스트 작성과 더불어 문서를 만들 수 있다는 점에서 RestDocs로 결정하였다. 문제는 mockMvc Test를 기반으로 문서 조각을 만들 때 Response 응답으로의 한글 처리가 깨져있다는 점이었다. 1 2 3 4 5 6 7 8 9 10 11 12 13 @Bean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter characterEncodingFilter = new CharacterEn..
-
SpringSecurityContextHolder와 AuthenticationSpring/Spring 2020. 7. 23. 16:36
SecurityContextHolder -> SecurityContext -> Authentication Authentication안에 Principal 정보가 들어가 있다. principal은 인증한 사용자의 정보를 나타낸다. 인증한 사용자의 정보란? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Service public class AccountService implements UserDetailsService { @Autowired AccountRepository accountRepository; @Autowired PasswordEncoder passwordEncoder; @Override public UserDetails loadUserByUsern..
-
RestTemplate, WebClientSpring/Spring Boot 2020. 7. 13. 01:56
스프링 부트는 Rest Template을 쉽게 사용할 수 있도록 빈을 등록해준다. 이때 빈은 RestTemplateBuilder를 빈으로 등록해 준다. Builder를 주입받아서 필요시마다 Build를 하고 RestClient를 생성해서 사용할 수 있다. WebClient는 WebClient.Builder를 빈으로 등록해준다. RestTemplate과 WebClient의 차이? RestTemplate Blocking I/O 기반의 Synchronous API 순서가 있는 처리 WebClient Non-Blocking I/O 기반의 Asynchronous API 순서 없는 처리 다음과 같이 "/hello" URI는 5초를 쉬고 "/world" URI는 3초를 쉬는 핸들러를 만들어보자. 그리고 이 API 서..
-
JSR-303 Errors들을 Json으로 Serialization 해보자Spring/Spring Boot 2020. 6. 25. 02:22
JSR-303 bean validation이 끝나게 되면 Errors에 error들이 담기게 된다. 기본적인 도메인들은 자바 빈 스펙을 따르기 때문에 BeanSerializer에 의해서 Serialization/Deserialization 이 가능하다. ( 스프링의 경우 ObjectMapper 이용 ) 하지만 Errors들은 불가능하다. 다음의 예를 봐보자. 해당 Person에 name과 age가 담기지 않았다면 errors가 담기게 될 것이다. 해당 errors들을 클라이언트들을 위해 Json 형태로 담고 싶다면 @JsonComponent와 JsonSerializer에 serialize 메서드를 오버 라이딩해서 구현 가능하다. 그렇다면 우선 person에 name과 age를 입력하지 않고 보내서 err..
-
스프링 부트 MySQL8 연동 IntellijSpring/Spring Boot 2020. 6. 23. 03:01
1. MySQL 커넥터 의존성을 추가한다. MySQL에 접속할 수 있는 커넥터 의존성을 추가해야 한다. datasource에 구현체이다. 1 2 3 4 5 mysql mysql-connector-java runtime Colored by Color Scripter cs Maven 기반 1 2 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compile 'mysql:mysql-connector-java' Colored by Color Scripter cs Gradle 기반 2. application.properties 설정 파일에 다음과 같이 DataSource를 설정해준다. 1 2 3 4 5 spring.datasource...
-
RedirectAttributesSpring/Spring MVC 2020. 6. 22. 01:54
일반적으로 redirect 할 때 어떤 데이터를 모델에 넣는다면 모델에 들어있는 데이터 중 primitive 타입은 자동으로 URI path에 쿼리 파라미터로 추가가 되게 된다. 예를 들어 hello에 Id가 1이고 Name이 Baek이라면 return 값은 "redirect:/hello/list? id=1&name=Baek" 이 되게 되지만 이러한 설정은 스프링 부트에서는 기본적으로 꺼져있다. 다음과 같이 설정을 해주게 되면 이제 모델에 들어있던 primitive 타입들이 자동으로 쿼리 파라미터로 붙게 된다. 이렇게 되면 redirect 되는 주소 쪽에서 @RequestParam, @ModelAttribute 를 통해 해당 값들을 받을 수가 있다. 이때 모델에 들어있는 모든 데이터가 아닌 일부만 명시적..