Ajax mobile 에서는 아래와 같은 형태로 loader 가 존재하는데 문제는 기본스타일이 구식이므로 커스텀이 필요한 경우가 많다. 


.ui-loader .ui-icon-loading {
  background-color: #000; 
  display: block;
  margin: 0;
  width: 2.75em;
  height: 2.75em;
  padding: .0625em;
  -webkit-border-radius: 2.25em;
  border-radius: 2.25em;
}

.ui-icon-loading {
  background: url(images/ajax-loader.gif);
  background-size: 2.875em 2.875em;
 }


위의 항목들중에 일부를 변경하여 쉽게 변경한다. 

보통 이미지를 바꾸고 싶어하므로 .ui-icon-loading 의 url 항목을 아래와 같이 변경한다 .


1. 

.ui-loader .ui-icon-loading { background-color: transparent; }


.ui-icon-loading { background: url("더_url.gif"); }



2. JQuery 모바일에서 이미 HTML으로 커스텀하에 지정하는 기능이 있는데 위의 경우보단 약간 까다롭다


자세한건 아래 링크를 참조해보자. 예제 소스를 보면 쉽게 따라 할수 있다.

http://demos.jquerymobile.com/1.4.5/loader/#CustomHTML



참조:

1. http://stackoverflow.com/questions/23849604/how-to-change-the-default-jquery-mobile-loading-icon

화면 영역에서 클릭한 영역마다 HTML 엘리멘트가 겹칠경우 겹치 영역에 따라 다른 이벤트를 처리하기 위해서는 이벤트 구분이 필요하다.


픽셀단위로 영역을 짜르는 경우는 해상도가 디바이스마다 다른 요즘환경에서는 사용하기 어려운 방법이기 때문에 

다른방법으로 영역을 잡는 방법이 있지 않을까 해서 자바스크립트 레퍼런스를 뒤지던중 아래와 같은 방법으로 처리하게되었다.


$("selector").click(function(evt) { var target = evt.originalEvent.target; if (target.nodeName == "CANVAS") { // 클릭한 영역이 캔버스일 경우 처리 } else if (target.nodeName == "DIV") { // 클릭한 영역이 DIV일 경우 처리 } });


기존 클릭 영역을 동적으로 계산하는 방식은 정확도가 매우 부정확했지만 이와 같은 방법으로 

다른 구준자를 넣어 동일한 엘리먼트들에 대해서도 다른 방식으로 처리하는 방식으로 응용할수 있지 않을까 생가한다 .

Spring Profiles를 통한 환경별 설정

Spring에서는 spring.profiles.active라는 프로퍼티를 이용해 현재 활성화된 프로파일(환경)을 지정할 수 있습니다. 이를 활용하면 개발(development), 운영(production), 로컬(local) 등 다양한 환경마다 다른 설정파일을 로드하거나 다양한 빈 설정을 적용할 수 있습니다.

주의사항

  • Maven Profile과는 별개의 개념이므로 혼동하지 않도록 주의하세요. Maven Profile은 빌드 시점에 적용되는 것이며, Spring Profile은 런타임 시점에 활성화되는 설정입니다.
    Maven Profile 설정은 관련 문서를 참고하세요.

프로파일 설정 방법

다음은 spring.profiles.active 값을 설정하는 여러 가지 방법입니다.

  1. 빌드 시 JVM 프로퍼티를 통한 설정

     java -jar -Dspring.profiles.active=dev my-app.jar

    위와 같이 실행 시에 -D 옵션으로 프로파일을 지정할 수 있습니다.

  2. web.xml을 통한 설정

    web.xml 파일 내 context-param을 통해 프로파일을 지정할 수 있습니다.

     <context-param>
         <param-name>spring.profiles.active</param-name>
         <param-value>production</param-value>
     </context-param>
  3. Tomcat 기동 스크립트(catalina.sh)에서 설정

    catalina.shJAVA_OPTS 설정에 프로파일을 추가합니다.

     JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=local"
  4. Tomcat의 catalina.properties를 통한 설정

    catalina.properties 파일에 다음과 같이 추가할 수 있습니다. 이때 -D를 빼고 작성해야 합니다.

     spring.profiles.active=dev

중복된 설정에 대한 우선순위

경험적으로 확인한 결과, web.xml에 설정한 프로파일이 최우선적으로 적용됩니다. 즉, Tomcat 설정 파일 등에 프로파일이 지정되어 있더라도 web.xml이 우선하기 때문에, 웹 애플리케이션 내부에 지정된 프로파일이 있다면 외부 설정은 무시될 수 있습니다.

프로파일별 Properties 파일 로딩

spring.profiles.active에 따라 다른 properties 파일을 읽도록 설정할 수 있습니다. 예를 들어 development.properties, production.propertiesclasspath 아래에 두고, 활성화된 프로파일에 따라 알맞은 파일을 로드하도록 할 수 있습니다.

아래 예제에서는 PropertiesFactoryBean을 사용하여 활성화된 프로파일에 맞춰 프로퍼티를 동적으로 로딩합니다.

<bean id="config" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>classpath:/#{systemProperties['spring.profiles.active']}.properties</value>
        </list>
    </property>
</bean>

예를 들어, spring.profiles.active=dev로 설정되어 있다면 dev.properties 파일을 로딩하게 됩니다.

추가 팁: 로컬(Spring) 환경 설정을 Tomcat에서 사용할 경우

로컬 개발 환경에서 Tomcat을 이용해 어플리케이션을 기동하는 경우에도 spring.profiles.active를 적용할 수 있습니다. 이 경우 Eclipse IDE에서 Tomcat 실행 환경 설정을 통해 프로파일을 지정하거나, 위에서 언급한 catalina.sh, catalina.properties 등을 활용할 수 있습니다.

참고 자료:

  1. Setting spring.profile variable (StackOverflow)
  2. jdm.kr 블로그 포스팅

위와 같이 Spring Profiles를 활용하면 환경별로 서로 다른 설정을 간편하게 관리할 수 있으며, 개발-테스트-운영 환경 전환 시 유연한 대응이 가능합니다.

스프링을 사용하다보면 webapps 폴더안에 파일들에 대해 접근해야할 필요가 있다. 

Servletcontext 를 이용한 접근 방법이 있으나 이방법은 Servletcontext 에 의존적이라는 단점이 있다. 

특정 동작만을 위한 모듈을 덧붙일 경우 다른 방법이 필요한데 스프링에서는 이방법 또한 제공한다. 바로 코드로 보자 


import java.io.IOException;
import java.io.InputStream;

import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

public class ArbitraryResourceLoader implements ResourceLoaderAware {
    private ResourceLoader resourceLoader;

    public void test() throws IOException {
        Resource resource = resourceLoader.getResource("file:webapps/config.txt");
    	InputStream is = resource.getInputStream();
    	try{
    		int i=0;
            while((i=is.read())!=-1)
            {
               char c=(char)i;
               System.out.print(c);
            }
        }catch(IOException e){
        	 e.printStackTrace();
         }finally{
            
           if(is!=null)
            is.close();
         }
    }

	@Override
	public void setResourceLoader( ResourceLoader resourceLoader) {
		this.resourceLoader = resourceLoader;		
	}

}


그리고 빈설정 파일에 아래와 같이 설정해준다 class 경로 같은 경우는 자기자신의 프로젝트에 따라 바뀔것이다

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 
	 <bean id="arbitraryResourceLoader" class="org.test.sample.ArbitraryResourceLoader"/>

</beans>


JavaConfig로도 쉽게 응용할수 있으리라 생각한다. 

프로젝트를 진행하다보면 파일안에 Properties 파일들을 저장해놓고 사용하는 일들이 자주 생긴다. 

가장 간단하게 사용하는 방법은 XML 혹은 JSON을 특정 경로에 넣고 파싱하는 방법이 있으나 설정파일을 사용하는 곳이 많아질 경우 복잡하다. 

스프링 프레임워크는 프레임워크 단에서 Properties 를 설정하는 방법을 가지고 있다.


Spring 설정 xml 안에 아래와 같은 설정을 추가한다. 

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd">
	<context:component-scan base-package="com.tutorialspoint" />

	 <!-- context:property-placeholder location="classpath:database.properties"  /!-->
	<context:property-placeholder location="/WEB-INF/*.properties" />

</beans>


그럼 자동으로 WEB-INF 경로 아래에 있는 *.properties 밸류들이 로드된다.


스프링 내에서 사용하기 위해선 아래와 같이 사용한다.

@Component
class MyClass {
  @Value("${my.property.name}")
  private String[] myValues;
}


만약 위의 설정 방법이 안된다면 수동으로 빈을 생성해준다. 


<bean id="myProperties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath*:my.properties</value>
    </list>
  </property>
</bean>

그리고 Resource 파일을 이용해서 불러들인다. 

@Component
class MyClass {
  @Resource(name="myProperties")
  private Properties myProperties;

  @PostConstruct
  public void init() {
    // do whatever you need with properties
  }
}



* 추가 

Project 진행시에 보통 개발, 테스트, 프로덕션 서버별로 배포를 다르게한다. 

각각의 환경마다 다른 설정값을 가지므로 배포시마다 사용하는 property 의 이름을 변경해주는 것은 여간 귀찮은 일이 아니다

다행이 스프링에서는 Profile 이라고 환경마다 다른 설정을 사용할수 있는 기능이 이미 내장되어있다. 

경로 부분을 지정해주고 ${spring.profiles.active} 코드를 넣어주면 Profile에 따라 설정값이 다르게 쓰인다. 

아래는 예제코드를 보면 profile 을 사용하시는 분들이라면 바로 이해가 갈것이다. 

<context:property-placeholder location="classpath:${spring.profiles.active}.properties" />



참고: 

1. http://jijs.tistory.com/entry/spring-%EC%84%A4%EC%A0%95-xml%EA%B3%BC-%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-properties-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

2. http://stackoverflow.com/questions/9259819/how-to-read-values-from-properties-file

3. http://nkjava.blogspot.kr/2013/07/springmvc-read-property-in-jsp.html

4. http://stackoverflow.com/questions/10669474/load-properties-file-in-spring-depending-on-profile

+ Recent posts