Programming/JAVA2014.07.31 16:06

서버 환경

CentOS 6.5

TOMCAT 7

java version "1.7.0_55"


1. 간단하게 vi catalina.sh 또는 vi setenv.sh 설정함

----------------------------------------

CATALINA_OPTS="$CATALINA_OPTS

-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx 

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=9080

-Dcom.sun.management.jmxremote.rmi.port=9081

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false"

----------------------------------------


2. 인증 방식 넣기 (설정시 access,password파일 추가등록)

------------------------------------------------

CATALINA_OPTS="$CATALINA_OPTS

-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx 

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.port=9080

-Dcom.sun.management.jmxremote.rmi.port=9081

-Dcom.sun.management.jmxremote.authenticate=true

-Dcom.sun.management.jmxremote.access.file=$CATALINA_HOME/conf/jmxremote.access

-Dcom.sun.management.jmxremote.password.file=$CATALINA_HOME/conf/jmxremote.password

------------------------------------------------


※ 계정등록 ( 구글링해보니까 LDAP 연동 방법도 있는 듯 필요시 구글링해볼것!! )

https://code.google.com/p/tungsten-replicator/source/browse/trunk/commons/conf/sample.jmxremote.access?spec=svn1148&r=1148


vi jmxremote.access ( 계정에 맞게 readonly 또는 readwrite )

------------------------------------------------

admin readwrite \

      create javax.management.moitor.*,javax.management.timer.* \

      unregister

------------------------------------------------


vi jmxremote.password

------------------------------------------------

admin password

------------------------------------------------




3. 에러발생시 처리 방안

※ Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: dev-was01: dev-was01: Name or service not known

 => vi /etc/hosts 아래 host 추가하면됨

     127.0.0.1   localhost dev-was01

※ shutdown시 Error: Exception thrown by the agent : java.lang.NullPointerException

 => CATALINA_OPTS 아닌 JAVA_OPTS 에 넣으면 Exception 에러발생


※ catalina-jmx-remote.jar 필요시 톰캣사이트에서 다운르도 후 lib폴더에 넣기!

 => http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.53/bin/extras/




4. Apache 메뉴얼 listener was configured in server.xml 추가하는 방법


URL : http://tomcat.apache.org/tomcat-7.0-doc/config/listeners.html

AttributeDescription
rmiRegistryPortPlatform

The port to be used by the JMX/RMI registry for the Platform MBeans. This replaces the use of thecom.sun.management.jmxremote.port system property that should not be set when using this listener.

rmiServerPortPlatform

The port to be used by the Platform JMX/RMI server.

rmiBindAddress

The address of the interface to be used by JMX/RMI server. This option is incompatible with setting the system propertycom.sun.management.jmxremote.ssl to true.

useLocalPorts

Should any clients using these ports be forced to use local ports to connect to the the JMX/RMI server. This is useful when tunnelling connections over SSH or similar. Defaults to false.

Using file-based Authentication and Authorisation

If this listener was configured in server.xml as:

  <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
          rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

with the following system properties set (e.g. in setenv.sh):

  -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password
  -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access
  -Dcom.sun.management.jmxremote.ssl=false

$CATALINA_BASE/conf/jmxremote.password containing:

admin letmein

$CATALINA_BASE/conf/jmxremote.access containing:

admin readwrite

then opening ports 10001 (RMI Registry) and 10002 (JMX/RMI Server) in your firewall would enable jconsole to connect to a Tomcat instance running behind a firewall using a connection string of the form:

service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi

with a user name of admin and a password of letmein.



Posted by 시니^^
Programming/JAVA2014.06.25 14:27

개발후 배포시 war로 압축해서 배포하는 그때


서버환경(개발/운영)에 따라서 DB접근 정보나 기타 cfg 설정이 다른 경우가 있다


그런 경우 PropertyPlaceholderConfigurer등 설정 정보를 다르게 보게 해야되는 데


구글링 해보니까 아래 Stackoverflow 몇가지를 제시하고있다. 


http://stackoverflow.com/questions/11735526/spring-loading-application-properties-based-on-tomcat-servlet-contect-definition


그중에 괜찮다고 생각되는 두가지 방안


1. 아래 방법처림 배포될 서버에 예상해서 설정해서 여러개로 구성하는 방법

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:your-production-config.properties</value>
            <value>file:C:/Users/${user.name}/test-application.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>        
</bean>


2. ${catalina.home} 변수 이용한 Tomcat 디렉토리의 conf에 설정을 따로 구성해두는 방안

<context:property-placeholder location="file:${catalina.home}/conf/myFirst.properties" ignore-unresolvable="true" />
<context:property-placeholder   location="classpath:second.properties"  ignore-unresolvable="true"  />
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
    <value>file:${catalina.home}/conf/dbpool.properties</value>
</property>
</bean>


개발환경에서 한개 서버에 버젼에 따라서 여러 톰캣을 띄워야 할 경우에는 2번 방법이 괜찮은 것 같다.

Posted by 시니^^
TAG spring, Tomcat
Programming/JAVA2014.06.24 11:56

form / Ajax 통해서 URL or Get 데이터 encodeURIComponent 보낼때에


한글이 제대로 인코딩이 안된다고하면


web.xml에 아래 해당 filter 정보를 입력해준다


그리고 filter-name의 정보를 해당 url pattern에 mapping 해주면된다 servlet에 따라서 mapping 해줄것!!

일반적으로 전체가 다 UTF-8 환경이라면 /* 하면될듯하다.


  
    encodingFilterUTF8
    org.springframework.web.filter.CharacterEncodingFilter 
    
        encoding
        UTF-8
    
  
  
    encodingFilterUTF8
    /*
  
  
Posted by 시니^^
Programming/JAVA2014.04.30 11:22

SQL 쿼리 등록하는 xml 부분의 경우 비교연산자를 써야할 때가 있다.


근데 XML에서 <,>등 비교연산자의 경우 XML규칙상 에러 나기때문에 SQL문을 CDATA로 묶으면된다


아래 예시처럼

<![CDATA[

SELECT * FROM table WHERE id > 1

]]>


XML CDATA에 설명은 아래 링크로 ㅎㅎ

http://www.w3schools.com/xml/xml_cdata.asp


XML 이라는걸 전혀 신경안쓰고... MSSQL 쿼리가 잘못되었나 엄청 헤맸네 ㅠㅠ;;


처음 spring으로 개발 하면서 어느정도 다 아는 기본지식인것들인데.. 엉뚱한걸로 고생하네 이런 ㅋ;;

Posted by 시니^^
Programming/JAVA2014.04.17 21:01

1. pom.xml 

https://code.google.com/p/json-simple/

http://mvnrepository.com/artifact/net.minidev/json-smart

<dependency>
    <groupId>net.minidev</groupId>
    <artifactId>json-smart</artifactId>
    <version>2.0-RC3</version>
</dependency>
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>


2. TEST 코드

import java.util.logging.Logger;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
//import net.minidev.json.JSONObject;
//import net.minidev.json.parser.JSONParser;
//import net.minidev.json.parser.ParseException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class test {
    Logger logger = Logger.getLogger("xxx");
    
    @RequestMapping("/test")
    public String tests() {
        
        //JSON => String
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("value1", 1111);
        jsonObj.put("value2", 2222);
        jsonObj.put("value3", 3333);
        logger.info( "Info : "+jsonObj.toString());
        
        //String => JSON 
        String jsonString = jsonObj.toString();
        JSONParser parser = new JSONParser();
        try {
            Object obj = parser.parse(jsonString);
            jsonObj = (JSONObject) obj;
            logger.info( "Info : "+jsonObj.get("value1"));
            logger.info( "Info : "+jsonObj.get("value2"));
            logger.info( "Info : "+jsonObj.get("value3"));
        }catch ( ParseException e ){
            
        }
        
        return "test";
        
    }
}

==============결과=====================================

정보: Info : {"value3":3333,"value1":1111,"value2":2222}

정보: Info : 1111

정보: Info : 2222

정보: Info : 3333

=======================================================


3. String JSONObject 좀더 간단하게

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>



import java.util.logging.Logger;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class test {
    Logger logger = Logger.getLogger("xxx");
    
    @RequestMapping("/test")
    public String tests() {
        
        //String => JSON 
        String jsonString = "{\"value3\":3333,\"value1\":1111,\"value2\":2222}";
        JSONObject jsonObj = new JSONObject(jsonString);
        logger.info( "Info : "+jsonObj.get("value1"));
        logger.info( "Info : "+jsonObj.get("value2"));
        logger.info( "Info : "+jsonObj.get("value3"));
        return "test";
        
    }
}
Posted by 시니^^
Programming/JAVA2014.04.15 15:53


아래처럼 #{}처 처리시 

DB에 SELECT id,user_id,state FROM UserInfo WHERE user_id = ?

PreparedStatement등의 처리이지만

01.<select id="getUserInfo" parametertype="hashmap" resultmap="UserInfoResultMap">
02.SELECT
03.id,
04.user_id,
05.state
06.FROM
07.UserInfo
08.WHERE
09.user_id = #{userId}
10.</select>


아래와 같이 ${}처리시에는 쿼리 구문에 대한 정의가됨

DB에 SELECT id,user_id,state FROM UserInfo WHERE user_id = user_id_value


01.<select id="getUserInfo" parametertype="hashmap" resultmap="UserInfoResultMap">
02.SELECT
03.id,
04.user_id,
05.state
06.FROM
07.UserInfo
08.WHERE
09.user_id = ${userId}
10.</select>


사용예시는 같이 동적인 column 및 table네임 생성시 사용


01.<select id="getUserInfo" parametertype="hashmap" resultmap="UserInfoResultMap">
02.SELECT
03.id,
04.user_id,
05.${state_column}
06.FROM
07.${table_name}
08.WHERE
09.user_id = #{userId}
10.</select>


Posted by 시니^^
Programming/JAVA2014.04.15 15:18

1. 기존 parameterType="String" 파라미터 한개로 처리


UserInfoMapper.java

public interface UserInfoMapper {
    public UserInfo getUserInfo(String userId);
}


UserInfoMapper.xml

<select id="getUserInfo" parametertype="String" resultmap="UserInfoResultMap">
SELECT
    id,
    user_id,
    state
FROM
    UserInfo
WHERE
    user_id = #{userId}
</select>

UserInfoService.java

String userId = "user_id_value";
userInfo = userInfoMapper.getUserInfo(userId);

※ 단일 parameterType 로 String userId값 넣음


2.  parameterType HashMap을 이용해서 여러개 넣기


UserInfoMapper.java

public interface UserInfoMapper {
    public UserInfo getUserInfo(HashMap<String, Object> map);
}

UserInfoMapper.xml

<select id="getUserInfo" parametertype="hashmap" resultmap="UserInfoResultMap">
SELECT
    id,
    user_id,
    state
FROM
    UserInfo
WHERE
    user_id = #{userId}
AND
    state = #{state}
</select>

UserInfoService.java

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("userId", "user_id_value");
map.put("state", "state_value");
userInfo = userInfoMapper.getUserInfo(map);


3. 2번과 비슷하지만 기존 userInfo 도메인 이용


UserInfoMapper.java

public interface UserInfoMapper {
    public UserInfo getUserInfo(HashMap<String, Object> map);
}

UserInfoMapper.xml

<select id="getUserInfo" parametertype="hashmap" resultmap="UserInfoResultMap">
SELECT
    id,
    user_id,
    state
FROM
    UserInfo
WHERE
    user_id = #{user.userId}
AND
    state = #{user.state}
</select>

UserInfoService.java

UserInfo userInfo = new UserInfo();
userInfo.setUserId("user_id_value");
userInfo.setState("state_value");

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("user", userInfo);

userInfo = userInfoMapper.getUserInfo(map);

4. Param 이용


UserInfoMapper.java
public interface UserInfoMapper {
    public UserInfo getUserInfo(@Param("userId") String userId, @Param("state") int state);
}
UserInfoMapper.xml
<select id="getUserInfo" resultmap="UserInfoResultMap">
SELECT
    id,
    user_id,
    state
FROM
    UserInfo
WHERE
    user_id = #{userId}
AND
    state = #{state}
</select>
UserInfoService.java
String userid ="user_id_value";
int state = 0;
userInfo = userInfoMapper.getUserInfo(String userid,int state);


Posted by 시니^^
Programming/JAVA2014.04.11 16:59

1. Help => Install new software 

   또는 아래 Help => Eclipse Marketplace 에서 svn 검색 후 설치




2. 설치하고 나니까... 아래 SVN Connector.에러 나옴

---------------------------------------------------------------------------------------------------

Share project was failed.

Selected SVN connector library is not available or cannot be loaded.

If you selected native JavaHL connector, please check if binaries are available or install and select pure Java Subversion connector from the plug-in connectors update site.

If connectors already installed then you can change the selected one at: Window->Preferences->Team->SVN->SVN Connector.

----------------------------------------------------------------------------------------------------

※ Connection에 필요한 SVN Kit, JavaHL라이브러리 경우 EPL(Eclipse Public License) 적용될 때 법적 문제의 소지로 인해 별도로 설치할 수 있도록 배포되고 있다고함.



4. SVN Kit, JavaHL라이브러리 추가 Install 로 진행(Help => Install new software)

 => 추가 저장소 등록(Add Repository)

     http://community.polarion.com/projects/subversive/download/eclipse/3.0/update-site/



Posted by 시니^^
TAG Eclipse, STS, svn
Programming/JAVA2014.04.09 22:16

1. Microsoft에서Microsoft SQL Server JDBC 다운로드

1) SQL Server JDBC 드라이버 4.0 (SQL Server 2000 버전 지원 안한다고함) 

URL : http://www.microsoft.com/ko-kr/download/details.aspx?id=11774


2) SQL Server JDBC 드라이버 3.0

URL : http://www.microsoft.com/ko-kr/download/details.aspx?id=21599



2. sqljdbc.jar와 sqljdbc4.jar 차이점

http://msdn.microsoft.com/ko-kr/library/ms378422.aspx

 sqljdbc.jar

 라이브러리는 JDBC 3.0을 지원합니다. 

 라이브러리에는 JRE(Java Runtime Environment) 버전 5.0이 필요합니다.

 JRE 6.0에서 sqljdbc.jar을 사용하면 데이터베이스에 연결할 때 예외가 발생합니다.

 JDBC 드라이버는 JRE 1.4를 지원하지 않습니다.

 JDBC 드라이버를 사용하려면 JRE 1.4를 JRE 5.0 또는 JRE 6.0으로 업그레이드해야 합니다. 

 응용 프로그램이 JDK 5.0 이상과 호환되지 않아 다시 컴파일해야 하는 경우도 있습니다. 

 자세한 내용은 Sun Microsystems 웹 사이트의 설명서를 참조하십시오.

 sqljdbc4.jar

 라이브러리는 JDBC 4.0을 지원합니다. 

 이 라이브러리에는 sqljdbc.jar의 모든 기능과 함께 새로운 JDBC 4.0 메서드가 포함되어 있습니다.

 클래스 라이브러리를 사용하려면 JRE(Java Runtime Environment) 버전 6.0이 필요합니다.

 JRE 1.4 또는 5.0에서 sqljdbc4.jar을 사용하면 예외가 발생합니다.

 응용 프로그램을 JRE 6.0에서 실행해야 하는 경우에는 JDBC 4.0 기능을 사용하지 않더라도  sqljdbc4.jar을 사용하십시오.

JDBC 드라이버는 모든 주요 Sun 호환 Java 가상 컴퓨터에서 작동하고 지원되도록 설계되어 있지만 테스트는 Sun JRE 5.0 이상에서 수행됩니다


3. cmd에서 mvn install

C:\>mvn install:install-file -Dfile=sqljdbc.jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0 -Dpackaging=jar

C:\>mvn install:install-file -Dfile=sqljdbc4.jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0 -Dpackaging=jar


4. pom.xml에 등록

        <!-- MSSQL -->

        <dependency>

            <groupId>com.microsoft.sqlserver</groupId>

            <artifactId>sqljdbc4</artifactId>

            <version>4.0</version>

        </dependency>

Posted by 시니^^
Programming/JAVA2014.04.09 22:15

1. Maven 다운로드 사이트

http://maven.apache.org/download.cgi

Maven 3.2.1 (Binary zip) apache-maven-3.2.1-bin.zip 다운로드


2. 환경변수 설정

※ 시스템=> 고급=>환경변수 설정에 MAVEN_HOME/PATH 설정 또는 아래와 같이 cmd에서 SET실행


SET MAVEN_HOME=D:\apache-maven-3.2.1

SET PATH=%PATH%;%MAVEN_HOME%\bin


D:\>mvn --version

Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-15T02:37:52+09:00)

Maven home: D:\apache-maven-3.2.1\bin\..

Java version: 1.8.0, vendor: Oracle Corporation

Java home: C:\Program Files\Java\jdk1.8.0\jre

Default locale: ko_KR, platform encoding: MS949


※ java_home not found in your environment 에러 발생시 JAVA HOME 추가
SET JAVA_HOME=C:\Program Files\Java\jdk1.7.0_04
SET PATH=%PATH%;%JAVA_HOME%\bin

3. 해당 workspace 에 프로젝트가서 mvn 콘솔 실행하면됨
mvn clean
mvn compile war:inplace

4. 이클립스에 해당 버전 적용시 설정에서 아래와 같이 add 버튼 눌러서 추가하면됨



※ 아래 slf4j 실패시 적용
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.


Posted by 시니^^

티스토리 툴바