전화번호, 사무실번호, 팩스번호를 기존에 input text 한 칸 이던 것을

dash(-) 기준으로 세 칸으로 나눠서 입력받아 달라는 요구사항이 들어왔다.

 

프런트 단 템플릿 엔진은 타임리프.... 경험이 거의 전무하다..

 

각각 번호는 이렇게 들어가 있다.

 

  1. 전화번호가 있으면 '-' 기준으로 input 칸이 세 칸으로 나뉘어야 한다.
  2. 공백인 데이터 or null 값인 데이터라면 공란의 세칸이 보여야 한다.

 

타임리프 생 초짜가 창피하지만 코딩한 결과는 이렇다.

 

* 사무실 전화번호 기준

<th scope="row">사무실전화번호</th>
	<td th:if="${not #strings.isEmpty(user.office_phone)} ">
		<input id="office_phone" style="display:none;" type="text" th:field="*{office_phone}" title="사무실 전화번호를 입력해주세요"/>
		<input id = "office_phone1" style="width:30%" type="text" th:value="${#strings.arraySplit(user.office_phone,'-')[0]}" /> -
		<input id = "office_phone2" style="width:30%" type="text" th:value="${#strings.arraySplit(user.office_phone,'-')[1]}" /> -
		<input id = "office_phone3" style="width:30%" type="text" th:value="${#strings.arraySplit(user.office_phone,'-')[2]}" />
	</td>
	<td th:if="${user.office_phone == null or #strings.isEmpty(user.office_phone)}">
		<input style="display:none;" type="text" th:field="*{office_phone}" title="사무실 전화번호를 입력해주세요" />
		<input id = "office_phone1" style="width:30%" type="text" /> -
		<input id = "office_phone2" style="width:30%" type="text" /> -
		<input id = "office_phone3" style="width:30%" type="text" />
	</td>
 

 

* 결과

 

 

 

* 어려웠던 부분

1. 타임리프 null 체크 구문이 쉬우면서도 어려웠다....

<td th:if="${not #strings.isEmpty(user.office_phone)} ">
<td>

<td th:if="${logodiTeacher.office_phone == null or #strings.isEmpty(user.office_phone)}">
</td>
 

 

 

':D > 공부해야할 것' 카테고리의 다른 글

tomcat  (0) 2018.03.21
maven 이용한 프로젝트 관리 방법  (0) 2018.03.21
다중 스레드  (0) 2015.01.10
Migration(마이그레이션)  (0) 2014.12.22
Posted by 긍뎡
,

잘 쓰고 있던 로컬 서버용 사이트가 메인 페이지 진입 시 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 긍뎡
,

 

잘 쓰고 있던 큐브리드 매니저에서 갑자기 관리모드로 접속 시 실패가 뜸…

얼른 데이터 이관하고 C에 설치한 데이터 삭제를 해야… 하드 용량 확보해서 뭔 일이든 하는데 답답쓰

 

 

1. 큐브리드 서비스 상태 확인

- 커맨드 창 관리자 권한으로 실행후 [cubrid service status] 명령어로 확인.. 브로커랑 마스터 매니저랑 다 정상 동작 중인데…................

 

2. [tasklist] 로 프로세스 확인..

 

큐브리드 프로세스가 뭐가 많다.

필터링 해서 다시 찾아보자.

[tasklist /fi "IMAGENAME eq cub*"]

 

큐브리드 관련 프로세스만 출력.. cubrid_admin.exe , cubrid.exe 서비스가 안 보인다…

 

2. 서비스 종료 후 재기동

[cubrid service stop] (시간 좀 걸림)

[cubrid service start]

 

3. 프로세스 재확인

[tasklist /fi "IMAGENAME eq cub*"]

 

보인다 보여

 

4. 큐브리드 매니저 재접속

?? 근데도 안된다??

 

5. cubrid_admin.exe 직접 실행

cub_admin.exe 실행파일을 관리자 권한으로 직접 실행해준다..

 

6. 큐브리드 매니저 재접속 2트

결론 : 강종 후 재시작이 답이다

결론2 : C드라이브에 DB 설치한 전임자 찾고 싶다.

':D > Database' 카테고리의 다른 글

[MongoDB] find sort 쿼리  (0) 2016.02.11
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 긍뎡
,

tomcat

:D/공부해야할 것 2018. 3. 21. 22:54

server.xml
log

':D > 공부해야할 것' 카테고리의 다른 글

[Thymeleaf] 문자열 나누기(arraySplit)  (0) 2024.11.15
maven 이용한 프로젝트 관리 방법  (0) 2018.03.21
다중 스레드  (0) 2015.01.10
Migration(마이그레이션)  (0) 2014.12.22
Posted by 긍뎡
,

알고 써야하지 않겠녀..

':D > 공부해야할 것' 카테고리의 다른 글

[Thymeleaf] 문자열 나누기(arraySplit)  (0) 2024.11.15
tomcat  (0) 2018.03.21
다중 스레드  (0) 2015.01.10
Migration(마이그레이션)  (0) 2014.12.22
Posted by 긍뎡
,

[JAVA] Tokenizer 예제

:D/Java 2016. 10. 5. 14:58
StringTokenizer tokenizer = new StringTokenizer(dto.getColors(), "/");
while (tokenizer.hasMoreTokens()) {
String color = tokenizer.nextToken();
chartColorList.add(color);
}


Posted by 긍뎡
,

- network 상태 모니터링 (already use 이딴 거 뜨면 확인)  : netstat | grep [port]

- RabbitMQ 환경 확인 : rabbitmqctl environment | grep tcp


Posted by 긍뎡
,