▼ 환경

eGovFrame 3.1 (전자정부프레임워크버전)

spring 3.2.9 release

egov 3.0.0 version

mod-socket-io 1.0.2 < -- 이건 머하는놈인질 모르겟음

◎ XML 설정

▼ 내용

먼저 전자정부에는 context-transaction.xml 이란 xml 파일이 있을꺼다 여기에 tx:advice 와 aop를 설정해주면 된다 .



context-transaction.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"> <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> <aop:pointcut id="requiredTx" expression="execution(* org.egovframework.karico..impl.*Impl.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" /> </aop:config> </beans>

◎ JAVA에 작성하기

▼ 내용

XML을 설정하였으면 트랜잭션을 걸 메소드에 아래와 같이 작성하면된다.

본인은 컨트롤러에 작성하였다 컨트롤러 안에는 INSERT문을 실행하는 SERVICE들이 한 4~5개 된다. 만약 아래의 commit 나 rollback 를 안써놓으면 그냥 트랜잭션이 잡혀있는상태로 된다.

톰캣을끄면 그트랜잭션은 사라지고 rollback 되는거같더라.

어쩃든 이렇게 작성해놓으면 commit이나 rollback 둘중 하나가 되기 전까지 디비에 써지진 않는다.

RESTfullReportController.java

@Controller public class RESTfullReportController { @Resource(name = "txManager") protected DataSourceTransactionManager txManager; @RequestMapping("/api/saveInitialCheckReport") public ModelAndView saveInitialCheckReport (HttpServletRequest request, HttpServletResponse response) throws Exception { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus txStatus = txManager.getTransaction(def); try { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ 각종 INSERT UPDATE 등 DB 문 ~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ txManager.commit(txStatus); //정상일경우 COMMIT; model.put("result", 0); } catch (Exception e) { e.printStackTrace(); txManager.rollback(txStatus); //에러날경우 CATCH로 빠져서 ROLLBACK; model.put("result", -1); } }


◎ 위에처럼만 하면 끝 생각보다 쉽다..



Spring - 프로젝트 한글깨짐 설정


◎ 이클립스 UTF-8 설정

STS(스프링) 에서 한글이 깨지는 이유는 기본 인코딩이 MS949로 되어 있어서 한글이 깨진다.

인코딩을 모두 UTF-8로 변경을 해주어야 한글이 깨지지 않는다.

먼저 Window - Preferences 로 들어가준다.


CSS, HTML, JSP 항목에서 Encoding 항목을 ISO 10646/Unicode(UTF-8)로 변경해 준다.


General -> Workspace의 Text file encoiding 을 UTF-8로 바꿔준다.


◎ 이클립스 웹브라우저 설정

▼ General -> Web Brower에서 New를 누른후 Chrome을 설정한다.


◎ XML UTF-8 설정

▼프로젝트내 web.xml 안에 아래 내용 추가

<web-app> 태그 안에 Servlet-mapping 태그 밑에 추가하면된다

<!-- 한글깨짐 방지 --> <!-- filter와 filter-mapping을 만들어 준다. --> <filter> <!-- filter안에는 filter-name, filter-class, init-param을 추가해 준다. filter-name은 원하는대로 지정해도됨 --> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <!-- encoidng값을 UTF-8로 만들어 준다. --> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

◎ JSP UTF-8 설정

▼ 맨위 <%@ UTF-8 설정과 META 태그의 UTF-8 설정을 해주면된다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page session="false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Home</title> </head> <body> <h1> Hello world! </h1> <P> The time on the server is ${serverTime}. </P> </body> </html>


  1. jhjeon 2021.06.08 15:18

    초보 개발자입니다. 덕분에 문제를 잘 해결했습니다 감사합니다.

  2. HEMON 2021.06.20 14:47 신고

    스프링 구축 후에 한글이 안돼서 한참 헤메고있었는데 덕분에 해결했습니다! 감사합니다!

◎ 라운드로빈 자바예제 파일

▼ 쓰레드를 만들고 작업시간 분할시간을 정해서 출력해서 보여주게끔 간단하게 잔 예제이다.

package javaSchedule; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Round_Robin { // WT (Wait Time) : 기다린 시간 // TT (Total Time ) : 총 걸린 시간 public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Time Quantum 시분할시간을 정하세요(숫자입력): "); int q = Integer.parseInt(br.readLine()); System.out.println("작업할 프로세스의 수를 정하세요 (숫자입력): "); int n = Integer.parseInt(br.readLine()); int proc[][] = new int[n + 1][4];//proc[][0] AT array, [][1] - RT , [][2] - WT , [][3] - TT for(int i = 1; i <= n; i++) { System.out.println(i + " 번쨰 프로세스의 작업시간은? (Burst Time) (숫자입력): "); proc[i][1] = Integer.parseInt(br.readLine()); } System.out.println(); //total_time 계산 및 time_chart 배열 초기화 int total_time = 0; for(int i = 1; i <= n; i++) { total_time += proc[i][1]; } int time_chart[] = new int[total_time]; int sel_proc = 1; int current_q = 0; for(int i = 0; i < total_time; i++) { //선택한 프로세스를 time_chart의 현재 시간에 할당 time_chart[i] = sel_proc; //1 단위 시간당 CPU가 할당되었으므로 선택한 프로세스의 남은 시간을 1 씩 감소시킵니다. proc[sel_proc][1]--; //WT 와 TT 산출 for문 for(int j = 1; j <= n; j++) { if(proc[j][1] != 0) { proc[j][3]++;//만약 프로세스 실행이 완료되지 않은 경우 TT는 1씩 증가함 if(j != sel_proc)//프로세스가 현재 CPU에 할당되지 않은 경우 WT는 1씩 증가함 proc[j][2]++; } else if(j == sel_proc)//이는 프로세스에 CPU가 할당되어 실행이 완료된 특수한 경우 proc[j][3]++; } //Time_Chart 출력 if(i != 0) { if(sel_proc != time_chart[i - 1]) //CPU가 다른 프로세스에 할당된 경우 현재 시간 값과 새 프로세스의 이름을 프린트 { System.out.print("--" + i + "--P" + sel_proc); } } else//현재 시간이 0인 경우, 즉 인쇄가 막 시작되면 첫 번째 선택된 프로세스의 이름을 프린트 System.out.print(i + "--P" + sel_proc); if(i == total_time - 1)//모든 프로세스 이름이 인쇄되었으므로 실행이 끝나는 시간을 프린트 System.out.print("--" + (i + 1)); //다음 번 반복을 위해 sel_proc 값 업데이트 current_q++; if(current_q == q || proc[sel_proc][1] == 0)//시간이 만료되었거나 현재 프로세스가 실행이 완료된경우 { current_q = 0; //sel_proc에 대해 다음 유효한 값을 선택 for(int j = 1; j <= n; j++) { sel_proc++; if(sel_proc == (n + 1)) sel_proc = 1; if(proc[sel_proc][1] != 0) break; } } } System.out.println(); System.out.println(); //각 프로세스의 WT 및 TT 인쇄 System.out.println("P\t WT \t TT "); for(int i = 1; i <= n; i++) { System.out.printf("%d\t%3dms\t%3dms",i,proc[i][2],proc[i][3]); System.out.println(); } System.out.println(); //WT & TT 평균시간 인쇄 float WT = 0,TT = 0; for(int i = 1; i <= n; i++) { WT += proc[i][2]; TT += proc[i][3]; } WT /= n; TT /= n; System.out.println("The Average WT is: " + WT + "ms"); System.out.println("The Average TT is: " + TT + "ms"); } }


'프로그래밍 > Java' 카테고리의 다른 글

Java - 라운드 로빈 (Round Robin) 예제  (0) 2019.05.29


◎ 오라클 설치 환경

OS : CentOS6.9 x64 (정확힌 Yum update 를 해서 6.10 final 이다. 6.9도 된건 확인함) Oracle : 11gR2

◎ 오라클 설치방법

1. Oracle 설치에 필요한 rpm 패키지 설치(없으면 깐다)

아래 명령을 복붙해서 설치

yum -y install setarch make glibc libaio compat-libstdc++-33 compat-gcc-34 gcc libXp openmotif compat-db glibc-devel libstdc++-devel xscreensaver binutils compat-libcap1 gcc-c++ libaio libaio-devel sysstat

2. Oracle 설치 위한 환경 설정

# vi /etc/sysctl.conf   //아래값보다 큰 경우에만 적용

# add parameter ##################################################### fs.aio-max-nr = 1048576 fs.file-max = 6815744 #kernel.shmall = 2097152 ## 원래 있던 값이 더 커서 주석 처리 #kernel.shmmax = 536870912 ## 원래 있던 값이 더 커서 주석 처리 kernel.shmmni = 4096 # semaphores: semmsl, semmns, semopm, semmni ######################## kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default=4194304 net.core.rmem_max=4194304 net.core.wmem_default=262144 net.core.wmem_max=1048586

# /sbin/sysctl -p // 상위 설정 변경값 반영(필수) 아래와같이 뜰꺼임 (확인용도)

net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key error: "net.bridge.bridge-nf-call-iptables" is an unknown key error: "net.bridge.bridge-nf-call-arptables" is an unknown key kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 4194304 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586

3. JAVA 설치 (Root 계정 사용 7,8버전 추천)

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

(자바파일 설치 링크)

Aceept 체크 후 linux x86 ,64 자기의 OS의 맞춰서 Tar 로 다운 ( 저는 tar가 편해서 이렇게함)

# gunzip jdk-8-linux-i586.tar.gz # tar -xvf jdk-8-linux-i586.tar

그후 압축을 압축을 풀면 jdk1.8.0_211 폴더가 생겼을 거임 그 폴더를 원하는 경로에 넣어주고 JAVA 폴더로 심볼릭 링크를 생성하면됨. 전 /usr/ 에 옮기고 JAVA 심볼릭 링크를 만듬

# mv jdk1.8.0_211 /usr/ # cd /usr # ln -s jdk1.8.0_211 java

위와 같이 명령어를 치면 아래 처럼 구조가 되있을거임

P.S 심볼릭 링크를 만드는 이유는 여러가지가 있겠지만 나중에 JDK 버전이 업데이트 됬을 시 환경 설정을 변경하지 않고 심볼릭 링크의 내용만 수정해 주면 된답니다.

이제 설치된 JAVA 파일을 계정에 등록해줘야 사용할수 있어서 등록해줌.

# vi /etc/profile //아래 구문을 복붙 해도 됨 #javapath JAVA_HOME=/usr/java CLASSPATH=.:$JAVA_HOME/lib/tools.jar PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME CLASSPATH PATH

그리고 리눅스에 기본적으로 설정된 java 명령어 위치의 인식을 피하기 위해 /usr/bin 디렉토리의 java 파일 이름을 바꿔줍시다. 그 후 source 명령어를 사용해 /etc/profile의 내용을 현제 쉘에 적용시킵니다. 그리고 java, javac 명령어로 버전을 확인해서 설치된 버전이 출력되면 제대로 설치 된겁니다.

# mv /usr/bin/java /usr/bin/java-old # source /etc/profile # java -version # javac -version

이렇게하면 자바 설치는 완료됬습니다. 오라클설치파일은 자바로 돌아가서 자바를 설치해야 설치가 가능합니다.

4. Oracle 관리자 계정 생성 (필수)

- 그룹 생성 # groupadd oinstall # groupadd dba - 계정 생성 # useradd -g oinstall -G dba -d /home/oracle oracle - 패스워드 설정 # passwd oracle - 패스워드 정책 변경 # pwconv - 그룹 및 계정 확인 # vi /etc/group oinstall:x:501: dba:x:502:oracle # vi /etc/passwd oracle:x:501:501::/home/oracle:/bin/bash

5. Oracle 계정 Profile 수정 ( oracle 계정 사용 , 필수)

# su - oracle $ vi /home/oracle/.bash_profile // 아래와 같이 입력 ## 아래는 11g 설정 export ORACLE_HOME=/oracle export ORACLE_HOME=$ORACLE_HOME/product/11gr2 export ORACLE_SID=INFRAORA export PATH=$PATH:$ORACLE_HOME/bin # export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601 // oracle 계정이 클라이언트로 언어문제 발생시 # export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949 // 에만 세팅 수정.. 설치시 아예 빼자!!

6. Oracle 11gr2 Release 2 다운로드 및 압축 풀기(Root 계정 사용, 필수)

▼ 오라클 홈페이지 11gR2 설치링크

https://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

리눅스 버전에 맞는 파일을 설치하면 되겠습니다.

이렇게 아무 폴더나 다운받으시고 2 파일의 압축을 풀어주시면 database 라는 폴더가 생길겁니다.

# unzip linux.x64_11gR2_database_1of2.zip # unzip linux.x64_11gR2_database_2of2.zip //압축이 다풀리면 원하는 경로에 database 를 가져다 놓으면 됩니다. 전 /oracle 에 옮겨놨습니다. # mv database /oracle/

7. 압축 푼 파일 database 폴더 oracle:oracle 권한 부여 (Root 계정 사용 , 필수)

# chown -R oracle.oinstall /oracle/database

8. 화면 권한 부여 (Root 계정 사용 , 필수)

# xhost + //만약 여기서 에러가 나면 터미널을 껏다가 다시 한번 시도해보시기 바랍니다. //그 이후도 안되면 에러 문구 구글 검색 하셔야 합니다 XHOST 화면권한이 안먹히는겁니다.

9. oracle 계정 선택 (필수)

- oracle 계정 사용 # su - oracle. - 한글 깨짐 방지(필요시) $ export LANG=C

10. runInstaller 실행(Oracle 계정 사용, 필수)

- 실행 $ cd /usr/local/src/database $ ./runInstaller






















11. 이메일 설정

- 이메일 설정 체크박스 해제/메시지 박스 나오면 OK.


12. 설치 옵션 선택

- Database 생성 및 구성 선택.



13. Desktop vs. Server Class 선택

- Server Class 선택.



14. DB 운영 선택

- 단독 인스턴스 DB 선택.



15. Typical vs. Advanced install 선택

- Advanced install 선택.



16. 언어 선택

- Korean 추가.



17. 에디션 선택

- Standard Edition 선택.



18. $ORACLE_HOME, $ORACLE_BASE 확인

- .bash_profile과 동일한지 확인.



19. 인벤토리 설정

- /oracle/oraInventory로 경로 설정.

- oinstall로 그룹 설정.

- 메시지 박스에서 Yes 선택.



20. 데이터베이스 타입 선택

- General Purpose / Transaction Processing 선택.



21. DB명 및 SID 설정

- 다른 인스턴스 추가가 아니라면 동일하게 입력.



22. 메모리 설정

- Enable Automatic Memory Management 체크.


23. 문자셋 선택

- KO16WIN949 선택.



24. 보안 설정

- Assert all new security settings 체크.



25. Oracle Enterprise Manager 11g Grid Control 선택

- 그냥 다음으로 PASS.



26. File Storage 선택

- File System 선택.

- /oradata 입력.



27. 자동 백업 선택

- Do not enable automated backups 선택.



28. 계정 암호 설정

- Use the same password for all accounts 선택 후 암호 입력.



29. SYSDBA, SYSOPER 그룹 선택

- 둘다 dba로 선택.



30. 설치 요구사항 체크

- 패키지가 상위버전이 깔린 경우 Failed가 뜨는 건지도...

- pdksh은 직접 받아서 깔아야 한다고도...

(http://rpm.pbone.net/index.php3/stat/4/idpl/2398776/com/pdksh-5.2.14-8.i386.rpm.html)

※ 이후 진행은 시키는 대로...


◎ 오라클 원격(외부) 접속 허용

▼ 내용

보통 linux (CentOS 6.9) 설치하면 방화벽은 따로 안막혀있다. 그런데 오라클 설치하고 원격으로 접속하려 하면 자꾸 접속이 안되있다. 리스너도 start 했고 db도 startup 했는데 원격으로 접속이 안된다면.

Port 번호가 막혀있는거다. 그래서 port번호를 열어줘야한다.

lsnrctl start //리눅스의 oracle 계정으로 실행 startup // "sqlplus / as sysdba" --db 접속후 start up //이렇게 하고도 원격으로 접속이 안된다면 방화벽 확인 후 방화벽도 정상이라면 iptables -I INPUT 1 -p tcp --dport 1521 -j ACCEPT //1521 PORT를 열어준다







◎ => (애로우 함수)

▼ 내용

ECMA6 들어서면서 => 애로우 함수를 사용할수 있따.

const handleListening = () =>{ console.log('ㅎㅇ'); } // 위에 는 const handleListening = function () { console.log('ㅎㅇ'); } //이거랑 같다

◎ import , export

▼ 내용

import 문은 외부 모듈이나 다른 스크립트 등으로부터 export 된 기능을 가져오는데 사용됩니다.

(함수,변수 모듈화 class화?)

자바스크립트는 호이스팅이 되는 관계로 변수나 함수가 전역에서 사용할 수 있었기 때문에 이름으로 충돌을 일으키는 경우가 많아서 이용하기 어려웠다. (CommonJS로 사용할 수는 있었음)

ES6부터는 모듈 시스템을 사용할 수 있게 만들었다.

하지만 브라우저에서 지원이 되지 않고있기때문에 webpack같은 모듈 번들러를 사용해야만 모듈시스템(import, export)을 사용할 수 있다.

문법.. import name from "module-name"; import * as name from "module-name"; import { member } from "module-name"; import { member as alias } from "module-name"; import { member1 , member2 } from "module-name"; import { member1 , member2 as alias2 , [...] } from "module-name"; import defaultMember, { member [ , [...] ] } from "module-name"; import defaultMember, * as alias from "module-name"; import defaultMember from "module-name"; import "module-name";

export const pi = Math.PI; export function square(x) { return x * x; } export class Person { constructor(name) { this.name = name; } }

export 키워드로 변수, 함수, 클래스를 외부의 스크립트로 모듈화 시킬 수 있다.

외부로 보내고 싶은 것들에 일일이 키워드를 붙여도 되고 아래처럼 한번에 export해도된다.

const pi = Math.PI; function square(x) { return x * x; } class Person { constructor(name) { this.name = name; } } export { pi, square, Person };
import {userRouter} from "./router"; //export const userRouter = express.Router(); import app from "./app"; //export default app;

또한 export default app; 이렇게 할경우엔 바로 import app 할수 있지만

(export default 파일명 한다는건 안에있는 모든걸 export 해준다는것)

export const userRouter 이렇게 할경우엔 가져올때 {} 를 붙혀서 써줘야한다.

// main.js import { pi, square, Person } from './lib'; console.log(pi); // 3.141592653589793 console.log(square(10)); // 100 console.log(new Person('Lee')); // Person { name: 'Lee' }

반대로 가져오는 방법은 위와 같이 "import" 키워드를 사용하고 from 으로 해당 모듈의 js파일을 가리키면 된다.

import * as lib from './lib'; console.log(lib.pi); // 3.141592653589793 console.log(lib.square(10)); // 100 console.log(new lib.Person('Lee')); // Person { name: 'Lee' }

위와 같이 "as"를 사용해서 일일이 모듈을 불러오지 않고 한번에 사용할 수 있다.


◎ 구조 분해 할당 ( destructuring assignment )

▼ 내용

객체 또는 배열을 소인수분해 하듯이 분해하여 할당할수 있다.

const searchingBy = req.query.term //기존방식 const { query: {term : searchingBy} //req.query.term 의값을 searchingBy 할당 } = req;

솔직히 이걸 작성하면서 대략적인 느낌만 이해가간다.. 하지만 왜 구지 보기힘들게 이렇게쓰나 싶다.. 나중에 이해더가면 추후작성하기로하고 mdn 주소를 남긴다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

새로운 변수 이름에 할당

객체 구조분해를 사용하여 새로운 변수 이름에 값을 할당할 수 있습니다.

var o = {p: 42, q: true}; var {p: foo, q: bar} = o; console.log(foo); // 42 console.log(bar); // true






+ Recent posts