앱)springframework annotation 예제

Posted by HULIA(휴리아)
2018. 1. 25. 16:18 백엔드개발/자바스프링
@transactional(rollbackFor={Exception.class})

@component

@service

@repository("DAO")

@Resource(name="sqlSessionTemplte")

@Autowired

앱)메이븐 maven pom.xml 예제

Posted by HULIA(휴리아)
2018. 1. 25. 16:10 백엔드개발/자바스프링
<project xmlns:"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>Batch</groupId>
  <artifactId>Batch</artifactId>
  <version>1.0.0</version>

   <properties>
     <lib.dir>lib</lib.dir>
     <conf.dir>conf</conf.dir>
     <jar.name>JobManager</jar.name>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<ch.qos.logback-version>1.1.7</ch.qos.logback.version>
<org.slf4j-version>1.7.21</org.slf4j-version>
<powermock.version>1.7.0</powermock.version>
<mockito.version>1.10.17</mockito.version>
<junit.version>4.12</junit.version>
<org.springframework-version>3.2.17.RELEASE</org.springframework-version>

<!-- slf4j와 logback과 상충된다-->
<org.logback-extensions-version>0.1.4</org.logback-extensions-version>
</properties>

<dependencies>
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.2.6.RELEASE</version>
       <exclusions>
           <exclusion>
               <groupdId>commons-logging</groupId>
               <artifactId>commons-logging</artifactId>
             </exclusion>
       </exclusions>

   </dependency>
   
   <dependency>
       <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.2.6.RELEASE</version>
</dependency>

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>4.2.6.RELEASE</version>
</depenency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.data</groupId>
 <artifactId>spring-data-commons<artifactId>
<version>1.11.4.RELEASE</version>
</dependecy>

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.42</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.1.0</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>

<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>

<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>

<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${ch.qos.logback-version}</version>
</dependency>

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${ch.qos.logback-version}</version>
</dependency>


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</test>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>

<!--logback 4개 대신에 요거 하나를 써도 된다 springframework에서는 -->
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>${org.logback-extensions-version}</version>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>




</dependencies>


<build>
  <plugins>     
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-comiler-plugin</artifactId>
      <version>3.1</version>
      <configuration>
       <source>1.7</source>
       <target>1.7</target>
       <encoding>UTF-8</encoding>
      </configuration>
    </plugin>


<plugin>
     <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.4</version>
      <executions>
          <execution>
             <id>copy-resources-conf<id>
             <phase>prepare-package</phase>
             <goals><goal>copy-resources</goal></goals>
             <configuration>
                      <outputDirectory>${project.build.directory}/conf</outputDirectory>
        <resources><resource>
               <directory>src/main/resources</directory>
           </resource></resources>
         </configuration>
    </execution>
    <execution>
       <id>copy-resources-bin</id>
       <phase>prepare-package</phase>
        <goals><goal>copy-resources</goal></goals>
        <configuration>
             <outputDirectory>${project.build.directory}/bin</outputDirectory>
    <resources><resource>
             <directory>src/main/bin</directory>
       </resource></resources>
      </configuration>
      </execution>
     </executions>
   </plugin>


<plugin>
     <groupId>org.codehaus.mojo</groupId>
      <artifactId>build-helper-maven-plugin</artifactId>
      <version>1.11</version>
      <executions>
         <execution>
                 <id>timestamp-property</id>
                 <phase>validate</phase>
                <goals><goal>timestamp-property</goal></goals>
               <configuration>
                     <name>current.time</name>
                     <pattern>yyyyMMddHHmmss</pattern>
                 <locale>ko_KR</locale>
                 <timeZone>Asia/Seoul</timeZone>
             </configuration>
          </execution>
        </executions>
</plugin>




<plugin>
     <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.4</version>
      <configuration>
            <finalName>JobManager</finalName>
            <excludes>
                  <exclude>**/*.properties</exclude>
 <exclude>**/logback*.xml</exclude>
 <exclude>**/spring/**</exclude>
 <exclude>**/mybatis/**</exclude> 
</excludes>
<archive>
   <manifest>
        <addDefaultImplmentationEntries>true</addDefaultImplementationEntries>
<mainClass>com.test.jobmanager.JobManager</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>${lib.dir}/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>${conf.dir}/</Class-Path>
<Revision>${build.number}</Revision>
<Build-Date>${current.time}</Build-Date>
</manifestEntries>
</archive>
</configuration>
</plugin>




<plugin>
     <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
          <execution>
              <id>copy-dependencies</id>
              <phase>package</phase>
              <goals><goal>copy-dependencies</goal></goals>
            </execution>
         </executions>
         <configuraion>
               <outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
</configuraion>
</plugin>




<plugin>
     <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.4</version>
      <configuration>
          <descriptors><descriptor>src/main/assemblies/package.xml
          </descriptor></descriptors>
         <finalName>${project.artifactId}-${current.time}</finalName>
 <appendAssemblyId>false</appendAssemblyId>
</configuration>
<executions>
   <execution>
      <id>tarball</id>
       <phase>package</phase>
       <goals><goal>single</goal><goals>
    </execution>
</executions>
</plugin>





<plugin>
     <groupId>org.codehaus.mojo</groupId>
      <artifactId>build.helper-maven-plugin</artifactId>
      <version>1.11</version>
      <executions>
          <execution>
              <id>timestamp-property</id>
              <phase>validate</phase>
              <goals><goal>timestamp-property</goal></goals>
          <configuraion>
              <name>current.time</name>
              <pattern>yyyyMMddHHmmss</pattern>
               <locale>ko_KR</locale>
               <timeZone>Asia/Seoul</timeZone>
          </configuraion>
          </execution>
       </executions>
</plugin>





<plugin>
     <groupId></groupId>
      <artifactId></artifactId>
      <version></version>






</plugin>




  </plugins>
  <pluginManagement>
      <plugins>
            <!-- This plugin's configuraion is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. -->
       <plugin>
           <groupId>org.eclipse.m2e</groupId>
          <artifactId>lifecycle-mapping</artifactId>
          <version>1.0.0</version>
          <configuration>
              <lifecycleMappingMetadata>
                  <pluginExecutions>
                      <pluginExecution>
                         <pluginExecutionFilter>
    <groupId>org.codehaus.mojo</groupId>
     <artifactId>build-helper-maven-plugin</artifactId>
      <versionRange>[1.11,)</versionRange>
       <goals><goal>timestamp-property</goal></goals>
  </pluginExecutionFilter>
<action><ignore /></action>
                     </pluginExecution>
                   </pluginExecutions>
</lifecycleMappingMetadata>
          </configuraion>
        </plugin>
       </plugins>
  </pluginManagement>
 

</build>
</project>

앱)custom Exception class 클래스 예제

Posted by HULIA(휴리아)
2018. 1. 25. 14:56 백엔드개발/자바스프링
public class testException extends Exception {
    private static final long serialVersionUID = 7897401638242416328L;

public testException(String msg){
    super(msg);
}

}

앱)springframework로 batch 예제(main+applicationcontext+properties+logback)

Posted by HULIA(휴리아)
2018. 1. 23. 10:12 백엔드개발/자바스프링
☆☆☆☆☆main
public class mainApplicaion{
    public static void main(String[] args) {
       String jobMgr = System.getProperty("jobmgr.home");
       if(StringUtils.isEmpty(jobMgr)){
       //에러(jobMgr Home is Empty)
       return;
      }
      if( !(new File(jobMgr)).exists()) {
     //에러(Invalid jobmgr Home + jobMgr+)
      return;
      }
   
      String serverType = System.getProperty("server.type");
      if(StringUtils.isEmpty(serverType)){
      //에러
      return;
     }
     
      LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
      JoranConfigurator jc = new JoranConfigurator();
       jc.setContext(context);
       context.reset ();//우리가 설정한 logback 설정만 적용된다
       try{
          jc.doConfigure(new ClassPathResource("logback"+System.getProperty("server.type")+".xml").getInputStream());
       }catch(Exception e){
          return;
       }



      ApplicationContext springContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
  }
}


☆☆☆☆☆scheduler@service
@scheduled(fixedDelayString="jobmgr.runnig.interval"+"000")
public void doTest(){
     doTestBiz();
}



☆☆☆☆☆service, biz @service
@Value("${jobmgr.running.interval}")
private String interval;

@Async("testExcecutor")
public doTestBiz(){

}


☆☆☆☆☆application context
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd
http://activemq.apache.org/core http://activemq.apache.org/schema/core/activemq-core.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

<context:anntaion-config />

<context:component-scan base-package="com.istoryful.test" />

<task:anntation-driven />

<task:schduler id="scheduler" pool-size="${jobmgr.defaultSchedulerSize}" />

<task:executor id="testExecutor" pool-size="${jobmgr.testExecutor.size}" />

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property anme"locations">
          <list>
                <value>batch${server.type}.properties</value>
          </list>
     </property>
</bean>

<bean id="dataSource" class="com.istoryful.util.CrytoDataSourceUtil" destory-method="close">
    <property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxTotal" value="${jdbc.maxTotal}" />
<property name="maxIdle" value="${jdbc.maxIdle}" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSource" />
   <property name="configLocation" value="classpath:mybatis/mybatisConfig.xml" />
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="sqlSessionFactory" />
</bean>

<bean class="org.springframework.jdbc.core.JdbcTemplate">
   <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven trasction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="dataSource" />
</bean>





☆☆☆☆☆properties
jdbc.vendor=mysql
jdbc.driver=
jdbc.url=
jdbc.username=
jdbc.password=
jdbc.maxTotal=
jdbc.maxIdle=

jobmgr.defaultSchedulerSize=1
jobmgr.testExecuotr.size=3

jobmgr.running.interval=60

☆☆☆☆☆vm arguments
-Djobmgr.home=C:\Batch
-Dserver.type=Local


☆☆☆☆☆logback
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="1 seconds">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
   <encoder>
       <pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{0} - %msg %n %ex</pattern>
</encoder>
</appender>


<appender name="INFOFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
       <fileNamePattern>${jobmgr.home}/logs/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
    <pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{0} - %msg %n %ex</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>ERROR</level>
    <onMatch>DENY</onMatch>
    <onMismatch>ACCEPT</onMismatch>
</filter>
</appender>


<appender name="ERRORFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${jobmgr.home}/logs/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
    <pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{0} - %msg %n %ex</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch><DENY</onMismatch>
</filter>
</appender>

<logger name="org.apache" level="INFO" />
<logger name="org.springframework" level="INFO" />
<logger name="com.amazonaws" level="INFO" />

<logger name="JOB" level="INFO">
   <appender-ref ref="INFOFILE" />
   <appender-ref ref="ERRORFILE" />
</logger>

</configuration>



☆☆☆☆☆logger
private static final Logger logger = LoggerFactory.getLogger("JOB");


☆☆☆☆☆mybatisconfig
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <settings>
     <setting name="cacheEnabled" value="false" />
      <setting name="useGeneratedKeys" value="true" />
     <setting name="defaultExecutorType" value="REUSE" />
     <setting name="defaultStatementTimeout" value="3480" /><!-- SQL timeout 58 minutes-->
</settings>
    
   <typeAliases>
     <typeAlias alias="VO" type="com.istoryful.VO />
   </typeAliases>

<mappers>
   <mapper resource="mybatis/mysql/DAO.xml" />
</mappers>

</configuration>


☆☆☆☆☆sql
<?xml version="1.0" encoding="UTF-8"?>

<mapper namespace="sql.DAO">


   <resultMap id="Vo" type="VO">
       <result property="test"  column="TEST" />
       <result property="test"  column="TEST" />
       <result property="test"  column="TEST" />
       <result property="test"  column="TEST" />
</resultMap>



<insert id="testInsert">
</insert>


<select id="testSelect">
</select>

<update id="testUpdate">
</update>

</mapper>

앱)자바 외부 실행파일 실행 1.7 이상에서 processbuilder 예제로 실행하고 정상적으로 종료

Posted by HULIA(휴리아)
2018. 1. 22. 10:36 백엔드개발/자바스프링
String[] cmd = new String[] {"copy","a.txt","b.txr"};
ProcessBuilder builder = new ProcessBuilder (cmd);
//builder.redirectOuptput (Redirect.INHERIT);
//builder.redirectError (Redirect.INHERIT);
Process process;

process = builder.start ();

BufferedReader stdOut = new BufferedReader( new InputStreamReader (process.getInputStream ()) );

while( (str = stdOut.readLine ()) != null ) {
sysout (str);

//실행중에 에러가 났을때
if (str.contains ("ERROR:")){
throw new Exception (str);
}
//실행파일이 정상적인 위치에 없을때
else if(str.contains("No such file or directory"){

}
else{
logger.info (str);
}
}

//프로세스 정상종료(파일사이즈 정상적으로 업데이트 완료)
process.waitFor ();

앱)runable jar 파일 실행이 되지 않을때 classnotfoundexception에러 날때

Posted by HULIA(휴리아)
2018. 1. 15. 15:14 백엔드개발/자바스프링
jar 파일의 META-INF의 아래에 있는 MANIFEST.IMF에 설정이 잘 되어있는지 확인

Clas-Path
Main-Class
반드시 확인

jar파일 실행시킬때 자바옵션에 설정되어있어도 jar파일 내부의 manifest파일을 참조하니 빌드할때 꼭 확인하기

앱)NoClassDefFoundError java.lang.ClassNotFoundException org.apache.http.protocol.HttpContext

Posted by HULIA(휴리아)
2017. 12. 28. 14:59 백엔드개발/자바스프링
위의 에러가 나면
라이브러리가 저장된 메이븐 저장소의 위치에 가서 org.apache의 디렉토리를 지우고 프로젝트의 메뉴에서 maven의 update prpject를 하고 실행해보면 해결된다

이클립스 Spring MVC Project가 보이지 않을때

Posted by HULIA(휴리아)
2017. 5. 20. 14:21 백엔드개발/자바스프링

이클립스 특정 버전 이상, STS가 설치된 상태에서

Spring Legacy Project를 누르면 Spring MVC Project가 없는 경우가 발생!


1. window-preferences-spring-template project에 들어간 후 spring-data-gemfire, spring-integration을 지운 후

 

2. Show self-hosted templates를 체크한 후 apply를 해주면 리스트가 다시 나온다!

 



출처: http://joy5454.tistory.com/12 [J(ava, sp, avascript, etc...)]

자주 사용하는 스프링 annotation

Posted by HULIA(휴리아)
2017. 1. 20. 22:58 백엔드개발/자바스프링

@autowired

 

 

@controller
@transactional
@requestmapping

 

@responsebody
@requestparam
@requestbody


@service

 

@repository
Dao sql 호출

 

@path
@post
@producemime

 

 

@component
@value

 

 

@xmlaccessortype
@xmltype
@xmlelement
@xmlrootelement

자바 유용 클래스

Posted by HULIA(휴리아)
2017. 1. 20. 22:56 백엔드개발/자바스프링

1. StringTokenizer

문자열을 파싱할때 유용할 클래스

 

 

 

 

2. Bigdecimal

소수점이하를 정확하게 나타낼 때 유용한 클래스

 

 

 

 

3. SimpleDateFormat

날짜를 원하는대로 출력할 때 유용한 클래스

 

 

 

4. Uri.builder

url을 구성할때 유용한 클래스

 

ex)http://api.example.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7

 

final String FORECAST_BASE_URL =
    "http://api.example.org/data/2.5/forecast/daily?";
final String QUERY_PARAM = "q";
final String FORMAT_PARAM = "mode";
final String UNITS_PARAM = "units";
final String DAYS_PARAM = "cnt";

 

Uri builtUri = Uri.parse(FORECAST_BASE_URL)
    .buildUpon()
    .appendQueryParameter(QUERY_PARAM, params[0])
    .appendQueryParameter(FORMAT_PARAM, "json")
    .appendQueryParameter(UNITS_PARAM, "metric")
    .appendQueryParameter(DAYS_PARAM, Integer.toString(7))
    .build();

 

 


 URL url = new URL(builtUri.toString());

 

 

 


private Uri buildURI(String url, Map<String, String> params) {

    // build url with parameters.
    Uri.Builder builder = Uri.parse(url).buildUpon();
    for (Map.Entry<String, String> entry : params.entrySet()) {
        builder.appendQueryParameter(entry.getKey(), entry.getValue());
    }

    return builder.build();
}