목록Java (based by Spring Boot 2) (23)
Real Vectorism. 훨씬 더 입체적으로...
실행/디버그 구성에서1. npm 스크립트 실행 [build]2. 프로젝트 빌드 하면 인텔리제이에서 Spring Boot 또는 Spring Webflux 프로젝트를 실행할 때 마다 Svelte 프로젝트를 새로 빌드하게 됨. 굳이 터미널에서 npm run build 를 입력할 필요는 없으나 매 Spring 서버 실행마다 변경점이 없어도 빌드를 하게 된다는 단점이 있음.
스프링 부트 기반의 SSL 적용이 웹플럭스에서는 잘 먹히지 않는 체감이 들었다.도대체 무슨 문제가 있어서 그렇게 된 것인가. 찾아본 결과 아무래도 스프링 부트의 설정대로만 하는것은 아무래도 임베디드 톰캣을 기반으로 적용되는 설정이었던 모양이다. 확실한 것은 아닌데 웹플럭스의 기본 컨테이너인 Netty 를 위해서는 별도의 설정이 필요한 듯 하다. // 원래 Tab 키로 들여쓰기하는데 블로그에서 쓰면 묘하게 Tab 하나가 너무 길어서 스페이스로 전환함@Componentpublic class CustomWebServerFactorySslCustomizer implements WebServerFactoryCustomizer { @Value("${server.port}") private Integer port;..
뭔가가 계속 Deprecated 되었다고 해서 아예 그냥 복붙해서 쓰는 용도로 정리해버림 @Component public class JwtUtil { @Value("${jjwt.issuer}") private String issuer; @Value("${jjwt.secret}") private String secret; @Value("${jjwt.expiration}") private String expiration; private SecretKey secretKey; @PostConstruct public void init() { this.secretKey = Keys.hmacShaKeyFor(this.secret.getBytes()); } public Claims getAllClaimsFromToke..
예시 소스코드 @EnableWebFluxSecurity @EnableReactiveMethodSecurity public class WebSecurityConfig { private final AuthenticationManager authenticationManager; private final SecurityContextRepository securityContextRepository; public webSecurityConfig(AuthenticationManager authenticationManager, SecurityContextRepository securityContextRepository) { this.authenticationManager = authenticationManager; t..
나만 몰랐던 람다식 나만 몰랐던 람다식 자바1.8 에서 도입되었지만 아직도 현업에서는 못믿겠다 기술적 이슈가 있다면서 안쓰... blog.naver.com (동일내용입니다.) 나만 몰랐던 람다식 자바1.8 에서 도입되었지만 아직도 현업에서는 못믿겠다 기술적 이슈가 있다면서 안쓰는 람다식... 가장 먼저, stream api 를 사용하게 될 때 마주하기 쉬운 람다식은 stream api 에서 제공되는 map, flatMap, reduce, filter, collect, count 등이 있지만 그 안에서 구현해야 하는 람다식들은 다음과 같다. 람다식 구현해야 할 인터페이스 map Function flatMap Function reduce BinaryOperator filter Predicate colle..
이전에는 @EnableWebflux 어노테이션이 모든 리소스 요청을 application/json 으로 리턴을 시켜주는 문제로 인해 index 페이지를 받을 수 없는 문제를 확인했었다. 결론부터 먼저 말하자면 @EnableWebflux 를 사용하는 상태 그대로 index 페이지를 보여줄 수 있는 방법이 있다. 별도의 처리가 필요한 것이 아니라 MVC처럼 리소스의 경로를 라우터에 컨트롤러처럼 정의하는 방식이다. 그러니까... 난 또 삽질하고 있었던 것이다. @EnableWebflux 를 사용한 상태에서 어노테이션을 삭제하지 않고 처리하는 방법이다. index 페이지를 보여주도록 정의한 라우터에 추가적으로 다음과 같이 작성한다. @Bean public RouterFunction resource() { ret..
Spring Webflux 기반으로 index.html 파일이 보여지도록 작업을 했다. 그 결과로 작성한 index.html 이 / 루트를 통해 라우팅되는 것을 확인을 분명히 했었다. 그런데 어느날부터 계속 index.html 이 뜨지 않게 되었다. 증상은 이러했다. 서버는 정상적으로 띄워진다 라우터 클래스에 작성한 라우팅 함수에 문제는 없다. 즉, 빌드 과정에서 문제가 없다. 크롬에서 url 접근을 시도했을 때 아무런 데이터도 먹히지 않는 html로 시작해서 html로 끝나는 페이지가 나온다. 라우팅 클래스의 문제인지 핸들러 함수에 로그를 찍고 콘솔에 로그가 찍히는지를 확인했다. 정상적으로 로그가 출력된다. 크롬의 개발자도구를 들어가서 확인을 해본 결과, 페이지는 물론이고 css까지 전부 applica..
최대한 간단하게. 단, 정석이라고는 안함. 즉, 책임 안짐 1. properties 정의 spring.r2dbc.url=r2dbc:mariadb://{domain}:{port}/{databases} spring.r2dbc.username={database username} spring.r2dbc.password={database password} mariadb 사용 기준으로 저렇게 작성한다. 평소 사용하는 jdbc와는 달리 driverClassName 을 정의하지 않는데 이래도 되는지는 모르겠다. 프로토콜은 jdbc:mariadb:// 가 아닌 r2dbc:mariadb:// 로 지정해줘야 한다. 2. repository 인터페이스 정의 public interface SampleUserRepository ..
개뻘짓의 결과로 끝내 깨달음을 얻었다... 아무리 스프링 웹플럭스가 반응형으로 데이터를 교환하기 위해 기존의 서블릿이나 mvc과 아예 다른 밑바닥부터 설계가 다른 프레임워크가 되었다고 하더라도 최소한 보여져야 할 웹페이지가 1개가 있는 경우에는 index.html 파일을 구성할 수가 있어야 한다. 커스터마이징을 밥먹듯이 하는 병이 있는 경우에는 필자와 같은 개뻘짓에 굉장히 많이 당황스러울 수도 있다. 일단, src/main/resources 경로 내부에 index.html와 그 구성파일들을 넣을 수는 있다. 이 때 /public /static /resources /META-INF/resources 반드시 경로명을 저 중 하나로 결정을 해야한다. @EnableWebFlux 어노테이션이 붙는 순간 커스터마이..
원본 및 레퍼런스: https://lts0606.tistory.com/category/Spring%20Webflux 'Spring Webflux' 카테고리의 글 목록 Hello world! lts0606.tistory.com 1. 먼저 메이븐에 WebFlux 계열 추가 org.springframework.boot spring-boot-starter-webflux 2. 회원정보로 사용할 클래스정보 신규추가 class SeumUserDetails { private Integer idx; private String username; private String password; // 이하 getter, setter, toString // 개인적으로, 롬복 진짜 시름. 절대로 안씀 // 람다식에서 메소드체이닝으로..
웹플럭스 버전 2.5.2 어지간한 검색결과에서 나오는 실시간 방출대응으로 검색되는게 거의 EmitterProcessor 인데 이거 Deprecated 걸렸다... Sinks.Many로 교체하라는데 소스코드가 거의 EmitterProcessor 를 사용하는 소스코드에서 호환될 기미가 안보인다. 검색으로도 안나온다... EmitterProcessor.sink() 도 Deprecated 걸린건 매한가지라 소스코드가 사실상 검색으로 나올만한 예제가 없다...
Mono와 Flux가 1개와 N개인거? 1번과 N번인거?
아직 웹플럭스는 포기하지 않았다. 그런데 ReactiveUserDetailsService 를 구현하다가 문득 생각이 들었다. 혹시나 Mono findByUsername(String username) 메소드를 작성하는 과정이 무슨 차이가 있을까 public Mono findByUsername(String username) { return Mono .just(username) .map(item -> (UserDetails) seumUserRepository.findOne(Example.of(new SeumUserDetails(item)))) .switchIfEmpty(Mono.error(new Exception())); } public Mono findByUsername(String username) { r..
엉엉 마이바티스 R2DBC 나오기전까진 R2dbcRepository 안쓸꺼야... UserDetails 구현하면 aithorities가 Collection 타입으로 고정되어버리고 User 상속하면 생성자에서 username password 널체크를 회피할 수가 없고... 안해 쉬펄...!!
0. 스프링 부트 프로젝트 생성 1. 메이븐에 다음 종속성을 추가. (예시는 마리아DB, 현재 각 데이터베이스 별로 R2DBC 지원여부가 다를 수 있으니 사용 전 확인필요. 오라클은 검색결과 아직 대응중인듯.) org.springframework.boot spring-boot-starter-data-r2dbc 2.4.4 org.mariadb r2dbc-mariadb 1.0.1 2. application.properties 에 다음과 같은 프로퍼티 추가 jdbc 방식 (R2DBC를 사용할 경우 추가할 필요 없음) spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.url=jdbc:mariadb://{host}:{port..
일단 가장 큰 문제는 스프링부트 버전. OAuth2가 스프링부트 시큐리티 2.4.0 버전부터 로드맵에서 완전히 빠져버렸는데 이게 단순히 리포지토리 정리 차원에서 제거된건지 아니면 보안문제까지 겸해서 제거된건지를 알 수가 없다. 이래서 지금 스프링부트에서 스프링 클라우드 리포지토리로 교체해서 전면 수정해야하는건가 진행 보류중. 두번째는 client_credentials 의 적용범위. 웹 서비스가 아닌 클라이언트 자체의 인증을 위해서 쓴다고 얼핏 배웠던거같은데 password 방식과 다른게 뭔지 모르겠다. 일단 지금은 아무래도 스프링 클라우드로 이전하는것까지 전부 생각해봐야겠다
IntStream.of(1, 2, 3) 하고 Flux.just(1, 2, 3) 하고 뭐가 다른건지 모르겠다 맵 리듀스 같은 람다함수를 순차적으로 넣어주면 똑같은 순서대로 처리해주는거 같은데 이게 웹서비스와 스프링 웹플럭스하고 어떻게 다른건지 받아들이는 방법을 전혀 모르겠다
JAXB 문제(ClassNotFound)로 부팅이 안된다. 돌리기 위해서는 pom.xml 에 org.glassfish.jaxb jaxb-runtime 를 추가해야한다. 호환성의 문제로 자바 11에서 꽤 적지 않은 라이브러리가 삭제되었다고 하는데 스프링측에서는 저걸 사용하면 된다고 한다. 실제로 사용해도 되는건지 저거 사용 자체를 피해야하는것인지까지는 모르겠다. -->> 추신 스프링 부트 프로젝트에서 error occurrd during 어쩌구 저쩌구하는 에러 로그에서 spring boot validation builder 가 언급될 경우에는 2개 중 1가지를 선택해서 처리하는 방법이 있다. 방법 1. 워크스페이스경로/.metadata/.plugins/org.eclipse.wst.validation 폴더 ..