** Dart - 기본 문법 **

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void main() {
  variable1(); //1. 변수형
  variable2(); //2. null 관련
  variable3(); //3. final, const
  variable4(); //4. 변수 type
}
 
//1. 변수형
variable1() {
  var gender='남';       //var : set된 type을 기준으로 type이 정의 됨
  String name='플러터'//string형 변수
  dynamic obj = 3;      //dynamic : 모든type이 올 수 있는 타입
   
  //gener = 3;          //var type은 이미 string값이 적용 되었기 때문에 int값으로 set안됨
  obj='kim';            //dynamic : 실행중 int에서 string으로도 변경 가능
}
 
//2. null
variable2() {
  String? name2;        //? : nullable
   
  name2 = null;         //? : null 적용가능
  //print(name2!);      //! : 반드시 null이 아니다.
  name2 = name2 ?? 'Flutter'; //?? : name2가 null이면 뒤쪽문장값 적용
  name2 ??='Flutter';
  print(name2!);              //!  : 반드시 null이 아니다.
  print(name2 + ' jjang'); 
}
 
//3. final, const
variable3() {
  //final - 실행시점까지만 한번만 set 가능. 컴파일시점에는 값이 존재하지 않아도 됨
  //      - type 생략가능
  final DateTime now = DateTime.now();
  final now2 = DateTime.now();
   
  //const - build time(컴파일)에 값이 존재 해야 됨
  //      - DateTime 객체는 실행시점에 수행되는 객체이므로 아래문장 Error발생
  //      - type 생략가능
  //const now2 = DateTime.now();
   
}
 
//4. 변수 type
variable4() {
  String name='플러터';
  print(name.runtimeType);  //결과 : String
  print(name is int);       //결과 : false
  print(name is String);    //결과 : true
}

'Flutter > 1. 기본문법' 카테고리의 다른 글

8. Widget 생명주기  (0) 2022.10.09
7. Dart - Async Programming - Stream  (0) 2022.10.09
6. Dart - Async Progam - Future  (0) 2022.10.09
5. Dart - Map,Set,List 활용  (0) 2022.10.09
3. Dart - 함수  (0) 2022.10.04
Posted by 농부지기
,

1. 데이터형 검사 및 변환 함수

  Char : bolb, 정수, 문자열을 문자로 바꿔서 반환

  Dec : 문자열의 내용을 10진수로 바꿔서 반환

  Double : 문자열의 내용을 Double로 바꿔서 반환

  Integer : 문자열의 내용을 정수로 바꿔서 반환

  Long : 문자열의 내용을 Long 으로 바꿔서 반환

  Real : 문자열의 내용을 실수로 바꿔서 반환

  Date : 데이터베이스로 부터 읽은 DateTime 으로부터 Date값만을 가져온다.

  DateTime : Date나 Time 값을 DateTime값으로 바꿔서 반환

  IsDate : 지정한 문자열이 유효한 Date값을 지녔는지 검사

  IsNull : 넘어온 인자가 Null 인지 검사

  IsNumber : 지정한 문자열이 숫자값을 지녔는지 검사

  IsTime : 지정한 문자열이 Time 값을 지녔는지 검사

  String : 지정한 형식으로 문자열을 연다

  Time : 데이터베이스로 부터 읽은 DateTime 으로부터 Time값만을 가져온다

 

2. 날짜, 요일, 시간 함수

  Day : 일자를 구한다

  DayName : 주간의 요일명을 구한다

  DayNumber : 주간의 요일을 숫자로 표현한다 ( 일요일은 1)

  DaysAfter : 지정한 날짜에 N일 전, 후를 구한다.

  Hour : 주어진 시간의 시를 구한다

  Minute : 주어진 시간의 분을 구한다

  Month : 주어진 시간의 월을 구한다

  Now : PC의 시스템 시간을 구한다

  RelativeDate : 주어진 날짜를 기준으로 n일 후의 날짜를 구한다.

  RelativeTime : 주어진 시간을 기준으로 n초 후의 시간을 구한다

  Second : 주어진 시간의 초 값을 구한다

  Today : PC의 시스템 날짜를 구한다

  Year : 주어진 날짜의 년 값을 구한다

 

3. 수치 처리 함수

  Abs : 수치의 절대값을 얻는다

  Ceiling : 지정한 수보다 크거나 같은 최소 정수를 구한다

  Cos : 주어진 각도의 코사인 값을 구한다

  Exp : e를 number만큼 거듭제곱한 값을 구한다

  Fact : 계승값을 구한다 (4! = 4* 3* 2* 1)

  Int : 소수점 이하를 버리고 가장 가까운 정수로 반환

  Log : 지정 숫자의 자연로그를 반환

  LogTen : 지정 숫자에 대한 밑이 10인 로그값 반환

  Max : 두 수중 큰 값 반환

  Min : 두 수중 작은 값 반환

  Mod : 두 수를 나눈 나머지 반환

  Pi : 3.14159...

  Rand : 난수를 생성

  Randomize : 난수 발생을 초기화

  Round : 숫자를 지정한 자릿수로 반올림

  Sign : 숫자의 부호 결정 ( 양수 : 1 음수 : -1 0 : 0)

  Sin : 주어진 각도의 사인값 반환

  Sqrt : 양의 제곱근 반환

  Tan : 주어진 값의 탄젠트값 반환

  Truncate : 소수점 이하 버리고 정수 반환

 

4. 프린트 함수

  Print : 현재 글꼴로 문자열을 인쇄

  PrintBitmap : 지정한 인쇄공간에 비트맵 이미지 인쇄

  PrintCancel : 인쇄취소

  PrintClose : 현재 페이지 프린터에 보내고 인쇄 종료

  PringDefineFont : 인쇄시의 폰트 지정

  PrintLine : 지정한 위치에 지정한 굵기로 선 그린다

  PrintOpen : 인쇄작업 시작, 인쇄 번호 할당

  PrintOval : 지정한 위치에 지정한 굵기로 타원을 그린다

  PrintPage : 현재 페이지 프린터에 보내고 새로운 페이지 셋한다

  PrintRect : 지정한 위치에 지정한 굵기로 사각형 그린다

  PrintRoundRect : 지정한 위치에 지정한 굵기로 둥근 모서리의 사각형 그린다

  PrintSend : 지정한 문자열 프린터에 보낸다

  PrintSetFont : 현재 인쇄 작업에 대한 글꼴 지정

  PrintSetSpacing : 라인간 너비를 지정

  PrintSetUp : 프린터 설정 다이얼로그 부름

  PrintText : 지정한 위치에 지정한 문자 인쇄

  PrintWidth : 현재 글꼴에서 지정된 문자열의 넓이

  PrintX : 커서의 X좌표

  PrintY : 커서의 Y좌표

 

5. 문자열 처리 함수

  Asc : 문자열의 첫번째 문자의 Ascii값 반환

  Char : 주어진 Ascii값에 해당하는 문자 반환

  Fill : 지정한 문자 반복시켜 문자열 만듬

  Left : 문자열의 시작부터 지정한 수 까지의 문자 반환

  LeftTrim : 문자열 시작에 있는 공백 제거

  Len : 문자열 길이 반환

  Lower : 주어진 문자열 내의 대문자를 소문자로 고쳐 반환

  Mid : 주어진 문자열에서 시작위치, 끝위치 지정해 문자열의 일정부분만 반환

  Pos : 다른 문자열에서 주어진 문자열의 위치 반환

  Replace : 문자열 일부 다른 문자열로 바꿈

  Right : 문자열의 끝에서부터 지정한 수의 문자 반환

  RightTrim : 문자열의 끝에 있는 공백 제거

  Space : 지정한 길이로 공백 문자열 얻는다

  Trim : 문자열의 시작과 끝의 공백 제거

  Upper : 지정한 문자열 내의 소문자를 대문자로 고쳐 반환

 

6. 시스템 및 환경 함수

  Clipboard : 윈도우 클립보드의 내용 얻는다

  GetApplication : 현재 어플리케이션의 핸들을 구한다

  CommandParm : 어플리케이션 실행시 지정된 파라미터가 있으면 그 값을 구한다

  GetEnvironment : 시스템의 운영체제와 프로세서 등과 같은 정보를 얻는다

  Handle : Windows Sdk 함수를 부르기 위해 사용

  Post : 지정한 윈도우에 대한 메세지를 메세지큐 마지막에 삽입

  ProfileInt : 지정한 프로파일에서 숫자값 얻어온다

  ProfileString : 지정한 프로파일에서 문자열 얻어온다

  Restart : 스크립트 실행 중지, 모든 윈도우 close, 데이터베이스 commit 후 연결끊고 어플리케이션 다시 실행

  Run : 지정한 어플리케이션 실행

  Send : 지정한 윈도우에 메세지를 순차적으로 보낸다

  SetProfileString : 지정한 프로파일 값 저장

  ShowHelp : 도움말 파일을 읽어 파워빌더 어플리케이션에서 사용할 수 있다

  SignalError : 어플리케이션 레벨에서의 시스템 에러를 발생한다

  Yeild : 반복문 안에서 다른 오브젝트나 어플리케이션의 메세지가 발생됐는지 체크할 수 있게 한다

 

7. 시간처리 함수

  CPU : 현재 실행중인 파워빌더 어플리케이션의 시작 부터 현재 까지의 CPU 시간을 반환

  Idle : 사용자가 아무런 입력 없이 지정한 시간이 흐르면 Idle이벤트 호출

  Timer : 지정한 윈도우에 일정한 간격의 타이머 지정하여 타이머 이벤트 호출

 

8. 배열(Array)처리 함수 

  LowerBound : 지정한 배열의 하위 경계

  UpperBound : 지정한 배열의 상위 경계

 

9. Bolb관련 함수 

  Blob       : 텍스트 데이터를 Blob 데이터로 변환 또는 복사

  BlobEdit   : PB가 지원하는 데이터를 Blob변수로 복사

  BlobMid    : Blob 데이터 문자열에서 N번째 문자를 반환

  Len        : 문자열의 길이

 

10. DDE클라이언트 함수 

  CloseChannel : OpenChannel함수로 열린 DDE서버 어플리케이션의 채널을 닫는다.

  ExecRemote : 서버 어플리케이션에게 명령 실행을 요구한다.

  GetDataDDE : 연결된 서버 어플리케이션으로부터 새로운 데이터를 받아온다.

  GetDataDDEOrigin : 연결된 서버 어플리케이션으로부터 원래의 데이터를 받아온다.

  GetRemote : 서버 어플리케이션에게 데이터를 요구한다.

  OpenChannel : DDE서버 어플리케이션을 연다.

  RespondRemote : 서버에게 명령 또는 데이터가 클라이언트에게 받아들여졌는지를 알려준다.

  SetRemote : 서버 어플리케이션에게 지정한 값을 설정하도록 한다.

  StartHotLink : 서버 어플리케이션과의 연결을 시작한다.

  StopHotLink : 서버 어플리케이션과의 연결을 종료한다.

 

11. DDE서버 함수 

  GetCommandDDE : 클라이언트 어플리케이션이 보낸 명령을 구한다.

  GetCommandDDEOrigin : 어떤 클라이언트 어플리케이션이 명령을 보냈는지 구한다.

  GetDataDDE : 클라이언트 어플리케이션이 보낸 데이터를 구한다.

  GetDataDDEOrigin : 어떤 클라이언트 어플리케이션이 데이터를 보냈는지 구한다.

  RespondRemote : 클라이언트에게 명령 또는 데이터가 서버에게 받아들여졌는지를 알려준다.

  SetDataDDE : 클라이언트 어플리케이션에게 데이터를 보낸다.

  StartServerDDE : 파워빌더를 서버로 동작하게 한다.

  StopServerDDE : 파워빌더가 서버로 동작하는 것을 중지한다.

 

12. 파일처리 함수 

  FileClose : 파일 닫기

  FileDelete : 파일 삭제

  FileExists : 파일 존재 유/무

  FileLength : 파일 길이

  FileOpen : 파일 열기

  FileRead : 파일 읽기

  FileSeek : 파일 내 위치 이동

  FileWrite : 파일에 쓰기

  GetFileOpenName : 파일 열기 공통 다이얼로그 열기

  GetFileSaveName : 파일 저장 공통 다이얼로그 열기

 

13. 라이브러리 함수 

  LibraryCreate : 라이브러리 생성

  LibraryDelete : 라이브러리 삭제

  LibrarDirectory : pb라이브러리 파일의 모든 오브젝트의 리스트를 구한다.

  LibraryExport : 라이브러리 파일의 모든 오브젝트를 Export한다.

  LibraryImport : 지정한 라이브러리 파일에서 오브젝트를 Import한다.

 

14. MAPI함수 

  mailAddress : 메일 메세지에 주소를 주거나 주소 리스트를 보여준다.

  mailDELETEMessage : 메일 메시지를 지운다.

  mailGetMessages : 메지시 id를 얻어온다.

  mailHandle : 내부 메일 시스템 핸들을 얻어온다.

  mailLogOff : 메세징 시스템과의 세션을 끊는다.

  mailLogOn : 메세징 시스템과의 세션을 시작한다.

  mailReadMessage : 메일 메시지를 읽는다.

  mailRecipientDetails : 지정된 수취인의 주소 정보를 보여준다.

  mailResolveRecipient : 불분명한 수취인 명을 결정한다.

  mailSaveMessage : 사용자 수신함에 새로운 메시지를 생성하거나 기존에 있는 메시지를

                               대체한다.

  mailSend : 메일 메시지를 보낸다.

 

15. 그밖의 함수

  Beep : 정해진 시간(초단위)동안 경고음 발생

  DBHandle : DBMS의 핸들 반환

  IsValid : 지정한 윈도우가 열려있는지 검사

  KeyDown : 사용자가 특정한 키 눌렀는지 검사

  MesseageBox : 메세지박스 출력

  PixelsToUnits : Pixel을 파워빌더의 Unit으로 변환

  RGB : 특정 색상 표현하는 Long 형 값 반환

  SetNull : 변수의 유형에 상관없이 Null 로 지정

  SetPointer : 마우스포인터를 지정한 모양으로 변환

  TypeOf : 오브젝트의 형 결정 Checkbox, Picture of RadioButton 등..

  UnitsToPixels : 파워빌더의 Unit을 Pixel로 변환

Posted by 농부지기
,

[ eGov 환경설정 ]

0. 정의

    - eGov4.0 환경에 nexaN용 uiadapter 설치하기

 

1. nexacroN 관련 환경설정

    1. uiadapterN 환경설정

         . https://www.playnexacro.com/#show:learn:4732

     2. NexacroException 사용하기

         . https://www.playnexacro.com/#show:learn:4787

     3. Excel (xeni) 환경설정

         . https://www.playnexacro.com/#show:learn:4732 , https://www.playnexacro.com/#show:learn:4810

     4. File upload/download 환경설정

         . https://www.playnexacro.com/#show:learn:4868

 

2. Controller 관련 환경 설정

     1. 정의 : Controller.java 파일에 [@RequestMapping(value = "/selectSampleList.do")] 이 문장을 was가 start할때 scan해서 Container에 적제하도록 하는 설정

         - 설정하지 않으면 발생하는 오류1 : org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sampleController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sampleService' available

 

         - 발생시점1 : tomcat start시.

         - 설정하지 않으면 발생하는 오류2 : WARN [org.springframework.web.servlet.PageNotFound] No mapping for GET /selectSampleList.do

         - 발생시점2 : 화면단에서 request 요청할 때

         - 설정파일 : context-common.xml

         - 설정내용 :

             

1
2
3
<context:component-scan base-package="sample">
   <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>

 

3. Query 관련 환경 설정

     1. 정의 : Query Mapper파일(xml) 경로 및 Mapper Class scan을 위한 패키지 경로 지정

         - 설정하지 않으면 발생 오류 : org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sampleService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sampleMapper' available

         - 발생시점 : tomcat start시

         - 설정파일 : context-mapper.xml

         - 설정내용 :

 

1
2
3
4
5
6
7
8
9
10
11
<!-- SqlSession setup for MyBatis Database Layer -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:/egovframework/sqlmap/example/sql-mapper-config.xml" />
    <property name="mapperLocations" value="classpath:/egovframework/sqlmap/example/mappers/*.xml" />
</bean>
 
<!-- MapperConfigurer setup for MyBatis Database Layer with @Mapper("deptMapper") in DeptMapper Interface -->
<bean class="org.egovframe.rte.psl.dataaccess.mapper.MapperConfigurer">
    <property name="basePackage" value="sample.service.impl" />
</bean>

 

4. transaction commit/rollback 관련 환경 설정

     1. 정의 : Dataset Rollback관련 정보 수정

         - 설정하지 않으면 발생 오류 : 

         - 발생시점 : 

         - 설정파일 : context-transaction.xml

         - 설정내용 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
 
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="*" rollback-for="Exception"/>
    </tx:attributes>
</tx:advice>
 
<aop:config>
    <!-- transaction관련 소스들이 존재 한즌 impl 위치 지정 -->
    <aop:pointcut id="requiredTx" expression="execution(* sample..impl.*Impl.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>

 

 

'Nexacro-Framework > eGov & nexa' 카테고리의 다른 글

3. eGov + nexa 연동  (0) 2022.07.02
3. eGov4.0 + uiadapterN  (0) 2022.07.01
2. uiadapter  (0) 2022.07.01
1. eGov4.0.0 설치 및 샘플 프로젝트 만들기  (0) 2022.07.01
Posted by 농부지기
,

[ eGov + nexa 연동 ]

 

1. eGov4.0.0 version을 사용했을 경우

    - (eGov3.10.0 , eGov3.8.0) 버전과 (egOV4.0.0)버전 간에 기본 구성은 거의 동일

    - 달라진점 : 일부 package명이 변경 됨

                         eGov3.10.0 : import egovframework.rte.psl.dataaccess.mapper.Mapper;

                         eGov4.0.0   : import org.egovframe.rte.psl.dataaccess.mapper.Mapper;

 

2. nexa Transaction 호출

    - url : https://www.playnexacro.com/#show:learn:4740  (eGov3.10.0)

             https://www.playnexacro.com/#show:learn:1420  (eGov3.8.0)

 

3. NexacroException 사용하기

    - url : https://www.playnexacro.com/#show:learn:4787   (eGov3.10.0)

             https://www.playnexacro.com/#show:learn:1465   (eGov3.8.0)

 

4. Excel Export, Import 사용하기

    - url : https://www.playnexacro.com/#show:learn:4810   (eGov3.10.0)

              https://www.playnexacro.com/#show:learn:1491   (eGov3.8.0)

 

5. File Upload, Download 사용하기

    - url : https://www.playnexacro.com/#show:learn:4868    (eGov3.10.0)

              https://www.playnexacro.com/#show:learn:1530    (eGov3.8.0)

 

 

 

 

'Nexacro-Framework > eGov & nexa' 카테고리의 다른 글

10. eGov4.0.0 환경설정  (0) 2022.07.02
3. eGov4.0 + uiadapterN  (0) 2022.07.01
2. uiadapter  (0) 2022.07.01
1. eGov4.0.0 설치 및 샘플 프로젝트 만들기  (0) 2022.07.01
Posted by 농부지기
,

[ eGov4.0 + uiadapterN ]

 

0. 정의

    - eGov4.0에 nexaN 용 uiadapter driver(jar) 설치

 

1. eGov4.0에 uiadaptorN  환경설정하기 - 참조 URL

   : 아래 playnexa 를 기반으로 작성 (거의 유사함 ^^)

   - url : https://www.playnexacro.com/#show:learn:4732

   - uiadpater란 : https://www.playnexacro.com/#show:learn:1385

 

2. eGov4.0 프로젝트 생성

    - eGovFrame Web Project 로 프로젝트 생성

    - 프로젝트명 : nexaN

    - [v] Generate Example 체크

 

3. eGov4.0 - Example 실행하기

    - Tomcat 9.0.45

    - java : jdk-16.0.1

      (참고, tomcat 10.0 + jdk-16.0.1 는 오류 발생)

    - db : hsql

    - mybatis

    - tomcat start

    - url : http://localhost:8080  으로 Sample 실행

 

4. uiadapterN 을 사용을 위한 환경설정 파일 

 파일명  설명
 pom.xml  uiadapter 관련 Maven Dependency 설정
 dispatcher-servlet.xml  uiadapter 데이터 변환처리 관련셋팅
 context-nexacro.xml  Mybatis Map 사용시 DB 별 컬럼 생성을 위한 셋팅
 sql-mapper-config.xml  Mybatis 기능 interceptor plugin 셋팅

 

5. uiadapterN 환경설정

    1. java 예제 샘플 패키지 제거

    2. ibatis관련 파일 제거 (mybatis를 사용하기 위해서임)

 

6. context-aspect.xml 파일 설정내용 지우기

7. context-mapper.xml 

     - Mybatis관련 쿼리 xml 경로에 파일들이 아직 없기 때문에 주석처리

9. sql-mapper-config.xml

    - 기존 샘플정보는 삭제.

10. nexaN용 maven 정보

     - 참조 URL : . http://support.tobesoft.co.kr/Support/?menu=QnA_View&postid=517154

     - nexaN용 pom.xml 내용

       : 아래처럼 maven설정했을 경우 nexaN용 uiadapter가 정상적으로 작동되지 않는다.

       : 그래서, maven설정으로 하지말고 jar를 직접 down받은 후 /WEB-INF/lib 밑으로 붙여넣어서 사용해야 된다.

        . 아래 maven 설정하면 오류발생

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<properties>
    <!-- nexacroN UIADAPTER version start -->
    <nexacro.uiadapter.version>1.0.1-SNAPSHOT</nexacro.uiadapter.version>
    <!-- nexacroN UIADAPTER version end -->
</properties>
 
<repositories>
    <!-- nexacroN UIADAPTER repository start -->
    <repository>
        <id>tobesoft</id>
        <releases>
        </releases>
        <snapshots>
        </snapshots>
    </repository>
    <!-- nexacroN UIADAPTER repository end -->
</repositories>
 
<dependencies>
    <!-- nexacroN UIADAPTER start -->
    <dependency>
        <groupId>com.nexacro</groupId>
        <artifactId>uiadapter-spring-core</artifactId>
        <version>${nexacro.uiadapter.version}</version>
    </dependency>      
    <dependency>
        <groupId>com.nexacro</groupId>
        <artifactId>uiadapter-spring-dataaccess</artifactId>          
        <version>${nexacro.uiadapter.version}</version>
    </dependency>    
    <dependency>
        <groupId>com.nexacro</groupId>
        <artifactId>uiadapter-spring-excel</artifactId>
        <version>${nexacro.uiadapter.version}</version>
    </dependency>
    <!-- nexacroN UIADAPTER end -->
</dependencies>

     - 그래서, maven설정으로 하지말고 jar를 직접 down받은 후 /WEB-INF/lib 밑으로 붙여넣어서 사용해야 된다.

       nexaN용 jar down url : http://support.tobesoft.co.kr/Support/?menu=QnA_View&postid=510459">http://support.tobesoft.co.kr/Support/?menu=QnA_View&postid=510459

 

11. dispatcher-servlet.xml 

      - 파일위치 : /WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml

      - 변경사유 : uiadapter데이터 변환 처리관련 설정

                          uiadapter 모듈의 bean으로 등록하여 사용하기 위한 설정

      - 설정내용

         

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?xml version="1.0" encoding="UTF-8"?>
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
 
    <context:component-scan base-package="egovframework">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>
 
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<!--
        <property name="webBindingInitializer">
            <bean class="egovframework.example.cmmn.web.EgovBindingInitializer"/>
        </property>
 -->
    </bean>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="localeChangeInterceptor" />
            </list>
        </property>
    </bean>
     
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
    <!-- 쿠키를 이용한 Locale 이용시 <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/> -->
    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="language" />
    </bean>
 
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="cmmn/egovError"/>
        <property name="exceptionMappings">
            <props>
                <prop key="org.springframework.dao.DataAccessException">cmmn/dataAccessFailure</prop>
                <prop key="org.springframework.transaction.TransactionException">cmmn/transactionFailure</prop>
                <prop key="egovframework.rte.fdl.cmmn.exception.EgovBizException">cmmn/egovError</prop>
                <prop key="org.springframework.security.AccessDeniedException">cmmn/egovError</prop>
            </props>
        </property>
    </bean>
 
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1"
      p:viewClass="org.springframework.web.servlet.view.JstlView"
      p:prefix="/WEB-INF/jsp/egovframework/example/" p:suffix=".jsp"/>
 
    <!-- For Pagination Tag -->
<!--
    <bean id="imageRenderer" class="egovframework.example.cmmn.web.EgovImgPaginationRenderer"/>
 
    <bean id="paginationManager" class="egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationManager">
        <property name="rendererType">
            <map>
                <entry key="image" value-ref="imageRenderer"/>
            </map>
        </property>
    </bean>
-->
  <!-- /For Pagination Tag -->
 
    <mvc:view-controller path="/cmmn/validator.do" view-name="cmmn/validator"/>
     
    <!-- /////////////////////////////////// 넥사크로N UIADAPTER 설정 시작 /////////////////////////////////// -->
     
    <!-- annotation-driven 설정. -->
    <mvc:annotation-driven />
     
    <bean id="nexacroInterceptor" class="com.nexacro.uiadapter.spring.core.servlet.NexacroInterceptor"/>
    <bean id="nexacroFileView"    class="com.nexacro.uiadapter.spring.core.view.NexacroFileView" />
    <bean id="nexacroView"        class="com.nexacro.uiadapter.spring.core.view.NexacroView">
        <property name="defaultContentType" value="PlatformXml" /> <!-- PlatformXml PlatformJson -->
        <property name="defaultCharset" value="UTF-8" />
    </bean>
     
    <!-- 넥사크로N RequestMappingHandlerAdapter 구현체 등록 -->
    <bean class="com.nexacro.uiadapter.spring.core.resolve.NexacroRequestMappingHandlerAdapter" p:order="0">
        <property name="customArgumentResolvers">
            <list><bean class="com.nexacro.uiadapter.spring.core.resolve.NexacroMethodArgumentResolver" /></list>
        </property>
        <property name="customReturnValueHandlers">
            <list>
                <bean class="com.nexacro.uiadapter.spring.core.resolve.NexacroHandlerMethodReturnValueHandler">
                    <property name="view"     ref="nexacroView" />
                    <property name="fileView" ref="nexacroFileView" />
                </bean>
            </list>
        </property>
    </bean>
     
    <!-- 넥사크로N EXCEPTION-RESOLVER 등록 -->
    <bean id="exceptionResolver" class="com.nexacro.uiadapter.spring.core.resolve.NexacroMappingExceptionResolver" p:order="1">
        <property name="view" ref="nexacroView" />  
        <property name="shouldLogStackTrace" value="true" />  
        <property name="shouldSendStackTrace" value="true" />
        <!-- shouldSendStackTrace 가 false 일 경우 nexacroN으로 전송되는 에러메시지  -->
        <!-- <property name="defaultErrorMsg" value="An Error Occured. check the ErrorCode for detail of error infomation" /> -->
        <property name="defaultErrorMsg" value="fail.common.msg" />
        <property name="messageSource" ref="messageSource" />  
    </bean>
     
    <!-- /////////////////////////////////// 넥사크로N UIADAPTER 설정 끝 /////////////////////////////////// -->
</beans>

 

12. Mybatis의 Map사용시 DB컬럼생성을 위한 Dtabase타입셋팅

    - Database 타입에 맞는 Mybatis Map 의 컬럼생성을 위해 context-nexacro.xml 파일을 생성 후 내용을 작성

    - 현재 전자정부표준프레임워크 샘플예제의 Database 는 hsqldb를 사용하기 때문에 Database 형식을 hsql 로 셋팅

    - 파일경로 : /resources/egovframework/spring/context-nexacro.xml    

    - 설정내용

       

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="
        ">
         
  <bean id="applicationContextProvider" class="com.nexacro.uiadapter.spring.core.context.ApplicationContextProvider" lazy-init="false" />
 
  <bean id="hsqlDbms"   class="com.nexacro.uiadapter.spring.dao.dbms.Hsql" />
  <bean id="oracleDbms" class="com.nexacro.uiadapter.spring.dao.dbms.Oracle" />
  <bean id="mssqlDbms"  class="com.nexacro.uiadapter.spring.dao.dbms.Mssql" />
  <bean id="mysqlDbms"  class="com.nexacro.uiadapter.spring.dao.dbms.Mysql" />
  <bean id="tiberoDbms" class="com.nexacro.uiadapter.spring.dao.dbms.Tibero" />
   
  <bean id="dbmsProvider" class="com.nexacro.uiadapter.spring.dao.DbVendorsProvider">
      <property name="dbvendors">
          <map>
           <entry key="HSQL Database Engine" value-ref="hsqlDbms"/>
<!--
           <entry key="Oracle"     value-ref="oracleDbms"/>
           <entry key="SQL Server" value-ref="mssqlDbms"/>
           <entry key="MySQL"      value-ref="mysqlDbms"/>
              <entry key="Tibero"     value-ref="tiberoDbms"/>
 -->
          </map>
      </property>
  </bean>
</beans>

 

 

13. Mybatis 의 Map 사용시 interceptor plugin 셋팅

     - Mybatis 의 Map 사용시 기본적으로 데이터 조회 후 결과가 없을시 컬럼을 생성하지 않는다.

     - 하지만 Mybatis 의 기능인 interceptor plugin 을 셋팅하면 쿼리 resultType 이 resultMap 일 경우 조회 결과가 없어도 해당 컬럼을 생성한다.

     - 그리하여 Mybatis 설정파일인 sql-mapper-config.xml 파일에 interceptor plugin 내용을 추가합니다

     - 파일경로 : /resources/egovframework/sqlmap/example/sql-mapper-config.xml

     - 파일내용

       

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
  <!-- myBatis Inteceptor for get column information  -->
  <plugins>
    <!-- NexacroMybatisMetaDataProvider :  Executor Plugin:쿼리를 실행하며,
        List 형태의 데이터 조회 시 조회된 결과가 0건일 경우 결과 메타데이 터 정보를 조회
        resultType이 Map 일 경우 추가적으로 메타데이터 조회를 위한 쿼리를 실행한다.  -->
    <plugin interceptor="com.nexacro.uiadapter.spring.dao.mybatis.NexacroMybatisMetaDataProvider" />
     
    <!-- NexacroMybatisResultSetHandler :ResultSetHandler Plugin – Executor Plugin에서 메타데이터 조회를 위해 쿼리를 실행하였을 경우에만 동작,
        ResultSetMetaData 와 resultType에 존재하는 필드 정보를 확인하여 메타데이터 정보를 조회 한 다.  -->
    <plugin interceptor="com.nexacro.uiadapter.spring.dao.mybatis.NexacroMybatisResultSetHandler" />
  </plugins>
</configuration>

 

99. 오류목록 및 해결방법

1. 오류내용

     오류1:org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.context.support.XmlWebApplicationContext]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup
     오류2:java.lang.NoClassDefFoundError: org/springframework/core/NativeDetector

     해결방법1 : pom.xml 에 추가

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>5.3.8</version>
</dependency>

       해결방법2 : http://support.tobesoft.co.kr/Support/?menu=QnA_View&postid=510459
                          위 url에서 jar를 down받은후 /WEB-INF/lib 밑으로 붙여 넣는다.

                          (nexa pom 설정이 정상적이지 않아서 필요한 jar들이 download되지 않아서 발생)
2. 오류내용
     java.lang.NoSuchMethodError: 'org.springframework.core.metrics.ApplicationStartup org.springframework.beans.factory.config.ConfigurableListableBeanFactory.getApplicationStartup()'
    해결방법 : pom.xml 에 아래내용추가
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.8</version>
</dependency>  
       해결방법2 : http://support.tobesoft.co.kr/Support/?menu=QnA_View&postid=510459
                          위 url에서 jar를 down받은후 /WEB-INF/lib 밑으로 붙여 넣는다.
                          (nexa pom 설정이 정상적이지 않아서 필요한 jar들이 download되지 않아서 발생)

 

3. 오류내용

       오류1: 

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'nexacroFileView': Unsatisfied dependency expressed through field 'useRequestCharset'; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'EtcProperty' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?

       오류2: 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'nexacroView': Unsatisfied dependency expressed through field 'useRequestCharset'; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'EtcProperty' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?
       해결방법1 : 모름

       해결방법2 : http://support.tobesoft.co.kr/Support/?menu=QnA_View&postid=510459">http://support.tobesoft.co.kr/Support/?menu=QnA_View&postid=510459
                          위 url에서 jar를 down받은후 /WEB-INF/lib 밑으로 붙여 넣는다.
                          (nexa pom 설정이 정상적이지 않아서 필요한 jar들이 download되지 않아서 발생)

                      

4. 오류내용

       오류: aused by: java.lang.NoClassDefFoundError: org/springframework/web/context/request/async/CallableProcessingInterceptor

       해결방법 : tomcat 삭제 후 다시 추가

'Nexacro-Framework > eGov & nexa' 카테고리의 다른 글

10. eGov4.0.0 환경설정  (0) 2022.07.02
3. eGov + nexa 연동  (0) 2022.07.02
2. uiadapter  (0) 2022.07.01
1. eGov4.0.0 설치 및 샘플 프로젝트 만들기  (0) 2022.07.01
Posted by 농부지기
,

[ uiadapter ]

 

1. uiadapter 란

    - url : https://www.playnexacro.com/#show:learn:1385

    

2. uiadapter 관련 문서

스프링프레임워크기반-nexacroplatform14(uiadapter14)-개발자가이드.pdf
1.03MB
스프링프레임워크기반-nexacroplatform14(uiadapter14)-초보자를_위한_자습서.pdf
1.26MB

 

 

 

 

'Nexacro-Framework > eGov & nexa' 카테고리의 다른 글

10. eGov4.0.0 환경설정  (0) 2022.07.02
3. eGov + nexa 연동  (0) 2022.07.02
3. eGov4.0 + uiadapterN  (0) 2022.07.01
1. eGov4.0.0 설치 및 샘플 프로젝트 만들기  (0) 2022.07.01
Posted by 농부지기
,

* eGov4.0.0 설치 및 샘플 프로젝트 만들기 *

1. url

     - https://www.egovframe.go.kr/

     - 다운로드 > 개발환경 > (4.x 다운로드) > eGovFrameDev-4.0.0-Win-64bit.exe

 

2. 설치 위치

     - D:\eGov\

 

3. eclipse.ini 환경설정

    -vm
    C:\Java\jdk-16.0.1\bin\javaw.exe

    ...

    -Xms2048m
    -Xmx2048m

 

6. maven 설정

    - setting.xml 파일 생성

    - 샘플용 setting.xml 파일 받기 

    - url : https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev4.0:gettingstarted)

    - 파일위치 : D:\eGov\maven\

    - setting.xml 파일 내부 변경

       <localRepository>D:\eGov\maven\repository</localRepository>

 

4. Tomcat 

    - C:\tomcat\apache-tomcat-9.0.45

       ( jdk-16.1.0, tomcat   9 : 정상 )

       ( jdk-16.1.0, tomcat 10 : 오류 )

 

    - Tomcat double click > Modules tab > [Edit]버튼 > 팝업 > Path [ / ] 로 변경 후 저장

 

5. 프로젝트 생성

    - eGovFrame Web Project

    - [v] Generate Example

    - Project > Maven -> Update Project

 

7. tomcat start - 오류 발생하면

    - 주로 maven용 jar파일들이 정상적으로 download가 안되는 경우

       . 해결방법 : (8. eGov 기본 maven repository 다운로드) 아래 내용 참조

    - tomcat start시 오류가 발생하면 주로 아래 4개 파일이 정상적으로 download안되는 경우에 발생

       아래 jar파일 4개를 maven repository에서  /WEB-INF/lib 밑으로  붙여 넣는다.

      . jstl-1.2.jar

      . org.egovframe.rte.ptl.mvc-4.0.0.jar

      . spring-modules-validation-0.9.jar

      . spring-webmvc-5.3.6.jar
    - project > Properties > Java Build Path > [Libraries] > [Add Library] > Web App Libraries 추가

 

8. eGov 기본 maven repository 다운로드

    - 만약, maven에서 jar를 down받지 못하면 아래 url를 통해서 eGov용 jar를 받을 수 있음

    - url : https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev4.0:gettingstarted

    - 해당 페이지에서 문자열 검색 : repository 4.0

    - D:\eGov\maven\  밑으로 붙여 넣는다.      기존 repository는 backup을 한 후 압축파일을 해제 한다.

 

9. 프로젝트 실행

 

 

99. 오류 목록 및 해결방법

1. 해결방법 : ?

     오류내용 : 

    Cannot invoke "org.apache.maven.index.context.IndexingContext.purge()" because "context" is null

 

2. 사유 : 컴파일에 사용된 Servlet API 버전과 배포 시에 사용된 tomcat의 Servlet API 버전이 차이때문에 발생.
    해결방법 : tomcat 버전에 맞는 Servlet API 버전을 프로젝트 상에서 지정하시면 됨
                       Servlet API버전에 맞는 tomcat 버전을 설치

                       (jdk-16.1.0, tomcat 10 : 오류)

                       (jdk-16.1.0, tomcat   9 : 정상)

    오류내용 : 
java.lang.ClassCastException: class org.egovframe.rte.ptl.mvc.filter.HTMLTagFilter cannot be cast to class jakarta.servlet.Filter (org.egovframe.rte.ptl.mvc.filter.HTMLTagFilter is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @ebaa6cb; jakarta.servlet.Filter is in unnamed module of loader java.net.URLClassLoader @3d494fbf)

 

사유 : 컴파일에 사용된 Servlet API 버전과 배포 시에 사용된 tomcat의 Servlet API 버전이 차이때문에 발생.
해결방법 : tomcat 버전에 맞는 Servlet API 버전을 프로젝트 상에서 지정하시면 됨
       Servlet API버전에 맞는 tomcat 버전을 설치

 

3. 해결방법 : jstl-1.2.jar(maven에 존재)를 /web-inf/lib 밑으로 붙여 넣는다.
    오류내용 : org.apache.jasper.JasperException: 절대 URI인 [http://java.sun.com/jsp/jstl/core]을(를), web.xml 또는 이 애플리케이션과 함께 배치된 JAR 파일 내에서 찾을 수 없습니다.

4. 해결방법 : spring-webmvc-5.3.6.jar(maven에 존재)를 /web-inf/lib 밑으로 붙여 넣는다.
    오류내용1 : org.apache.jasper.JasperException: 절대 URI인 [http://www.springframework.org/tags]을(를), web.xml 또는 이 애플리케이션과 함께 배치된 JAR 파일 내에서 찾을 수 없습니다.

   오류내용2: org.apache.jasper.JasperException: 절대 URI인 [http://www.springframework.org/tags/form]을(를), web.xml 또는 이 애플리케이션과 함께 배치된 JAR 파일 내에서 찾을 수 없습니다..

5. 해결방법 : org.egovframe.rte.ptl.mvc-4.0.0.jar(maven에 존재)를 /web-inf/lib 밑으로 붙여 넣는다.
    오류내용 : org.apache.jasper.JasperException: 절대 URI인 [http://egovframework.gov/ctl/ui]을(를), web.xml 또는 이 애플리케이션과 함께 배치된 JAR 파일 내에서 찾을 수 없습니다.

 

6. 해결방법 : spring-modules-validation-0.9.jar(maven에 존재)를 /web-inf/lib 밑으로 붙여 넣는다.

    오류내용 : org.apache.jasper.JasperException: 절대 URI인 [http://www.springmodules.org/tags/commons-validator]을(를), web.xml 또는 이 애플리케이션과 함께 배치된 JAR 파일 내에서 찾을 수 없습니다.

 

.

'Nexacro-Framework > eGov & nexa' 카테고리의 다른 글

10. eGov4.0.0 환경설정  (0) 2022.07.02
3. eGov + nexa 연동  (0) 2022.07.02
3. eGov4.0 + uiadapterN  (0) 2022.07.01
2. uiadapter  (0) 2022.07.01
Posted by 농부지기
,

17

카테고리 없음 2022. 6. 1. 14:25

17

Posted by 농부지기
,

코로나 양상자 백신 맞아야 하나 3

 

코로나19, 완치 후 또 걸린다…백신 접종해야

코로나19에 걸렸던 사람도 백신을 접종할 필요가 있다.

 

코로나19 사태와 관련해서 지금까지 백신을 접종하지 않은 사람이 코로나19에 걸리면 면역이 얼마나 오래 지속되는지 확실치 않았으며 예일대와 노스캐롤라이나 대학에서 코로나19에 걸린 후 면역이 장기간 유지되지 않고 감기나 독감처럼 반복적으로 코로나19 바이러스에 감염될 수 있다는 연구결과를 내놓았다.

 

연구진은 일반 감기를 유발하고 코로나19 바이러스(SARS-CoV-2)와 밀접한 연관이 있는 코로나 바이러스 재감염 및 면역학적 자료와 사스 코로나 바이러스와 메르스 코로나 바이러스에 대한 면역학적 자료를 분석하고 진화적 원리를 활용해서 재감염 위험을 예측할 수 있는 모델을 만들었다.

 

새로운 모델을 이용해서 재감염 위험을 비교했을 때 감기를 일으키는 리노바이러스나 독감을 일으키는 인플루엔자 바이러스처럼 풍토병을 일으키는 코로나바이러스와 마찬가지로 코로나19 바이러스도 재감염 위험이 높은 것으로 확인됐다.

 

Jeffrey Townsend 박사에 따르면 코로나19에 걸렸던 사람도 3개월 내에 다시 감염될 가능성이 있기 때문에 백신을 접종해야 하고 면역력이 저하되고 새로운 변이 바이러스가 출현하면서 코로나19 바이러스에 재감염되는 환자가 크게 늘 것으로 예상되며 코로나19도 일반 감기와 마찬가지로 매년 같은 바이러스에 재감염될 수 있다.

 

Yale University.

 

출처 : http://www.whosaeng.com/130629

Posted by 농부지기
,

오해: COVID-19에 걸려서 얻게된 자연 면역력이 COVID-19 백신 접종으로 얻는 면역력보다 낫습니다.

사실: COVID-19 백신 접종을 받는 것이 COVID-19에 걸리는 것보다 COVID-19에 대한 면역력을 형성하는 더 안전하고 신뢰할 수 있는 방법입니다.

COVID-19 백신 접종은 COVID-19 원인 바이러스에 감염되는 것보다 더 예측 가능한 면역 반응을 유발합니다. COVID-19 백신을 접종하면 대부분의 사람이 COVID-19에 대해 높은 수준의 면역력을 가질 수 있습니다. 이미 COVID-19에 걸렸던 사람의 면역력도 강화될 수 있습니다한 연구에 따르면 COVID-19에 걸린 사람들 중 회복 후 백신 접종을 받지 않은 사람들은 회복 후 백신 접종을 완료한 사람들보다 COVID-19에 다시 걸릴 확률이 2배 이상 높았습니다.

현재 미국에서 사용되는 모든 COVID-19 백신이 COVID-19 예방에 효과적입니다. COVID-19에 감염되면 미래의 질병에 대한 일정 수준의 보호 기능("자연 면역"이라고도 함)이 형성되지만, COVID-19 감염을 통해 얻는 보호 수준은 질병의 중증도, 감염 이후 경과 시간 및 환자의 연령에 따라 다양할 수 있습니다.

COVID-19 백신을 접종받는 것은 또한 COVID-19에 걸리는 것보다 보호 기능을 구축하는 데 더욱 안전한 방법입니다. COVID-19 백신은 감염 없이 항체 반응을 생성하여 사람들을 보호합니다. 또한 백신 접종을 받으면 주변 사람들, 특히 COVID-19 중증 질환 고위험군에 속한 사람들을 보호할 수 있습니다. COVID-19 감염은 중증 질환이나 사망을 초래할 수 있으며, 누가 경증 또는 중증 질환을 경험할지는 확실하게 예측할 수 없습니다. 감염자는 COVID-19를 다른 사람에게 퍼뜨릴 수 있습니다. 또한 COVID-19 감염 후에는 장기적인 건강 문제가 지속될 수도 있습니다.

이미 COVID-19에 감염되었던 사람도 백신 접종을 받아야 하는 이유에 대해 알아보세요.

 

출처 : https://korean.cdc.gov/coronavirus/2019-ncov/vaccines/facts.html

 

 

Posted by 농부지기
,