본문 바로가기

개발/JAVA

히카리 풀 모니터링 히카리 풀을 사용하게 되면 housekeeper란 놈이 기본으로 30초마다 풀 상태를 debug모드로 찍고있는데 커스터마이징이 잘 안되서 별도로 찍기로 함 @SpringBootApplication @EnableScheduling class ApiApplication( val dataSource: DataSource) { @Scheduled(fixedDelay = 10000) fun hikariPoolMonitor() { (DirectFieldAccessor(dataSource).getPropertyValue("pool") as HikariPool?)?.let { hikariPool -> logger().info("Pool stats (total=${hikariPool.totalConnections}, a.. 더보기
동기(Synchronous)/비동기(Asynchronous) 처리 다음과 같이 여러개의 작업을 동시에 처리할때 작업1,2가 메인작업과 별개의 작업일때 비동기(@Async)로 던져놓고 메인 작업만 완료 후 응답을 주기도 합니다. (응답시간 0.5초, 작업1,2의 결과 받을 수 없음) 메인작업 : 0.5초 작업1 : 1초 작업2 : 2초 하지만 3가지 작업의 결과가 모두 필요할 경우 동기 처리를 하면 3.5초가 걸리지만 작업1, 2를 비동기로 처리하면 일찍 처리가 끝난 작업은 모든 작업이 완료될때까지 대기 후 응답을 줍니다. (응답시간 2초, 3개의 작업 결과 확인 가능) Kotlin @RestController @EnableAsync class ThreadTest( val taskService: TaskService, val mainService: MainService .. 더보기
RestTemplate 한글 깨짐 FCM 연동 중 한글 깨짐 현상 발생 시 다음과 같이 메세지 컨버터의 인코딩을 변경한다. Kotlin val restTemplate = RestTemplate().apply { messageConverters.forEach { if(it is StringHttpMessageConverter) { it.defaultCharset = Charset.forName("UTF-8") } } } 더보기
Kotlin toIntOrNull 코틀린에서 숫자 변환시에 자주 쓰이는 함수입니다. 다른 용도로 숫자인지 아닌지를 판단할때도 자주 쓰는데 주의할 점이 있습니다 fun main(args:Array) { "1234".run { println(this.toIntOrNull() ?: "$this is not number") } "349505749735".run { println(this.toIntOrNull() ?: "$this is not number") println(this.toBigIntegerOrNull() ?: "$this is not number") } } //1234 //349505749735 is not number //349505749735 위 예제를 보시면 문자열이 숫자인지 아닌지 판단하기 위해 toIntOrNull을 사용하.. 더보기
스프링 부트+마이바티스에서 트랜잭션이 안먹을때 @Transactional(rollbackFor = Exception.class) 1. rollbackFor를 명시해준다2. 메소드는 public으로 선언해준다 다른 패키지에서 안쓴다고 public으로 안했다가 삽질 경험그 외에 다른 DataSourceTransactionManager니 @EnableTransactionManagement니이런거 안넣어도 잘 동작함(블로그 글 기준) [개발/JAVA] - 스프링 부트(Spring boot)에서 mybatis(oracle) 적용하기 참고https://stackoverflow.com/questions/7085271/how-to-set-up-transaction-with-mybatis-and-spring 더보기
코틀린으로 스프링 사용 시 ClassNotFoundException: kotlin.reflect.full.KClasses Caused by: java.lang.ClassNotFoundException: kotlin.reflect.full.KClassesat java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_151]at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_151]at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_151]at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_151]... 26 common frames omi.. 더보기
H2 DB 사용 중 file is locked 발생 H2 DB를 사용 시 다음과 같은 오류 메세지를 만날때가 있습니다 The file is locked 내용 보면 알겠지만 여러 프로세스에서 동시에 접근할때 발행하는 오류입니다제 경우 API 서버를 띄워놓고 배치를 돌릴때 이미 DB를 사용중이기 때문에 발생한 경우였습니다.그럴 경우 설정을 다음과 같이 변경해 주시면 두개의 프로세스에서 동시 접근이 가능합니다. datasource: # url: jdbc:h2:file:~/test url: jdbc:h2:~/test;AUTO_SERVER=true username: sa driver-class-name: org.h2.Driver 더보기
spring profile 사용시 주의점 최근 삽질 application.yml에 값을 설정 해두고spring: profiles: local sleep: min: 100 max: 500 --- spring: profiles: dev sleep: min: 500 max: 1000 application.properties에 아래와 같이 프로파일을 설정해주었다spring.profiles.active=dev 어플리케이션 구동했으나 계속 발생하는 오류. 심지어 다른 서버에서는 정상 동작 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sleepAspect': Injection of autowired dependencies failed; neste.. 더보기
@Scope 어노테이션 사용하기(request+ProxyMode) [개발/JAVA] - Threadlocal을 이용하여 사용자별 요청 처리하기 ThreadLocal과 같이 보시면 좋습니다. 스프링에서 빈 Scope 타입은 여러가지 방식이 있으며 아래를 참고해 주세요. https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html 별도의 옵션이 없다면 빈은 싱글톤으로 관리되며 부모의 속성을 따라갑니다. 즉 controller는 따로 설정을 하지 않았기 때문에 singleton으로 동작하게 되며 그 안에서 주입받은 빈 역시 scope를 request로 줘도 singleton으로 동작하게 됩니다. 빈을 생성해 주고 위에 보이는것처럼 scope를 request로 선언해줍니다. 그리고 위처럼 컨트롤러를 구현합니다.. 더보기
Threadlocal을 이용하여 사용자별 요청 처리하기 개발시 소스 전체에서 사용할 수 있는 전역변수처럼 데이터를 할당하고 싶을떄가 있습니다. Threadlocal을 이용하여 이를 구현해 봅니다. ShoppingController.java @RestController public class ShoppingController { private int melon; @RequestMapping("/") private String test() { this.addMelon(); return String.valueOf(melon); } private void addMelon() { melon++; } } 사용자별로 요청 시 카트에 멜론을 담는 기능을 구현하려고 합니다. 이 떄 카트 수량은 여러 메소드에서 사용할 수 있기 때문에 멤버변수로 선언을 합니다. 이렇게 작성 후.. 더보기