반응형

Back-End/Spring framework 30

HikariCP와 커넥션 누수(Connection Leak) 관련 트러블슈팅

문제 발생운영중인 서비스에서 사용하는 DB에서 특정 테이블들을 분리하여 별도 DB로 구축하는 일이 생겼습니다. 때문에 이를 위해 Multi Datasource를 적용하였습니다.기존 서비스는 Tomcat connection pool이 적용되어있었는데, 이번 작업을 하며 HikariCP로 변경하였습니다.(참고로 Spring Boot 2.0 부터는 HikariCP가 기본 커넥션풀이라고 합니다.)In Spring Boot 1.x, Tomcat connection pool was the default connection pool but in Spring Boot 2.x HikariCP is the default connection pool.적용을 완료하고 정상동작을 확인한 후 개발환경에 반영해둔 다음날..서비스 ..

Spring Ehcache 사용 간략한 정리

1. Spring Cache Abstraction https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html#boot-features-caching-provider 2. 적용2-1. @EnableCaching Spring Boot Application 설정시 @EnableCaching 어노테이션 추가하여 Application에 캐시 기능 사용하겠다는 것을 알린다 @SpringBootApplication @ComponentScan("com.nhnent.gia") @EntityScan(basePackages = {"com.nhnent.gia.model"}, basePackageClasses = {Applic..

Spring AOP 동작 방식, 원리

스프링은 기본적으로 프록시 기반 AOP 를 제공한다. 스프링에서는 Java Dynamic Proxy를 사용하거나 Cglib을 사용하여 프록시 기반 AOP를 구현했다. 이 글에서는 어떻게 Spring 에서 AOP를 사용할 수 있는 방식의 차이와 프레임워크가 AOP를 지원하기 위해 어떤 처리를 해주는지 개인적으로 분석한 내용을 정리한다. AopProxy 라는 Delegator 인터페이스로 표현되며 Dynamic Proxy 기반은 JdkDynamicAopProxy 클래스, Cglib 기반은 CglibAopProxy 클래스이다. Dynamic Proxy 기반과 Cglib 차이는 어떻게 프록시 객체를 생성하는지 방식 차이이다. Dynamic Proxy 는 프록시 객체 생성을 위해 인터페이스를 필수로 구현해야하며,..

Spring Boot 설정파일

Spring Boot의 큰 장점 중 하나는 기존 Spring을 이용하면서 해야했던 설정들 (XML방신이던, Java방식이던)을 자동으로 진행해주는 것이라 생각합니다. (AutoConfiguration)이를 통해 개발자는 설정파일 (application.property, yml 파일 등)에 간단한 설정정보들만 입력해주는 수준으로도 Spring의 다양한 기능들을 쉽게 이용할 수 있습니다. 이렇게 설정할 수 있는 설정의 종류는 굉장히 다양하며 예를들어 Datasource 설정의 경우에만도 아래와 같이 굉장히 많은 옵션들을 설정할 수 있습니다. # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)spring.datasource.continue-on..

Spring Boot Build 시 MyBatis Type Alias 미적용 문제

MyBatis를 이용하여 개발하면 주로 resultType에 적어줄 타입에 alias를 적용하여 사용한다.​보통 다음과 같이 SqlSessionFactoryBean을 정의할 때 setTypeAliasesPackage 메소드를 이용하여 정의한다.SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setTypeAliasesPackage(ALIAS 대상 클래스가 위치한 패키지경로);헌데 위와같은 방식으로 alias를 적용한 후 IDE를 통해 실행시키면 문제없이 잘 실행되는데​배포를 위해 jar로 빌드한 후 실행하자 ClassNotFoundException 이 발생하며 alias된 타입들을 못찾는 문제가 발생했다.​..

Spring Boot index page 설정

Spring Boot 에서 인덱스 페이지 설정하는 방법은 여러가지 방법이 있습니다. resources 디렉토리 밑에 index.html을 추가하거나 컨트롤러 매핑을 이용하여 @RequestMapping("/")으로 지정할 수도 있습니다. 하지만 여기서는 스프링에서 제공되는 WebMvcConfigurerAdapter를 이용하여 설정하는 방법을 소개하겠습니다. 1. application.properties에 설정 추가# webapp intro pagespring.webservice.intro= /common/intro 2. WebMvcConfigurerAdapter를 상속받는 클래스 작성@Configuration@Slf4jpublic class WebMvcConfig extends WebMvcConfigur..

Spring Interceptor 사용 시 호출 Method 얻어오기

인터셉터의 preHandle, postHandle 메소드에 보면 Object형 handler라는 이름의 인자가 있다. 이 인자는 RequestMapping으로 매핑된 하나의 메소드로 스프링 프레임워크에 의해org.springframework.web.method.HandlerMethod라는 클래스로 바인드 되어 전달되는 인자다. getMethod()를 호출하면 실제 java Reflection의 Method형 객체를 얻을수 있다. Custom Annotation을 사용한다면 Interceptor에서 위 handler 객체를 HandlerMethod method = ((HandlerMethod)handler);MyAnnotation anno = method.getMethodAnnotation(MyAnnota..

Mybatis XML 쿼리 작성 시 비교 연산자 (<, >) 사용

XML에서 쿼리를 작성할 때 와 같은 비교 연산자를 사용하면 The content of elements must consist of well-formed character data or markup. 이런 오류메세지가 나타날 수 있다. XML에서 를 비교연산자로 판단하지 않고 등 태그의 시작과 끝으로 인식되어 생기는 일이다. 해결하기 위해서는 비교연산 사용하는 부분에을 로 감싸주면 된다. ex)select *from some_tablewhere 5 ]]>