반응형

간단하게 메모리위에 데이터를 올려놓고 사용하고 싶은 경우 보통 ehcache를 많이 사용하게 된다.

 

이때 주의해야하는 점이 있다.

 

동일한 클래스 내에서 호출되는 메서드에 @Cacheable을 적용해도 정상적으로 동작하지 않고 무시되어져 버린다. 프록시 생성방식때문...

 

다음처럼 getSpecificRangeContents메서드 내에서 getAllContentsIdAndLocation메서드를 같은 클래스내에서 호출하게되면 정상동작하지 않는 것이다.

간단히 설명하자면 캐시는 프록시기반으로 동작하는데 프록시 클래스는 모든 요청과 응답의 인터셉터에 의해 생성되어지기 때문에 같은 클래스 내부(internal) 콜에 의해서는 캐시기능이 적용되지 않는다. 관련하여 읽어보면 프록시 동작방식과 ehcache를 사용함에 도움이 될 만한 문서를 첨부한다.

Only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual cache interception at runtime even if the invoked method is marked with @Cacheable.

ref : https://stackoverflow.com/questions/16899604/spring-cache-cacheable-not-working-while-calling-from-another-method-of-the-s/40340964

 

[ ehcache관련 읽어보면 좋은 자료 ]

Transactions, Caching and AOP: understanding proxy usage in Spring

https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring

 

ehcache-spring-annotations - UsingCacheable.wiki

https://code.google.com/archive/p/ehcache-spring-annotations/wikis/UsingCacheable.wiki

 

해당문제가 스프링4.3에서는 self-autowiring으로 해결되었다고 한다.

 

잘알고 쓰자...

 

반응형
반응형

MYSQL 두 개의 테이블을 join해서 데이터를 가져오는 도중 컬럼값이 BLOB로 보이는 현상 발생

join을 할 떄 한 테이블에서는 BIGINT타입의 컬럼과 또 다른테이블에서는 VARCHAR타입의 컬럼을 조인하는 과정에서 발생

select시 해당 컬럼에 CONVERT(컬럼명 USING utf8)로 TEXT로 변환하여 확인하였다.

 

BLOB란
binary large object의 약어로 
BLOB컬럼 타입을 이용하면 일반적인 int나 char와는 달리 이미지나 바이너리 파일을 테이블에 담을 수 있다.
BLOB 필드는 소팅이나 INDEX는 생성할 수 없다. 

MYSQL에서 지원하는 BLOB타입은 4가지

1. TINYBLOB (TINYTEXT)
- A BLOB or TEXT column with a maximum length of 255 (2^8 - 1) characters.

2. BLOB (TEXT)
- A BLOB or TEXT column with a maximum length of 65535 (2^16 - 1) characters.
 
3. MEDIUMBLOB (MEDIUMTEXT)
- A BLOB or TEXT column with a maximum length of 16777215 (2^24 - 1) characters.
 
4. LONGBLOB(LONGTEXT)
- A BLOB or TEXT column with a maximum length of 4294967295 (2^32 - 1) characters.

 

반응형
반응형

JPA 직접 @Query애노테이션을 사용해 원하는 쿼리를 직접 사용할 수 있다.

이 때 주의해야할 점은 from절에 db의 테이블명이 아닌 해당 테이블의 entity로 등록한 모델을 입력해주어야 한다.

 

문제상황

from절의 테이블명(channel)을 작성 

 

다음과 같은 에러 발생

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: channel is not mapped [select max(id) as id from channel] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:729) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_151] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_151] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_151] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_151]

 

문제해결

entity로 등록한 Java class로 변경

반응형
반응형

스프링부트에서 mysql 연동시 다음과 같은 에러를 본적이 있을 것이다.

java.sql.SQLException: The server time zone value 'KST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

 mysql-connector-java 버전 5.1.X 이후 버전부터 KST 타임존을 인식하지 못하는 이슈로

application.properties의 datasource.url부분을 수정해준다.

spring.datasource.url에 'serverTimezone=UTC'를 추가해준다.

이후 어플리케이션 시작시 에러가 깔끔하게 사라진것을 확인할 수 있을 것이다.

반응형
반응형

Mac에서 디렉토리별 사이즈를 쉽게 확인 할 수 있는 유틸리티 프로그램을 소개합니다.

 

Disk Innvenntory X

설치를 하시고 실행을 하게 되면 다음과 같이 디렉토리별 용량을 보여줍니다.

 

해당 앱을 사용하여 예상치 못한곳에서 디스크를 공간을 많이 차지하고 있는 불필요한 데이터를 삭제해주면 

 

좀 더 쾌적하게 Mac을 사용하실 수 있을 것 같습니다.

반응형
반응형

스프링부트에 actuactor적용하다가 다음과 같은 에러메시지가 발생했다.

해당 프로젝트에서는 스프링부트 버전 2.1.0.REALSE를 사용하고 있다.

org.apache.solr.client.solrj.SolrServerException: Server refused connection at: http://127.0.0.1:8983/solr at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:650) at 
.
.
.
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 127.0.0.1:8983 [/127.0.0.1] failed: Connection refused (Connection refused) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:159) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:373) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:394) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)

해당 프로젝트에서는 spring-boot-starter-data-solr를 사용하고 있었고 spring-boot-starter-actuator dependency를 추가하고

application.properties에 다음과 같이 추가해주었다. actuator사용을 위해서!

management.endpoint.metrics.enabled=true
management.endpoints.web.exposure.include=*
management.endpoint.prometheus.enabled=true
management.metrics.export.prometheus.enabled=true

 

 

문제해결은 다음과 같이 했다.

management.health.solr.enabled=false 한줄을 application.properties에 추가해주어 처리해주었다. 뭔가 actuator내부적으로 solr를 사용하고 있어 포트가 충돌나지 않았나 싶다. 이에 actuator설정에서 저렇게 false로 명시해주니 정상적으로 동작하는 것을 확인하였다.

반응형
반응형

스프링부트의 기본 컨테이너는 톰캣임을 알고 있었는데 이를 제외하고

다른 컨테이너를 사용하기 위한 방법에 대해 간단히 포스팅해본다. 

 

spring-boot-starter-web을 사용하게 되면 내부에 spring-boot-starter-tomcat을 포함하게 된다.

의존성 관계를 보면 알 수 있다.

따라서 다른 컨테이너를 사용하고 싶다면 spring-boot-starter-web의존성에서 tomcat을 exclusion시켜주어야 한다.

참조 : https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-web-servers.html

위와 같이 tomcat을 exclusion시켜주고 jetty의존성을 주입하게 되면 컨테이너로 jetty를 사용할 수 있다.

 

자세한 내용은 spring docs를 참고하자!

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-web-servers.html

반응형
반응형

쉘스크립트에서 특정 문자열을 기준으로 앞,뒤 문자열을 가지고 오고 싶을 경우 다음과 같이 사용하면된다.

 

%%{특정문자열}* => 해당 문자열 기준 앞 부분을 가져온다. 

#*{특정문자열} => 해당 문자열 뒷 부분을 가져온다.

[ 결과 ]

hello my youtube is I'm developer
hello my youtube
I'm developer

반응형
반응형

리눅스 쉘스크립트(shell script)에서 wc -l로 파일 line수 읽어 변수에 담기

[ Linux Getting the line count and sotring in a result set in shell script ]

 

FILE_ROW_COUNT=$(cat $FILE_PATH | wc -l)

반응형

+ Recent posts