1. 라이브러리 설정시 오라클을 다운받지 못하는 문제가 있다.

  •   이 경우 아래와 같이 repositories에 아래와 같은 경로를 추가 해주면 정상적으로 다운로드가 가능하다 .



repositories {
    mavenCentral()
    jcenter()

    maven { url "https://code.lds.org/nexus/content/groups/main-repo"}
}

dependencies {
    //compile('javax.servlet:jstl')
    //compile("org.apache.tomcat.embed:tomcat-embed-jasper")
    compile 'com.oracle:ojdbc7:12.1.0.2'
}

1. 이클립스 프로젝트에서 "mybatis"를 검색합니다 .

  •   mybatis Generator1.4.0을 받아줍니다. 

 

 

2. 프로젝트 내부에 적절한 위치에 "Mybatis Generator"를 사용하기위한  xml 파일을 생성해줍니다. 

 

 

3. generatorConfig.xml을 생성 후 아래와 같은 내용을 작성해줍니다. 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
 "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
	<context id="simple" targetRuntime="MyBatis3simple">
		<jdbcConnection
			connectionURL="URL을 적엉주세요 "
			driverClass="oracle.jdbc.driver.OracleDriver" password="비밀번호"
			userId="아이디" />

		<javaModelGenerator
			targetPackage="com.project.domain"
			targetProject="board/src/main/java">
			<property name="enableSubPackages" value="true" />
			<property name="trimStrings" value="true" />
		</javaModelGenerator>

		<sqlMapGenerator 
			targetPackage="mybatis.mapper"
			targetProject="board/src/main/resources" />

		<javaClientGenerator
			targetPackage="example.mapper" 
			targetProject="board/src/main/java"
			type="XMLMAPPER" />

		<table tableName="usertb" />
		<table tableName="member" />
	</context>
</generatorConfiguration>

 

     3-1.xml 파일을 보시면 tragetRuntime이 있습니다. 이곳을 적절하게 바꿔주시면 다양한 generator를 사용가능 

 

MyBatis Generator Core – MyBatis Generator Quick Start Guide

MyBatis Generator Quick Start Guide MyBatis Generator (MBG) generates code in different styles depending on how it is configured. This is controlled by specifying the targetRuntime attribute on a configuration element. The table below summarizes the differ

mybatis.org

4. RUN MyBatis Generator를 실행해주면 정상적으로 파일이 생성되게 됩니다.

 

 

 

5. 결과 

 

 

 

 

 

 

#mapper 파일이 생성 안되는 경우 

  • targetRunTime의 속성 값을 "MyBatis3Simple" 을 추가 해주시거나 수정해주세요 
<context id="simple" targetRuntime="MyBatis3simple">

 

 

#mybatis "src/main/resources"에 mapper파일 생성 방법 

  • 아래와 같이 "targetPrject"에 "src/main/resources"를 작성해주세요 
		<sqlMapGenerator 
			targetPackage="mybatis.mapper"
			targetProject="board/src/main/resources" />

SLF4j 특징

 

SLF4j(Simple Log Facade for Java) 는 사용자가 원하는 로깅 프레임워크(log4j, logback, 등)으로 변경하여 사용 할수 있도록 추상화하는 기능을 제공한다.

 

 

1. gralde  추가 


    compile("org.slf4j:slf4j-api:1.7.7")
    compile('ch.qos.logback:logback-classic:1.1.2')

 

2. logback.xml 파일을 src/main/resource 아래 생성 후 아래 내용을 추가해준다. 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 30초마다 설정 파일의 변경을 확인한다. 파일이 변경되면 다시 로딩한다 -->
<configuration scan="true" scanPeriod="30 seconds">

    <!-- 외부 설정파일을 사용할 수 있다. -->
    <property resource="resource.properties"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${APP_HOME}/sujemall-webapp.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 파일이 하루에 한개씩 생성된다 -->
            <fileNamePattern>sujemall-webapp.%d{yyyy-MM-dd}.log</fileNamePattern>

            <!-- maxHIstory 설정은 위 부분에 롤링 정책에 따라 적용되 된다고 보면된다.
             위 설정데로 라면 30일이 지난 파일은 삭제가 된다.-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.springframework" level="info"/>
    <logger name="org.hibernate" level="debug"/>
    <logger name="com.sujemall.webapp" level="debug"/>
    <if condition='property("RUN_MODE").equals("SERVICE")'>
        <then>
            <!-- 설정파일에 RUN_MODE 가 SERVICE로 정의되어 있으면 로깅 레벨을 INFO로 지정 -->
            <root level="info">
                <appender-ref ref="console"/>
                <appender-ref ref="FILE"/>
            </root>
        </then>
        <!-- 설정파일에 RUN_MODE 가 SERVICE로 정의되어 있지 않으면  로깅 레벨을 DEBUG 지정 -->
        <else>
            <root level="debug">
                <appender-ref ref="console"/>
                <appender-ref ref="FILE"/>
            </root>
        </else>
    </if>
</configuration>

3. Anotation을 이용하여 Log찍어보기 

 

@Slf4j
public class App {
    public static void main(String[] args) {
        log.debug("test {}","asdf");
        log.debug("test {}","asdf");
        log.debug("test {}","asdf");
    }
}
    • 영속성 컨텍스트란 무엇인가.
        • 실제 DB 저장하는 것이 아니라 
        • 엔티티를 "영속컨텍스트에" 저장한다는 의미이다.

          • JPA 이해하는데 가장 중요한영어
          • "엔티티를 영구 저장하는 환경"이라는 의미를 가진다.
          • EntityManager.persist(entity)
          • 매니저(EntityManager)를 통해 영속성 컨텍스트(persistence)에 접근한다.
        • 비영속 컨텍스트
          • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
          • JPA 관리하지 않는 상태
      //객체를 생성한 상태(비영속)
      
      Admin admin = new Admin();
      
      admin.setId("member1");
      
      admin.setUsername("회원1");
      
      //영속상태
      em.persist()

       

       

      • 준영속 (detached)
        • 영속성 컨텍스트에 저장되었다가 분리된 상태 
          //
          회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
        • em.detach()
      Admin admin = em.find(Admin.class , 101L);
      admin.setName("AAAAAA");
                  
      //JPA에서 관리하지 않는다. 
      em.detach(admin);
      
      //영속성 컨테스트의 내용을 전부 초기화 
      em.clear();

       

      • 그렇다면 영속성 속성을 클리어하고 다시 조회 하게 어떻게 될까 ? 
        • 아래의 예시를 보면 "em.clear" 또는 em.detach를 사용시에는 영속성관리를 하지 않게 됨으로 
        • admin 과 admin1은 1차캐시된 데이터를 가져오지 않으므로  false가 나오게 된다. 

       

                  Admin admin = em.find(Admin.class , 101L);
                  admin.setName("AAAAAA");
      
                  //JPA에서 관리하지 않는다.
                  em.detach(admin);
      
                  em.clear();
      
                  Admin admin1 = em.find(Admin.class,101L);
      
                  System.out.println(admin == admin1);

       

       

      • 영속이란 
        • 실제 영속컨테스트가 관리하는 1차캐시에 데이터가 없으면 DB에서 데이터를 가져와 캐시에 담아 JPA가 관리하는 것 
      • 데이터의 동일성
        • JPA "영속엔티티" 동일성을 보장해준다.
        • 1 캐시로 반복가능한 읽기(RePEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
      • 엔티티 수정 감지
        • JPA 변경감지 기능이 있어서 "엔티티" 변경
        • JPA 자바의 Collection 변경하듯이 "값만 변경했지만update 되었다 .

                  Admin admin = em.find(Admin.class,101L);

                  admin .setName("나승후1111");

       

      프로시저 사용법 

      1. 프로시저 변수 값 지정 방법 

      작성자 Your name
      만든 날짜 Today's date
      설명 Returns employee data
      Procedure_name HumanResources.uspGetEmployeesTest
      @Param1 @LastName
      @Datatype_For_Param1 nvarchar(50)
      Default_Value_For_Param1 NULL
      @Param2 @FirstName
      @Datatype_For_Param2 nvarchar(50)
      Default_Value_For_Param2 NULL

       

       

      2. 프로시저 생성 방법 


      CREATE [ OR ALTER ] { PROC | PROCEDURE 
          [schema_name.] procedure_name [ ; number ]   
          [ { @parameter [ type_schema_name. ] data_type }  
              [ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY]  
          ] [ ,...n ]   
      [ WITH  [ ,...n ] ]  
      [ FOR REPLICATION ]   
      AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }  
      [;]  
        
       ::=   
          [ ENCRYPTION ]  
          [ RECOMPILE ]  
          [ EXECUTE AS Clause ]

       

      [알아보고 가요] 

      SET NOCOUNT

      Transact-SQL 문 또는 저장 프로시저의 영향을 받은 행 수를 나타내는 메시지가 결과 집합의 일부로 반환되지 않도록 합니다.

       

      3. TRANSAION ISOLATION LEVEL 설정에 대한 설명 

      https://docs.microsoft.com/ko-kr/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-2017

       

      4. 프로시저 전체 조회 쿼리문 

      전체프로시저 조회 방법 

      SELECT * FROM  INFORMATION_SCHEMA.ROUTINES

       

       

       

       

      참고 사이트 https://docs.microsoft.com/ko-kr/sql/t-sql/statements/set-nocount-transact-sql?view=sql-server-2017









      package study.ExDate;


      import java.util.Calendar;

      import java.util.Date;

      import java.util.Locale;

      import java.util.TimeZone;


      /**

       * @author admin

       *

       */

      public class UtilCalendar {


      private static Calendar cal = Calendar.getInstance();


      /**

      * 현재 연월일 시분초 밀리세컨드까지 가져오는 메소드

      */

      public static void getSamDate() {


      disDate();


      }


      public static void getSetDate() {


      Date date = new Date();

      // 5초 추가

      date.setTime(5000);

      // 현재시간에 5초로 시간 설정

      cal.setTime(date);

      // 년

      disDate();


      }


      /**

      * 지역을 찾아서 영국과의 시간차를 빼기위한 메소드

      */

      public static void getDateLocale() {

      Locale lo = Locale.getDefault();


      System.out.println(cal.get(Calendar.YEAR));

      System.out.println(cal.get(Calendar.MONTH) + 1);

      System.out.println(cal.get(Calendar.DATE) + "일");

      System.out.println(cal.get(Calendar.AM_PM) + "오전오후");

      if (lo.getCountry().equals("KR") && lo.getLanguage().equals("ko")) {

      System.out.println(cal.get(Calendar.HOUR) - 9 + "시간");

      } else {

      System.out.println(cal.get(Calendar.HOUR) + "시간");

      }

      System.out.println(cal.get(Calendar.MINUTE) + "분");

      System.out.println(cal.get(Calendar.SECOND) + "초");

      System.out.println(cal.get(Calendar.MILLISECOND) + "세컨드");

      System.out.println(cal.getTimeInMillis() + "");


      }


      public static void getUkDate() {

      // 다시 객체 생성

      cal = Calendar.getInstance();


      TimeZone zone = TimeZone.getTimeZone("Europe/London");


      cal.setTimeZone(zone);


      disDate();


      }


      public static void useContryDate() {


      String[] local = TimeZone.getAvailableIDs();


      for (String s : local) {

      System.out.println(s);

      }


      }


      public static void disDate() {


      // 년

      System.out.println(cal.get(Calendar.YEAR));

      System.out.println(cal.get(Calendar.MONTH) + 1);

      System.out.println(cal.get(Calendar.DATE) + "일");

      System.out.println(cal.get(Calendar.AM_PM) + "오전오후");

      System.out.println(cal.get(Calendar.HOUR) + "시간");

      System.out.println(cal.get(Calendar.MINUTE) + "분");

      System.out.println(cal.get(Calendar.SECOND) + "초");

      System.out.println(cal.get(Calendar.MILLISECOND) + "세컨드");

      System.out.println(cal.getTimeInMillis() + "");

      }


      }








      1.  Application은 ADL에 해당하는 Object이며 Launch Project시 뜨는 브라우저라고 생각하면 됨


      1-1 Application의 속성들 


      this.Button01_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)

      {

      var sMsg = "";

      var sId  = "";

      var sUrl = "";


      for (var i = 0; i < application.services.length; i++)

      {

      sId  = application.services[i].prefixid;

      sUrl = application.services[i].url;

      sMsg += sId + " = " + sUrl + "\n";

      }

      alert(sMsg);

      }

      '넥사크로' 카테고리의 다른 글

      넥사크로 Service에 Prefixed  (0) 2018.10.10

      1. typeDefinitions service에 prefixed가 어떻게 지정되어있는지 확인해야합니다. 


      2. prefixid 이름은 svcList  type이름은 jsp  url은  http://localhostf:8080/CustomerList/



      위와 같은 형태로 서비스를 만들면 서비스 아이디 이름으로 트랜잭션에서 사용할 수 있습니다. 






      '넥사크로' 카테고리의 다른 글

      2)넥사크로Object-1  (0) 2018.10.12

      + Recent posts