다운받은 ngrinder를 적당한 파일 경로에 위치시켜주고 /Users/user/ngrinder 파일에 위치시켜줬다.
java -Djava.io.tmpdir=${NGRINDER_HOME}/.ngrinder/lib -jar ngrinder-controller-3.5.9-p1.war --port 7070 명령어를 실행시켜 ngrinder를 실행시킨다.
ngrinder를 실행시킨 후 script를 작성하려할 때 계속되는
ERROR FileEntryRepository.java:192 : Error while fetching files from SVN for admin 오류로 인해.. 원인은 알 수 없고 곤란했는데 아래 url처럼 삭제했다가 다시 지우니깐 됐다.(근데 이것도 2차례 정도 지우니깐 그제서야.. 제대로 작동함. 안 되면 여러번 삭제했다가 다시 시도해볼 것)
and token 'SEPARATOR', no viable alternative at input 'select table_a.cstCd, table_a.cstNm, table_a.orderNo, group_concat(table_a.goodsSno *SEPARATOR '|')'
from shopOrder shopOrder
mysql에서 사용하던 group_concat 함수를 아래와 같이 등록하여 사용하던 중에 group_concat의 기본 separator가 콤마라서 |로 바꾸려고 하는 중에 separator는 사용할 수 없는 명령어라는 오류 발생 여러가지 방법으로 시도하려고 했으나.. 해결되지 않아 어쩔 수 없이 자바단에 함수를 생성하여 replace하는 것으로 변경
위의 예제 코드로 테스트를 하였으나 내가 기대한 방식으로 동작하지 않았고 원인은 Spring에서 @Transactional 어노테이션에 대한 동작 방식 때문이었다. @Transaction 어노테이션은 Spring의 AOP를 통해 프록시 객체를 생성하여 사용된다.
Target 클래스가 인터페이스 구현체가 아니어서 테스트 코드상에서는 CGLib Proxy 방식으로 Target 클래스를 프록시 객체로 생성하여 코드에 끼워넣는 방식이 사용됐다.
문제는 Target 클래스를 프록시 객체로 생성의 특징으로 인해 발생했는데 동일한 Class내에 위치한 메서드에 각기 다른 @Transactional propagation 옵션을 설정했지만 메소드 단위가 아닌 Target클래스 단위로 설정되기 때문에 새로운 트랜잭션이 생성되지 않는다.
이를 해결하기 위해선 메소드를 다른 클래스로 분리(bean을 분리해줌)시키면 외부에서 호출하기 때문에 Target클래스 단위로 트랜잭션이 생성될 수 있고(propagation 전파 옵션에 따라) 부모가 실패해도 자식 트랜잭션은 커밋될 수 있도록 설정할 수 있다.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Unsatisfied dependency expressed through method 'setFilterChains' parameter 0: Error creating bean with name 'filterChain' defined in class path resource [com/example/securityspring/config/SecurityConfig.class]: Failed to instantiate [org.springframework.security.web.SecurityFilterChain]: Factory method 'filterChain' threw exception with message: This method cannot decide whether these patterns are Spring MVC patterns or not. If this endpoint is a Spring MVC endpoint, please use requestMatchers(MvcRequestMatcher); otherwise, please use requestMatchers(AntPathRequestMatcher).
This is because there is more than one mappable servlet in your servlet context: {org.h2.server.web.JakartaWebServlet=[/h2-console/*], org.springframework.web.servlet.DispatcherServlet=[/]}.
For each MvcRequestMatcher, call MvcRequestMatcher#setServletPath to indicate the servlet path.
위와 같은 오류 발생 문제의 원인은 h2 데이터베이스의 console 사용을 아래와 같이 허용해주었는데 h2 console 사용 시 서블릿 컨텍스트에 h2-console과 dispatcherServlet의 두 가지 서블릿이 매핑되어 어떤 서블릿을 사용해야하는지 알 수 없어 발생하는 오류
application.yml
spring:
h2:
console:
enabled: true
filterChain의 requestMatchers에 MvcRequestMatcher, AntPathRequestMatcher 중 사용하려는 클래스를 명확하게 지정해줘야한다.