잘 쓰고 있던 로컬 서버용 사이트가 메인 페이지 진입 시 500 에러가 발생했다.

로그를 보니

The absolute uri: http://egovframework.gov/ctl/ui cannot be resolved in either web.xml or the jar files deployed with this application

검색해보니 이런 케이스가 종종 있었던 것 같다.

https://egovframe.go.kr/home/qainfo/qainfoRead.do?menuNo=69&qaId=QA_00000000000017254

위 에러는 egovframework.rte.ptl.mvc-3.8.0.jar 파일을 repository 에서 제대로 받아오지 못하는 것 같다.

(방화벽 문제..?)

그렇다기엔 .m2 디렉토리에 해당 jar 가 있다..

어찌됐든 개발 테스트는 계속해야 하니

해당 jar 파일을 톰캣 설치 디렉토리/lib 폴더에 직접 넣어줬다.

하나를 해결하고 나니 계속해서 비슷한 에러 발생

The absolute uri: http://www.springframework.org/tags/form cannot be resolved in either web.xml or the jar files deployed with this application

이 에러는

이 jar를,

The absolute uri: http://www.springmodules.org/tags/commons-validator cannot be resolved in either web.xml or the jar files deployed with this application

얘는

얘를 톰캣 디렉토리/lib에 설치함으로써 정상적으로 로컬 테스트가 가능해졌다....

Posted by 긍뎡
,

파일 업로드 시 에러 발생,,,,

심각: Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [C:\NCIS\WebApp\upload\egovframework] is not valid] with root cause
java.io.IOException: The temporary upload location [C:\NCIS\WebApp\upload\egovframework] is not valid
at org.apache.catalina.connector.Request.parseParts(Request.java:2778)
at org.apache.catalina.connector.Request.parseParameters(Request.java:3178)
at org.apache.catalina.connector.Request.getParameter(Request.java:1109)
at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:380)
at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:153)
at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:153)
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:91)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1533)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1489)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

 

 

구글링 결과

https://www.inflearn.com/questions/268366/%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C-%EA%B2%BD%EB%A1%9C-%EC%98%A4%EB%A5%98-%E3%85%A0%E3%85%A0

경로 앞에 C: 를 안 붙여서 ,,,

즉 시 properties 파일에 잡아놓은 경로명 앞에 C: 붙여주니 정상 작동..

 

 

Posted by 긍뎡
,
1. 테스트 목적
1) SpringBoot 기반, Spring 기반 프로젝트 각각의 환경에서 하나의 공통된 logback.xml 파일로 프로파일 별 로깅일이 동일하게 동작함을 확인하기 위한 테스트임.
2) 로깅이 동일하게  동작하기 위해서는 어떤 셋팅이 필요할까....

2. 설정
1) logback.xml (공통, src/main/resources 밑에 위치한다.)
<?xml version="1.0" encoding="UTF-8"?>
<!-- configuration file for LogBack (slf4J implementation) See here for more 
	details: http://gordondickens.com/wordpress/2013/03/27/sawing-through-the-java-loggers/ -->
<configuration scan="true" scanPeriod="30 seconds">

	<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
		<resetJUL>true</resetJUL>
	</contextListener>

	<!-- To enable JMX Management -->
	<jmxConfigurator />

	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} %-5level %logger{32}[%method:%line] - %msg%n</pattern>
		</encoder>
	</appender>

	<if condition='property("spring.profiles.active").equals("loc")'>
		<then>
			<property name="LOG_LEVEL" value="INFO" />
		</then>
		<else>
			<property name="LOG_LEVEL" value="WARN" />
		</else>
	</if>

	<root level="${LOG_LEVEL}">
		<appender-ref ref="CONSOLE" />
	</root>

</configuration>

2) dependency
     - spring
<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.0.13</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-api</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<dependency>
			<groupId>org.codehaus.janino</groupId>
			<artifactId>janino</artifactId>
			<version>3.0.8</version>
		</dependency>
- spring boot (logback 은 spring-boot-starter-web 에 포함되어 있다.)
<dependency>
			<groupId>org.codehaus.janino</groupId>
			<artifactId>janino</artifactId>
			<version>3.0.8</version>
		</dependency>


4) 디버깅 로그
- spring
public class LogbackTestApplication {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Logger logger = LoggerFactory.getLogger(LogbackTestApplication.class);
		
		logger.debug("debug");
		logger.info("info");
		logger.warn("warn");
		logger.error("error");
			
	}

}

-spring boot
@SpringBootApplication
@Slf4j
public class DemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(DemoApplication.class, args);
        log.debug("debug");
        log.info("this is an info");
        log.warn("warn");
        log.error("this is an error");
    }

}


3. 실행

VM Options에  -Dspring.profiles.active="프로파일명" 옵션 추가후 실행..


4. 결과
-spring, spring boot 콘솔 결과가 똑같은 지 확인해보자... 꼼꼬미..

 프로파일 : loc 
 root level : info 
18:08:18.238 INFO  com.spring.test.HomeController[home:38] - Welcome home! The client locale is ko_KR.
18:08:18.240 INFO  com.spring.test.HomeController[home:53] - this is an info
18:08:18.240 WARN  com.spring.test.HomeController[home:54] - warn
18:08:18.240 ERROR com.spring.test.HomeController[home:55] - this is an error

프로파일 : run
root level : warn
18:12:17.624 WARN  com.spring.test.HomeController[home:54] - warn
18:12:17.626 ERROR com.spring.test.HomeController[home:55] - this is an error


다음엔 메이븐 봐야겠다..



Posted by 긍뎡
,

1. 프로젝트 생성.

이클립스 기준, Spring MVC Project 프로젝트 생성

2. 메이븐 빌드-배포가 아닌 단순 톰캣 서버 실행..

- pom.xml 에 dependency 추가


<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.13</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> <scope>runtime</scope> </dependency> <!--logback.xml 에서 프로파일 별 분기를 위한 if condition 구문을 쓸 수 있게 한다.--> <dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>3.0.8</version> </dependency>


3. logback.xml

-    log4j.xml 파일을 logback.xml 로 변경

- logback.xml


<?xml version="1.0" encoding="UTF-8"?>
<!-- configuration file for LogBack (slf4J implementation) See here for more 
	details: http://gordondickens.com/wordpress/2013/03/27/sawing-through-the-java-loggers/ -->
<configuration scan="true" scanPeriod="30 seconds">

	<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
		<resetJUL>true</resetJUL>
	</contextListener>

	<!-- To enable JMX Management -->
	<jmxConfigurator />

	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} %-5level %logger{32}[%method:%line] - %msg%n</pattern>
		</encoder>
	</appender>

	<if condition='property("spring.profiles.active").equals("run")'>
		<then>
			<property name="LOG_DIR" value="/logs/run" />
			<property name="LOG_LEVEL" value="WARN" />
		</then>
		<else>
			<property name="LOG_DIR" value="/logs/dev" />
			<property name="LOG_LEVEL" value="INFO" />
		</else>
	</if>


	<property name="LOG_PATH_NAME" value="${LOG_DIR}/spring-logback-test.log" />

	<appender name="LOG_FILE"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_PATH_NAME}</file>
		<append>true</append>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_PATH_NAME}.%d{yyyy-MM-dd}.%i.log.gz
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>60KB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<maxHistory>5</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} %-5level %logger{32}[%method:%line] - %msg%n</pattern>
		</encoder>
	</appender>
	
	<if condition='property("spring.profiles.active").equals("loc")'>
		<then>
			<logger name="com.spring.test" level="debug" />
		</then>
		<else>
			<logger name="com.spring.test" level="warn" />
		</else>
	</if>
	
	<root level="${LOG_LEVEL}">
		<if condition='property("spring.profiles.active").equals("loc")'>
			<then>
				<appender-ref ref="CONSOLE" />
			</then>
			<else>
				<appender-ref ref="LOG_FILE" />
			</else>
		</if>
	</root>
	
</configuration>


3. 서버 구동

Run Configuration > VI arguments   -Dspring.profiles.active='프로파일'   에 옵션 추가 후 실행

4. 확인

- debugging code

logger.debug("debug");
		logger.info("this is an info");
		logger.warn("warn");
		logger.error("this is an error");


1)  loc (root level : debug)

12:23:44.653 DEBUG com.spring.test.HomeController[home:47] - loc

12:23:44.653 DEBUG com.spring.test.HomeController[home:49] - debug

12:23:44.653 INFO  com.spring.test.HomeController[home:50] - this is an info

12:23:44.654 WARN  com.spring.test.HomeController[home:51] - warn

12:23:44.654 ERROR com.spring.test.HomeController[home:52] - this is an error


2)  dev(root level : info)


12:31:05.173 INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping[registerHandlerMethod:190] - Mapped "{[/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.spring.test.HomeController.home(java.util.Locale,org.springframework.ui.Model)

12:31:05.376 INFO  o.s.w.s.h.SimpleUrlHandlerMapping[registerHandler:314] - Mapped URL path [/resources/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'

12:31:05.394 INFO  o.s.w.s.h.SimpleUrlHandlerMapping[registerHandler:301] - Root mapping to handler 'homeController'

12:31:05.410 INFO  o.s.w.servlet.DispatcherServlet[initServletBean:463] - FrameworkServlet 'appServlet': initialization completed in 537 ms

12:31:20.454 WARN  com.spring.test.HomeController[home:51] - warn

12:31:20.455 ERROR com.spring.test.HomeController[home:52] - this is an error


3) run(root level : warn)

13:33:00.479 WARN  com.spring.test.HomeController[home:51] - warn

13:33:00.482 ERROR com.spring.test.HomeController[home:52] - this is an error



Posted by 긍뎡
,

출처 : http://stackoverflow.com/questions/13715811/requestparam-vs-pathvariable


@RequestVariable : URI 로부터 placeholder 를 얻는다.

@RequestParam : parameter를 얻는다. 

예 ) http://localhost:8080/MyApp/user/1234/invoices?date=02-03-2016 '1234 

라는 User ID 를 가진 user의 2016년 2월 3일 자 invoice'를 얻고 싶을 때라는 URL 이 있을 때

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}
@RequestVariable("userId") 는"/user/{userId}/invoices"로 맵핑된 url 에서 "userId" 로 위치의 '1234' 를 얻는다.
 @RequestParam(value = "date", requried = false ) Date dateOrNull) 은 "date" 파라미터의 값 ('=' 뒤에 오는) '02-03-2016'을 얻는다.



Posted by 긍뎡
,

aws에서 제공하는 많은 credentialpProvider 중에 뭘 써야 하는 지.. 한참 삽질하다가..

bean 설정도 해보고 configuration 파일도 만들어보고 ㅠㅠ 

결국엔 ClasspathPropertiesFileCredentialsProvider 를 사용.


1. credentials.properties 파일 설정



2. 어디에 박아야 하는가

여기에다


3. 어케 불러오냐.

credentialsProvider 를 생성해 줄 때 경로를 지정해준다.

Spring mvc 프로젝트라면   src/main/resources 안에다가 .properties 파일을 넣어준다.

만약 바로 밑에 넣지 않고 패키지로 한번 싼다면

Provider 생성할 때 경로에  "패키지명/credentials.properties" 로 해주면..

아마 잘 됐었는뎀...


public S3Util() {

		try {
		credentialsProvider = new ClasspathPropertiesFileCredentialsProvider( "credentials.properties" );
		credentials = credentialsProvider.getCredentials();
		s3 = new AmazonS3Client( credentials ); // 클라이언트 구성

		northEast1 = Region.getRegion( Regions.AP_NORTHEAST_1 );

		s3.setRegion( northEast1 );

		} catch (Exception e) {
			e.printStackTrace();

		}
	}





Posted by 긍뎡
,