반응형

springboot버전에 맞지 않는 spring cloud dependency를 추가하게 되면 다음과 같은 에러메세지를 만난다.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name
	'configurationPropertiesBeans' defined in class path resource 
    [org/springframework/cloud/autoconfigure/ConfigurationPropertiesRebinderAutoConfiguration.class]:
    Bean instantiation via factory method failed; nested exception is org.springframework.beans
	.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.conte
    xt.properties.ConfigurationPropertiesBeans]: Factory method 'configurationPropertiesBeans' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(Constr
    uctorResolver.java:658) ~[spring-beans-5.3.12.jar:5.3.12]

.
.
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate 
	[org.springframework.cloud.context.properties.ConfigurationPropertiesBeans]: 
    Factory method 'configurationPropertiesBeans' threw exception; 
    nested exception is java.lang.NoClassDefFoundError
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata

 

따라서 아래의 표와같이 springboot version에 맞는 springcloud version을 맞춰주도록 하자~!

Release TrainBoot Version

2020.0.x aka Ilford 2.4.x, 2.5.x (Starting with 2020.0.3)
Hoxton 2.2.x, 2.3.x (Starting with SR5)
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x

 

반응형
반응형

스프링부트 with JPA 프로젝트 작업중 신기한게 로컬환경에서는 에러가 안났는데 alpha, real환경에만 배포하면 위와 같은 에러 메세지가 나왔다....

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Either use @Param on all parameters except Pageable and Sort typed once, or none at all!

문제의 원인이 무었이었는고 하니...

JPA 에서 매개변수 2개를 받는 메서드에 한 변수에만 @Param을 지정해서 사용하여서 발생하였다...

jobId 매개변수에도 @Param을 명시적으로 주니 정상적으로 해결 되었다.

void upsertAnalysisData(@Param("jobId") int jobId, @Param("audience") AudienceAnalysis audienceAnalysis);

혹시나 비슷한 에러가 발생한다면 JPA Repository부분에 특정 매개변수에만 @Param을 주어서 사용하진 않았는지 확인해보자!

반응형
반응형

해당 글은 '실무로 배우는 시스템 성능 최적화' 책의 내용을 발췌한 내용입니다. 최근 해당 책을 읽다가 이전에 내가 했던 고민과 비슷한 사례에서 비롯한 성능 저하 사례가 있어 포스팅 해본다. 보통 스프링부트에서 API를 만들 때 RestTemplate을 만들어서 사용하실텐데 매번 RestTemplate객체를 new로 생성해서 사용해야하는지 싱글톤 객체로 만들어 놓고 사용해야 하는지 고민하던 때가 있었다. 처음 멋 모를 때는 API Controller마다 new로 생성해서 사용했었는데 RestTempalate가 스레드 간 공유해도 안전한 클래스라는걸 알고 난 이후에 @Bean으로 싱글톤 객체를 생성해 사용했었다. new 객체를 매번 생성할 때도 나는 아래와 같은 장애상황을 겪진 못했지만 아래와 같이 내부락이 발생할 수 있으므로 싱글톤 객체로 만들어 사용할 수 있도록 하자. 또한 @Bean 애노테이션으로 만든 싱글톤 객체보다 빈 대신 static을 사용한 싱글턴 구조를 만드는게 더 좋다고 하는데 궁금하시다면 조치부분을 참고.

스프링 프레임워크의 객체를 잘못 사용한 성능 저하 사례

현상

오픈 전 6시간 동안 진행하는 안정성 테스트 과정에서 1시간이 경과한 후 응답시간이 급격히 저하되는 현상이 발생했다.

접근 방식

오라클 JVM을 사용하고 있어 응답시간이 느려졌을 때 jstack으로 스택을 5회 수집해서 분석했다. 성능 저하 시 전체 사용자 요청을 처리 중인 스레드 중 90% 이상이 애플리케이션 내부 락 대기 중이었다.

시스템의 애플리케이션 서버는 프론트 서버와 백엔드 서버로 구성돼 있는데, 프론트 서버에 들어온 서비스 요청은 다시 HTTP를 사용해 다시 백엔드 업무 서버를 호출하는 구조다. 내부 락은 프론트 서버 내에서 백엔드 서버의 서비스를 호출할 때 사용하는 RestTemplate 객체를 생성하는 과정(RestTeamplate.init())에서 발생하고 있었다. 이에 RestTemplate 클래스에 대해 인터넷 검색을 한 결과, 애플리케이션에서 RestTemplate을 잘못 사용하고 있음을 알 수 있었다.

원인

스프링 프레임워크에서 제공하는 HTTP 클라이언트 템플릿인 RestTemplate 클래스는 객체 생성 시 내부에 무거운 Charset.availableCharsets 메서드가 실핸된다. 더구나 Charset.availableCharsets 메서드는 여러 스레드가 동시에 사용했을 때 스레드 간에 락 경합이 생겨서 급격한 성능 저하를 유발한다. HTTP로 백엔드 시스템의 서비스를 호출할 때마다 RestTemplate객체를 새로 생성해서 사용함으로써 Charset.availableCharsets 메서드에 의한 성능 저하가 발생한 것이다.

조치

RestTemplate은 스레드 간에 공유해도 안전한 클래스이므로 싱글턴 구조로 객체를 한 개만 생성한 후 스레드 간에 공유해서 사용하도록 수정한다. 그래서 객체 생성이 인스턴스마다 한 번만 이뤄져 락 경합이 제거됐다(RestTemplate 클래스를 스프링 프레임워크의 빈으로 사용할 수도 있으나 RestTemplate 클래스를 사용하는 MobileClient 클래스 또한 프레임워크의 일부라서 빈 대신 static을 사용한 싱글턴 구조를 만들었다.

결과

6시간 안정성 테스트 동안 응답시간이 증가하는 현상 없이 일정하게 유지됐다.

ref : 실무로 배우는 시스템 성능 최적화

반응형
반응형

토이프로젝트를 하던 중 쿠키에 특정 값을 만들어 굽는 작업이 필요했다.

따라서 HttpServletResponse에 addCookie를 하여 쿠키를 구워줬지만 브라우저 개발자도구에서 눈을 씻고 찾아봐도 보이지가 않았다...

 

문제는 Cookie의 path를 설정해주지 않아서였다...

 

쿠키의 path를 설정해주지 않으면 현재 경로에서만 only valid하도록 처리되기 때문에

리다이렉트 되면서 유효하지 않기에 사라져 버리는 것이다.

 

[ 문제코드 ]

쿠키에 setPath를 지정해주지 않음...

 

[ 문제 해결 ] 

setPath를 루트로 지정

 

ref : https://stackoverflow.com/questions/35828087/setting-cookie-not-working-in-spring-web-mvc-4

반응형
반응형

보통 웹서비스에서 포트를 두 개 사용하는 경우는 http, https를 사용하는 경우이다.


보통은 ssl작업은 앞단에 웹서버(apache, nginx)를 두지 처리하는데 springboot만으로도 처리가 가능하다.


application.properties에 server.port=8080을 설정해두고 


추가로 8082 포트를 사용하고자 하면 다음과같이  ConfigurableEmbeddedServletContainer에


Connector에 추가로 사용하고자 하는 포트(port)를 설정해 셋팅해주면 된다.




이렇게 설정하고 실행시켜서 테스트해보면


localhost:8080, localhost:8082로 모두 서비스를 사용할 수 있다.


어떻게 언제 사용하냐고????


보통은 http, https 처리하는 경우, 그 외에는 사실 잘모르겠다...

반응형
반응형


웹 작업을 할 때 jsp내의 문구라던지 구조를 변경하고 확인해야하는데 실시간으로 반영이 안되면 무척이나 성가시지요...


빌드다시해줘야하고.....시간은 시간대로 잡아먹고...


SpringBoot를 쓰고 계신다면 application.properties에 다음과 같이 추가해 주세요.


server.jsp-servlet.init-parameters.development=true


추가 이후에는 어플리케이션 재시작 없이 바로 웹에 반영되는 것을 확인할수 있다.

반응형
반응형

스프링부트(Springboot) 사용시 java.lang.IllegalArgumentException: An invalid domain Error 해결하기


스프링에서 쿠키에 setDomain을 할 경우 현재 서버의 도메인 및 상위 도메인 외에 다른 도메인을 셋팅하게 되면 에러가 발생한다.


서버 도메인이 test.com인데 다음과 같이 쿠키에 setDomain을 하게되면


cookie.setDomain(".toast.com");


다음과 같은 에러가 발생한다.


java.lang.IllegalArgumentException: An invalid domain [.toast.com] was specified for this cookie

at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:183)

at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:125)

at org.apache.catalina.connector.Response.generateCookieString(Response.java:989)

at org.apache.catalina.connector.Response.addCookie(Response.java:937)

at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)

at com.nhnent.demonaid.cms.CookieMatchingServiceController.getAdRequestFromMedia(CookieMatchingServiceController.java:80)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220)

.

.

.



[ 원인 ] 


tomcat8 버전 이상에서는 Cookie Header를 파싱하는 기본 CookieProcessor가 RFC6265를 기반으로 하고 다음과 같은 속성을 같는다.

5.2.3.  The Domain Attribute

   If the attribute-name case-insensitively matches the string "Domain",
   the user agent MUST process the cookie-av as follows.

   If the attribute-value is empty, the behavior is undefined.  However,
   the user agent SHOULD ignore the cookie-av entirely.

   If the first character of the attribute-value string is %x2E ("."):

      Let cookie-domain be the attribute-value without the leading %x2E
      (".") character.

   Otherwise:

      Let cookie-domain be the entire attribute-value.

   Convert the cookie-domain to lower case.

   Append an attribute to the cookie-attribute-list with an attribute-
   name of Domain and an attribute-value of cookie-domain.


Domain값 맨 앞자리에 "."을 붙일 경우 "."을 제거하고 파싱하게 된다.


[ 해결 ]

SpringBoot를 사용하고 있는 경우(Embedded Tomcat) 다음과 같은 설정을 해주면 된다. 스프링부트 자바 config클래스에 넣어주면 된다.




[ reference ]

https://jistol.github.io/java/2017/08/30/tomcat8-invalid-domain/

http://hyunc87.tistory.com/34

반응형

+ Recent posts