Your SlideShare is downloading. ×
0
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Application Architecture 교육자료
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Application Architecture 교육자료

657

Published on

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
657
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Applicaton Architecture 교육자료 ( 초안 작성중 ) 2014 年 7 月 2 日 TS
  • 2. - 2 - 1. 시스템 구성안 2. WAS(WebSphere/WebLogic/JBOSS) 3. JDK(Oracle/IBM/HP) 4. 개발가이드 ( 성능 / 보안 ) 5. 개발툴 (STS) 6. 빌더툴 (Ant/Maven/Gradle) 7. 프로젝트 자동화 도구 (CI/BTS/…)
  • 3. - 3 - 설계자 / 개발자기획자 기획기획 소통소통 설계설계 DBA html 코딩html 코딩 javascript 코딩javascript 코딩 css 코딩css 코딩 DB 운영DB 운영 Query 튜닝Query 튜닝 이미지 개발이미지 개발 DB 설계 및 개발DB 설계 및 개발 Query 개발Query 개발 비지니스로직 설계 및 개발비지니스로직 설계 및 개발 WAS 모니터링WAS 모니터링 JVM 모니터링JVM 모니터링 프로그램 배포프로그램 배포 프로그램 테스트프로그램 테스트
  • 4. - 4 - BizController View DispatcherServlet Load XML Controller JSP Transfer request data Custom Tag Libraries Service ServiceImpl Service DAO DAOImpl DAO Persistence iBATIS Spring Service 와 iBATIS(ORM) 를 사용한 모델 구성 Configuration XML web.xml application- context.xml …. Transaction Scope 처리 응답 Client jQuery Ajax library Spring MVC 를 사용한 모델 구성 DAO Database UI 레이어UI 레이어 Biz 레이어Biz 레이어 DATA 레이어DATA 레이어 Cache 적용 방안 1 Cache 적용 방안 2
  • 5. - 5 - 접검리스트  진단점검 측정치 (Performance Metrics/Counters) 가상사용자 (Virtual User) 활용방안 운영체제 (OS) 어플리케이션 (WAS) 데이터베이스 (DB) 평균 응답시간 및 분위별 (Percentile) 응답 시간 통계 TPS (Transactions per sec, 초당 처리량 ) BPS (Bytes per sec, 네트워크 사용량 ) 응답코드 , 응답 크기 어플리케이션 처리 시간 분석 성능 포화점 분석 및 용량 산정 네트워크 사용량 및 네트워크 지연 분석 어플리케이션 기능 확인 CPU, CPU Q, User/Sys Mode 사용현황 메모리 사용현황 Disk 사용현황 및 Disk I/O 현황 네트워크 사용 현황 프로세스 , Swap, Page I/O 현황 외 HW 수준 병목 분석 운영체제 수준 병목 분석 부하분산 분석 프로세스 / 쓰레드 분석 기타 리소스 현황 분석 Heap 사용현황 GC 현황 Thread 현황 DB 연결 등 Pool 현황 기타 리소스 현황 JVM 수준의 병목 분석 Heap 사용 분석 각종 리소스 , Pool 사용 분석 SQL 처리 현황 Session 현황 각종 Lock, Latch 현황 Cache, Buffer 사용 현황 각종 I/O 현황외 SQL 처리 성능 분석 Cache, Buffer 병목 분석 Session 최적화 분석 각종 리소스 병목 분석
  • 6. - 6 - 기초 데이터  H/W 산정 사용자 산정사용자 산정 • 동시 사용자 산출 - 동시사용자 = 접속 사용자의 통상 5% • OPS : - 웹 서버는 Specweb99 OPS 산정이 나 , 다양한 어플리케이션 구동 및 연동 으로 인해 TPS 로 변환 가정 . 4 TPM 가정 (1TPM 은 request 와 response 로 정의 ) • 업무 동시 사용자 산출 - 업무 특성상 접속사용자는 전체 사용자 로 가정 - 동시 사용자는 50% 로 가정 • TPM : 조회 , 수정 , 입력 등의 행위 기초 데이터 산정 기준기초 데이터 산정  1 일 쇼핑몰 사용자 : 170 만 명 ( 잠재 고객 * 3 ) - 접속 사용자 : (170 만 *10%) = ? 명 - 동시 사용자 : 170 만 명 ( 접속사용자 )*5%( 동시사용자 ) = ? 명  1 일 쇼핑몰 사용자 : 170 만 명 ( 잠재 고객 * 3 ) - 접속 사용자 : (170 만 *10%) = ? 명 - 동시 사용자 : 170 만 명 ( 접속사용자 )*5%( 동시사용자 ) = ? 명
  • 7. - 7 - CPU 용량산정  H/W 산정 구분 항목 보정치 용량 단위 비고 1 전체 사용자   2,030 명 접속사용자 = 2 동시 사용자 0.2 406 명 전체사용자의 20% 3 분당 트랜잭션 수 10.0 4,060 개 사용자 당 분당 10 트랜잭션 발생 4 기본 tpmC 보정 1.3 5,278 tpmC 한국정보통신기술협회 TTAK.KO-10.0292 평균 값 적용 5 Peak Time 보정 1.5 7,917 tpmC 한국정보통신기술협회 TTAK.KO-10.0292 최대 값 적용 6 데이터베이스 크기보정 1.5 11,876 tpmC 한국정보통신기술협회 TTAK.KO-10.0292 평균 값 적용 7 어플리케이션 구조보정 1.4 16,626 tpmC 한국정보통신기술협회 TTAK.KO-10.0292 평균 값 적용 8 어플리케이션 부하보정 2.0 33,251 tpmC 한국정보통신기술협회 TTAK.KO-10.0292 평균 값 적용 9 연계구조를 위한 보정 3.5 116,380 tpmC 기타업무시스템 와 연동 보정 10 네트워크 보정 1.3 151,294 tpmC 타 시스템과의 연계로 인한 성능부담을 tpmC 로 보정 11 클러스터 보정 1.5 226,941 tpmC 한국정보통신기술협회 TTAK.KO-10.0292 평균 값 적용 12 시스템 여유율 (%) 3.7 841,950 tpmC 이중화 S/W 및 Fail-Over 에 대한 보정 13 필요 tpmC 841,950 tpmC 제안 tpmC: 891,200tpmC 서버 용량산정은 한국정보통신기술협회 (TTA) 정보통신 단체표준 TTAK.KO-10.0292 를 참조하여 해당 업무시스템 현황조사를 바탕으로 도출된 기초 데이터 및 각 항목별 보정치를 적용합니다 .
  • 8. - 8 - 1. 시스템구성 1 안 Memory 용량산정  H/W 산정 구분 항목 보정치 용량 단위 비고 1 운영체제 사용영역   2,048 MB OS 2 SGA (System Global Area)   10,240 MB DBMS 엔진 , 미들웨어 엔진 , 기타 유틸리티 등의 소요 공간 3 사용자당 필요메모리 2.0 2,612 MB 동시 사용자 3000 명 , 사용자 당 필요 메모리 2MB 4 기타 SW 사용영역   2,048 MB EMS, DB 모니터링 등 5 시스템 메모리 영역   16,948 MB 1)+2)+3)+4) 6 버퍼 캐쉬 보정 1.2 20,338 MB 처리속도를 향상시키기 위해 일정량의 데이터를 임시로 모아 놓은 기억장소 7 시스템 여유율 (%) 3.7 75,452 MB 5 년치 시스템 여유율 (30%) 적용 8 필요 메모리 용량 75,452 MB 제안용량 : 80GB
  • 9. - 9 - 1. 시스템구성 1 안 DISK 용량산정  H/W 산정 구분 항목 보정치 용량 단위 비고 1 시스템 OS 영역   20,000 MB   2 응용소프트웨어 영역   30,000 MB Oracle 엔진 , DB 모니터링 , EMS Agent, 백업 Agent 등 S/W 용욕 3 SWAP 영역   80,000 MB Physical Memory * 1 4 백업영역   30,000 MB 백업 영역 5 데이터 영역   30,000 MB 시스템 관리 및 로그영역 6 소계   190,000 MB 1)+2)+3)+4)+5) 7 파일시스템 오버헤드 1.3 247,000 MB   8 시스템 여유율 (%) 1.3 321,100 MB 시스템 디스크는 시스템 및 log 영역 등을 주기적으로 백업하므로 1 년치 여유율 (30%) 만 적용 9 RAID 보정 2.0 642,200 MB OS Disk Mirroring (146GB *6ea) 10 필요 HDD 용량 642,200 MB 제안용량 : 146GB * 6 (876GB)  
  • 10. - 10 - 1. 시스템구성 1 안 GID 정리  시스템 명령규칙 그룹명 그룹 ID 사용 목적 dba 1000 오라클 DBA 그룹 oinstall 1010 오라클 설치 그룹 hagsuser 1020 오라클 RAC 설치 그룹 was 1030 WAS, Web 그룹 사용자 그룹 5001 ~ 사용자 그룹 UID 정리 계정명 계정 ID 그룹명 그룹 ID 사용 목적 oracle 1000 dba 1000 Oracle maxgauge 1010 dba 1000 Maxgauge(DB 성능관리 ) ogg 1020 dba 1000 CDC (Oracle Golden Gate) jeus 1030 was 1030 JEUS diver 1040 was 1030 검색엔진 wiselog 1050 was 1030 웹로그 jennifer 1060 was 1030 was 모니터링 xcuredb 1070 dba 1000 DB 암호화 oden 1080 was 1030 배포 도구 사용자계정 #1 5001~ staff   5000 5101~ 사용자 계정
  • 11. - 11 - 1. 시스템구성 1 안 개발가이드  Oracle
  • 12. - 12 - 1. 시스템구성 1 안 Oracle Architecture  Oracle
  • 13. - 13 - 1. 시스템구성 1 안 Oracle 11g Architecture  Oracle
  • 14. - 14 - 1. 시스템구성 1 안  온라인 업무시스템 구성 무정지시스템 구성안
  • 15. - 15 - 1. 시스템구성 2 안  온라인 업무시스템 구성 다운타임이 가능한 시스템 구성안
  • 16. - 16 - 1. 시스템구성 3 안  온라인 업무시스템 구성 동접사용자가 많은 업무 시스템 구성안 ( 쇼핑몰 )
  • 17. - 17 - 1. 시스템구성 3 안  업무시스템 구성 방화벽 * 2 F/W 웹가속 , 분산 , 리 젝 웹가속 , 분산 , 리 젝 Storage L7 (#1) ORACLE(RAC) (#1) (#2) SAN Switch WEB (#1) NAS G/W (#2) 형상관리 (#1) 검색 / 메일서버 (#1) 개발기 DB WEB WAS (#1) (#2) (#3) WEB (#2) WEB (#3) WEB (#4) WAS (#1) WAS (#2) WAS (#3) WAS (#4) NAS G/W (#1) (#1) (#2) L7 (#2) 검색 / 메일서버 (#2) DB 접근제어 (#1) (#2) (#3) 스트리밍 (#1) (#2) DB 정책서 버 (#1) (#2) 백업서버 (#1) VTL 장비 (#1) SSO WAS (#1) SSO WAS (#2) I/F 통신 (#1) 웹방화벽 *2IPS * 2
  • 18. - 18 - 4. 개발툴  자동화도구 L4 사용자 L4 Cache L4 구성 CDN 구성 Web WEB 구성 WAS WAS 구성 Web WAS Coherence Cache 구성 Cache DB 구성 DB DB Local Cache Coherence Local Cache SSO EMS PG I/F SMS 카드사
  • 19. - 19 - 2. 상용 WAS  TMAX JEUS/WEBTOB 분석 / 설계
  • 20. - 20 - 2. 상용 WAS / 개발가이드  TMAX JEUS/WEBTOB 분석 / 설계 webSRV4 webSRV3 webSRV2 webSRV1 wasSRV4 wasSRV3 wasSRV2 wasSRV1 web1(WEB) web2(WEB) web3(WEB) web4(WEB) was1(WAS) was1_Container1 (WWW Front) was2(WAS) was2_Container1 (WWW Front) was3(WAS) was3_Container1 (WWW Front) was4(WAS) was4_Container1 (WWW Front) L4
  • 21. - 21 - 2. 상용 WAS  IBM WebSphere/HTTPD Machine1 Profile1 application frontfront bossboss Machine2 Profile2 application frontfront bossboss F_Cluster Node AgentNode Agent DmgrDmgr HttpServer httpd.confhttpd.conf httpd8081.confhttpd8081.conf HttpServer httpd.confhttpd.conf httpd8081.confhttpd8081.conf B_Cluster 분석 / 설계
  • 22. - 22 - 2. 상용 WAS  IBM WebSphere/HTTPD 분석 / 설계
  • 23. - 23 - 2. 상용 WAS / 개발가이드  IBM WebSphere/HTTPD 분석 / 설계
  • 24. - 24 - 2. 상용 WAS  Oracle WebLogic/HTTPD 분석 / 설계
  • 25. - 25 - 2. 상용 WAS / 개발가이드  Oracle WebLogic/HTTPD 분석 / 설계
  • 26. - 26 - 2. 상용 WAS  RedHat JBOSS/HTTPD 분석 / 설계
  • 27. - 27 - 2. 상용 WAS / 개발가이드  RedHat JBOSS/HTTPD 분석 / 설계
  • 28. - 28 - 2. OSS WAS / 개발가이드  RedHat GLASSFISH 분석 / 설계
  • 29. - 29 - 2. WAS 기능 비교  기능 비교 분석 / 설계
  • 30. - 30 - 2. WAS 기능 비교  기능 비교 분석 / 설계
  • 31. - 31 - 2. WAS 기능 비교  기능 비교 분석 / 설계
  • 32. - 32 - 2. WAS 기능 비교  기능 비교 분석 / 설계
  • 33. - 33 - 2. WAS 기능 비교  기능 비교 분석 / 설계
  • 34. - 34 - 2. WAS 기능 비교  기능 비교 분석 / 설계
  • 35. - 35 - 4. Session Cluster ( DataGrid )  HP 분석 / 설계
  • 36. - 36 - 4. HotDeploy  HP 분석 / 설계
  • 37. - 37 - 4. RollOut Deploy  HP 분석 / 설계
  • 38. - 38 - 3. JDK / 튜닝가이드  Oracle HOTSPOT 분석 / 설계
  • 39. - 39 - 3. JDK / 튜닝가이드  Oracle JROCKET 분석 / 설계
  • 40. - 40 -  IBM 분석 / 설계 3. JDK ( JVM )
  • 41. - 41 -  Oracle HotSpot -server -Xms2048m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/dump/ 3. JDK ( JVM )
  • 42. - 42 -  Oracle HotSpot -server -Xms2048m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/dump/ 3. JDK ( JVM )
  • 43. - 43 - 3. JDK ( JVM )  Classloader
  • 44. - 44 - 1. 개발가이드 1) Minimize HTTP Requests ( HTTP 요청을 최소화 하라 ) 2) Use a Content Delivery Network ( CDN 을 이용하라 ) 3) Add an Expires or a Cache-Control Header ( 응답헤더에 Expires 혹은 Cache-Control 을 추가하라 ) 4) Gzip Components ( gzip 으로 압축하라 ) 5) Put Stylesheets at the Top ( 스타일시트는 문서의 위쪽에 넣어라 ) 6) Put Scripts at the Bottom ( 스크립트는 문서의 아래쪽에 넣어라 ) 7) Avoid CSS Expressions ( CSS Expression 을 피하라 ) 8) Make JavaScript and CSS External ( 자바스크립트와 CSS 는 외부 파일로 만들어라 ) 9) Reduce DNS Lookups ( DNS 검색을 줄여라 ) 10) Minify JavaScript an CSS ( 자바스크립트와 CSS 의 크기를 작게 하라 ) 11) Avoid Redirects ( 리다이렉션을 피하라 ) 12) Remove Duplicate Scripts ( 중복 스크립트를 제거하라 ) 13) Configure Etags (Etags 를 설정하라 ) 14) Make Ajax Cacheable ( AJAX 도 캐싱할 수 있도록 만들어라 ) 15) Flush the Buffer Early ( 버퍼를 빨리 비워라 ) 16) Use GET for AJAX Requests ( AJAX 요청시 GET 를 사용하라 ) 17) Post-load Components ( 사후 구성 컴포넌트 ) 18) Preload Components ( 사전 구성 컴포넌트 ) 1) Minimize HTTP Requests ( HTTP 요청을 최소화 하라 ) 2) Use a Content Delivery Network ( CDN 을 이용하라 ) 3) Add an Expires or a Cache-Control Header ( 응답헤더에 Expires 혹은 Cache-Control 을 추가하라 ) 4) Gzip Components ( gzip 으로 압축하라 ) 5) Put Stylesheets at the Top ( 스타일시트는 문서의 위쪽에 넣어라 ) 6) Put Scripts at the Bottom ( 스크립트는 문서의 아래쪽에 넣어라 ) 7) Avoid CSS Expressions ( CSS Expression 을 피하라 ) 8) Make JavaScript and CSS External ( 자바스크립트와 CSS 는 외부 파일로 만들어라 ) 9) Reduce DNS Lookups ( DNS 검색을 줄여라 ) 10) Minify JavaScript an CSS ( 자바스크립트와 CSS 의 크기를 작게 하라 ) 11) Avoid Redirects ( 리다이렉션을 피하라 ) 12) Remove Duplicate Scripts ( 중복 스크립트를 제거하라 ) 13) Configure Etags (Etags 를 설정하라 ) 14) Make Ajax Cacheable ( AJAX 도 캐싱할 수 있도록 만들어라 ) 15) Flush the Buffer Early ( 버퍼를 빨리 비워라 ) 16) Use GET for AJAX Requests ( AJAX 요청시 GET 를 사용하라 ) 17) Post-load Components ( 사후 구성 컴포넌트 ) 18) Preload Components ( 사전 구성 컴포넌트 ) 웹 사이트 성능 최적화 35 개 법칙 ( Yahoo 의 성능개선팀 )  Front-End
  • 45. - 45 - 17) Reduce the Number of DOM Elements ( DOM 요소의 갯수를 줄여라 ) 18) Split Components Across Domains ( 컴포넌트를 도메인별로 분리하라 ) 19) Minimize the Number of iframes (Iframe 의 갯수를 최소화 하라 ) 20) No 404s (404 오류가 발생하지 않게 하라 ) 21) Reduce Cookie Size ( 쿠키의 크기를 줄여라 ) 22) Use Cookie-free Domains for Components ( 컴포넌트는 쿠키가 없는 도메인을 사용라라 ) 23) Minimize DOM Access ( DOM 접근을 최소화 하라 ) 24) Develop Smart Event Handlers ( 이벤트 핸들러를 잘 개발하라 ) 25) Choose <link> over @import ( @import 보다는 <link> 태그를 써라 ) 26) Avoid Filters ( CSS 필터를 피하라 ) 27) Optimize Images ( 이미지를 최적화하라 ) 28) Optimize CSS Sprites ( CSS 스프라이트를 최적화 하라 ) 29) Don’t Scale Images in HTML ( HTML 로 지정한 크기보다 큰 이미지를 사용하지 마라 ) 30) Make favicon.ico Small and Cacheable ( favicon.ico 파일은 작게 만들고 캐싱되도록 만들어라 ) 31) Keep Components under 25k ( 컴포넌트 크기를 25KB 이하로 유지하라 ) 32) Pack Components into a Multipart Documents ( 컴포넌트를 멀티파트 문서로 묶어라 ) 33) Avoid Empty Image src ( 이미지의 src 속성 값을 빈 채로 만들지 마라 ) 17) Reduce the Number of DOM Elements ( DOM 요소의 갯수를 줄여라 ) 18) Split Components Across Domains ( 컴포넌트를 도메인별로 분리하라 ) 19) Minimize the Number of iframes (Iframe 의 갯수를 최소화 하라 ) 20) No 404s (404 오류가 발생하지 않게 하라 ) 21) Reduce Cookie Size ( 쿠키의 크기를 줄여라 ) 22) Use Cookie-free Domains for Components ( 컴포넌트는 쿠키가 없는 도메인을 사용라라 ) 23) Minimize DOM Access ( DOM 접근을 최소화 하라 ) 24) Develop Smart Event Handlers ( 이벤트 핸들러를 잘 개발하라 ) 25) Choose <link> over @import ( @import 보다는 <link> 태그를 써라 ) 26) Avoid Filters ( CSS 필터를 피하라 ) 27) Optimize Images ( 이미지를 최적화하라 ) 28) Optimize CSS Sprites ( CSS 스프라이트를 최적화 하라 ) 29) Don’t Scale Images in HTML ( HTML 로 지정한 크기보다 큰 이미지를 사용하지 마라 ) 30) Make favicon.ico Small and Cacheable ( favicon.ico 파일은 작게 만들고 캐싱되도록 만들어라 ) 31) Keep Components under 25k ( 컴포넌트 크기를 25KB 이하로 유지하라 ) 32) Pack Components into a Multipart Documents ( 컴포넌트를 멀티파트 문서로 묶어라 ) 33) Avoid Empty Image src ( 이미지의 src 속성 값을 빈 채로 만들지 마라 ) 개발가이드  Front-End 1. 개발가이드
  • 46. - 46 - <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>yuicompressor-maven-plugin</artifactId> <version>1.4.0</version> <executions> <execution> <id>compress_js_css</id> <phase>process-resources</phase> <goals> <goal>compress</goal> </goals> </execution> </executions> <configuration> <excludes> <exclude>**/*.min.js</exclude> <exclude>**/*-min.css</exclude> <exclude>**/*.min.css</exclude> <exclude>**/WEB-INF/**/*</exclude> </excludes> <jswarn>false</jswarn> <nosuffix>true</nosuffix> <warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory> <webappDirectory>${project.build.directory}/min</webappDirectory> </configuration> </plugin> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>yuicompressor-maven-plugin</artifactId> <version>1.4.0</version> <executions> <execution> <id>compress_js_css</id> <phase>process-resources</phase> <goals> <goal>compress</goal> </goals> </execution> </executions> <configuration> <excludes> <exclude>**/*.min.js</exclude> <exclude>**/*-min.css</exclude> <exclude>**/*.min.css</exclude> <exclude>**/WEB-INF/**/*</exclude> </excludes> <jswarn>false</jswarn> <nosuffix>true</nosuffix> <warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory> <webappDirectory>${project.build.directory}/min</webappDirectory> </configuration> </plugin> YUI Compressor Maven 적용 ( http://davidb.github.io/yuicompressor-maven-plugin/ )  Front-End 1. 개발가이드
  • 47. - 47 - 4. 개발가이드  성능개선 캐쉬사용하기
  • 48. - 48 - 1. 개발가이드 Cache 사용 – spring 설정정보  Cache 사용으로 성능개선 <!-- enables scanning for @Cacheable annotation --> <cache:annotation-driven/> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcache"/> </bean> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean> <!-- enables scanning for @Cacheable annotation --> <cache:annotation-driven/> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcache"/> </bean> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean>
  • 49. - 49 - 1. 개발가이드 Cache 사용 – Java 코딩  Cache 사용으로 성능개선 import org.springframework.util.StopWatch; @Controller public class VetController { StopWatch stopWatch = new StopWatch("Stop Watch"); @RequestMapping("/vets") public String showVetList(Model model) { logger.debug("VetController::@Cacheable::vets::"); stopWatch.start("initializing"); Vets vets = new Vets(); vets.getVetList().addAll(this.clinicService.findVets()); model.addAttribute("vets", vets); stopWatch.stop(); logger.debug("took " + stopWatch.getLastTaskTimeMillis() + " ms"); logger.debug(stopWatch.toString()); logger.debug(stopWatch.prettyPrint()); return "vets/vetList"; } import org.springframework.util.StopWatch; @Controller public class VetController { StopWatch stopWatch = new StopWatch("Stop Watch"); @RequestMapping("/vets") public String showVetList(Model model) { logger.debug("VetController::@Cacheable::vets::"); stopWatch.start("initializing"); Vets vets = new Vets(); vets.getVetList().addAll(this.clinicService.findVets()); model.addAttribute("vets", vets); stopWatch.stop(); logger.debug("took " + stopWatch.getLastTaskTimeMillis() + " ms"); logger.debug(stopWatch.toString()); logger.debug(stopWatch.prettyPrint()); return "vets/vetList"; }
  • 50. - 50 - 1. 개발가이드 Logback 사용 – maven / nexus  Cache 사용으로 성능개선 @Override @Transactional(readOnly = true) @Cacheable(value = "vets") public Collection<Vet> findVets() throws DataAccessException { logger.debug("ClinicServiceImpl::@Cacheable::vets::"); return vetRepository.findAll(); } @Override @Transactional(readOnly = true) @Cacheable(value = "vets") public Collection<Vet> findVets() throws DataAccessException { logger.debug("ClinicServiceImpl::@Cacheable::vets::"); return vetRepository.findAll(); }
  • 51. - 51 - 1. 개발가이드 Logback 사용 – maven / nexus  Cache 사용으로 성능개선 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"> <diskStore path="java.io.tmpdir"/> <!-- objects are evicted from the cache every 5 seconds --> <cache name="vets" timeToLiveSeconds="5" maxElementsInMemory="100" eternal="false" overflowToDisk="false" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="1" memoryStoreEvictionPolicy="LRU"/> </ehcache> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"> <diskStore path="java.io.tmpdir"/> <!-- objects are evicted from the cache every 5 seconds --> <cache name="vets" timeToLiveSeconds="5" maxElementsInMemory="100" eternal="false" overflowToDisk="false" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="1" memoryStoreEvictionPolicy="LRU"/> </ehcache>
  • 52. - 52 - 1. 개발가이드 Logback 사용 – maven / nexus  log 파일 생성 성능개선 <properties> <logback.version>1.1.2</logback.version> <slf4j.version>1.7.7</slf4j.version> </properties> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> <scope>runtime</scope> </dependency> <properties> <logback.version>1.1.2</logback.version> <slf4j.version>1.7.7</slf4j.version> </properties> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> <dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> <dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>${slf4j.version}</version> <dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> <dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> <dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>${slf4j.version}</version> <dependency>
  • 53. - 53 - 1. 개발가이드 Logback 사용 – Java 코딩  log 파일 생성 성능개선 final static Logger logger = LoggerFactory.getLogger(ClinicServiceImpl.class); logger.debug(”DEBUG::ClinicServiceImpl::@Cacheable::vets::"); logger.error(”ERROR ::ClinicServiceImpl::@Cacheable::vets::"); final static Logger logger = LoggerFactory.getLogger(ClinicServiceImpl.class); logger.debug(”DEBUG::ClinicServiceImpl::@Cacheable::vets::"); logger.error(”ERROR ::ClinicServiceImpl::@Cacheable::vets::");
  • 54. - 54 - 1. 개발가이드 <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <appender name=“FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <prudent>true</prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/Users/jimanryu/Project/logs/logFile.%d{yyyy-MM-dd-HH}.log</fileNamePattern> <maxHistory>72</maxHistory> </rollingPolicy> <encoder > <pattern>%d{yyyyMMdd HH:mm:ss,SSS}|%-5p|%36X{guid}|%-14X{logCode}|%-40F|%-5L|%m%n</pattern> </encoder> </appender> <logger name="org.springframework.samples.petclinic" additivity="false"> <level value="DEBUG"/> <appender-ref ref="FILE"/> </logger> <root level="OFF"> <appender-ref ref="CONSOLE"/> </root> </configuration> <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <appender name=“FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <prudent>true</prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/Users/jimanryu/Project/logs/logFile.%d{yyyy-MM-dd-HH}.log</fileNamePattern> <maxHistory>72</maxHistory> </rollingPolicy> <encoder > <pattern>%d{yyyyMMdd HH:mm:ss,SSS}|%-5p|%36X{guid}|%-14X{logCode}|%-40F|%-5L|%m%n</pattern> </encoder> </appender> <logger name="org.springframework.samples.petclinic" additivity="false"> <level value="DEBUG"/> <appender-ref ref="FILE"/> </logger> <root level="OFF"> <appender-ref ref="CONSOLE"/> </root> </configuration> Logback 사용 - file  log 파일 생성 성능개선
  • 55. - 55 - 1. 개발가이드 <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <appender name=“FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <prudent>true</prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/Users/jimanryu/Project/logs/logFile.%d{yyyy-MM-dd-HH}.log</fileNamePattern> <maxHistory>72</maxHistory> </rollingPolicy> <encoder > <pattern>%d{yyyyMMdd HH:mm:ss,SSS}|%-5p|%36X{guid}|%-14X{logCode}|%-40F|%-5L|%m%n</pattern> </encoder> </appender> <logger name="org.springframework.samples.petclinic" additivity="false"> <level value="DEBUG"/> <appender-ref ref="FILE"/> </logger> <root level="OFF"> <appender-ref ref="CONSOLE"/> </root> </configuration> <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <appender name=“FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <prudent>true</prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/Users/jimanryu/Project/logs/logFile.%d{yyyy-MM-dd-HH}.log</fileNamePattern> <maxHistory>72</maxHistory> </rollingPolicy> <encoder > <pattern>%d{yyyyMMdd HH:mm:ss,SSS}|%-5p|%36X{guid}|%-14X{logCode}|%-40F|%-5L|%m%n</pattern> </encoder> </appender> <logger name="org.springframework.samples.petclinic" additivity="false"> <level value="DEBUG"/> <appender-ref ref="FILE"/> </logger> <root level="OFF"> <appender-ref ref="CONSOLE"/> </root> </configuration> Logback 사용 - file  log 파일 생성 성능개선
  • 56. - 56 - 1. 개발가이드 <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <jmxConfigurator/> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyyMMdd HH:mm:ss,SSS}|%-5p|%3X{guid}|%-14X{logCode}|%-40F|%-5L|%m%n</pattern> </layout> </appender> <logger name="org.springframework.samples.petclinic" level="debug"/> <logger name="org.springframework.web.servlet.view" level="debug"/> <logger name="org.springframework.jdbc" level="debug"/> <root level="OFF"> <appender-ref ref="CONSOLE"/> </root> </configuration> <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <jmxConfigurator/> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyyMMdd HH:mm:ss,SSS}|%-5p|%3X{guid}|%-14X{logCode}|%-40F|%-5L|%m%n</pattern> </layout> </appender> <logger name="org.springframework.samples.petclinic" level="debug"/> <logger name="org.springframework.web.servlet.view" level="debug"/> <logger name="org.springframework.jdbc" level="debug"/> <root level="OFF"> <appender-ref ref="CONSOLE"/> </root> </configuration> Logback 사용 - console  log 파일 생성 성능개선
  • 57. - 57 - 1. 개발가이드 JSESSIONID  SessionID 체크 <%@page import="java.util.*"%> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> <% HttpSession sess = request.getSession(); boolean isNew = session.isNew(); String sessionId = session.getId(); long creationTime = session.getCreationTime(); long lastAccessedTime = session.getLastAccessedTime(); int maxInactiveInterval = session.getMaxInactiveInterval(); String APP_NAME = System.getProperty("APP_NAME"); %> APP_NAME : [<%=APP_NAME%>]<br> Session ID : [<%=sessionId%>]<br> isNew : [<%=isNew%>]<br> Creation Time : <%=new Date(creationTime)%><br> Last Accessed Time : <%=new Date(lastAccessedTime)%><br> Max Inactive Interval : <%=maxInactiveInterval%> second<br> <%@page import="java.util.*"%> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> <% HttpSession sess = request.getSession(); boolean isNew = session.isNew(); String sessionId = session.getId(); long creationTime = session.getCreationTime(); long lastAccessedTime = session.getLastAccessedTime(); int maxInactiveInterval = session.getMaxInactiveInterval(); String APP_NAME = System.getProperty("APP_NAME"); %> APP_NAME : [<%=APP_NAME%>]<br> Session ID : [<%=sessionId%>]<br> isNew : [<%=isNew%>]<br> Creation Time : <%=new Date(creationTime)%><br> Last Accessed Time : <%=new Date(lastAccessedTime)%><br> Max Inactive Interval : <%=maxInactiveInterval%> second<br> -DAPP_NAME=Hostname_instanceName-DAPP_NAME=Hostname_instanceName
  • 58. - 58 - 1. 개발가이드 1) JVM_ARGS="-Xms2048m -Xmx6144m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:+UseG1GC" Minor GC 의 처리 시간이 빠르다 (50ms 내외 ). Minor GC 주기가 빈번하지 않다 (10 초 내외 ). Full GC 의 처리 시간이 빠르다 ( 보통 1 초 이내 ). Full GC 주기가 빈번하지 않다 (10 분에 1 회 ). 2) 테스시나리오 Case1 : -XX:+UseParallelGC -Xms1536m -Xmx1536m -XX:NewRatio=2 Case2 : -XX:+UseParallelGC -Xms1536m -Xmx1536m -XX:NewRatio=3 Case3 : -XX:+UseParallelGC -Xms1g -Xmx1g -XX:NewRatio=3 Case4 : -XX:+UseParallelOldGC -Xms1536m -Xmx1536m -XX:NewRatio=2 Case5 : -XX:+UseParallelOldGC -Xms1536m -Xmx1536m -XX:NewRatio=3 Case6 : -XX:+UseParallelOldGC -Xms1g -Xmx1g -XX:NewRatio=3 1) JVM_ARGS="-Xms2048m -Xmx6144m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:+UseG1GC" Minor GC 의 처리 시간이 빠르다 (50ms 내외 ). Minor GC 주기가 빈번하지 않다 (10 초 내외 ). Full GC 의 처리 시간이 빠르다 ( 보통 1 초 이내 ). Full GC 주기가 빈번하지 않다 (10 분에 1 회 ). 2) 테스시나리오 Case1 : -XX:+UseParallelGC -Xms1536m -Xmx1536m -XX:NewRatio=2 Case2 : -XX:+UseParallelGC -Xms1536m -Xmx1536m -XX:NewRatio=3 Case3 : -XX:+UseParallelGC -Xms1g -Xmx1g -XX:NewRatio=3 Case4 : -XX:+UseParallelOldGC -Xms1536m -Xmx1536m -XX:NewRatio=2 Case5 : -XX:+UseParallelOldGC -Xms1536m -Xmx1536m -XX:NewRatio=3 Case6 : -XX:+UseParallelOldGC -Xms1g -Xmx1g -XX:NewRatio=3 JVM 테스트 시나리오  JVM 튜닝
  • 59. - 59 - 1. 개발가이드 Maven 사용 가이드  JVM 튜닝 [INFO] Reactor Summary: [INFO] [INFO] Flamingo Project ................................... SUCCESS [ 1.433 s] [INFO] Flamingo Core ...................................... SUCCESS [ 10.327 s] [INFO] Flamingo Utility ................................... SUCCESS [ 2.410 s] [INFO] Flamingo Model ..................................... SUCCESS [ 7.282 s] [INFO] Flamingo Expression Language Service ............... SUCCESS [ 3.635 s] [INFO] Flamingo Interface ................................. SUCCESS [ 1.103 s] [INFO] Flamingo Hadoop 2 Test ............................. SUCCESS [ 6.713 s] [INFO] Flamingo Locale .................................... SUCCESS [ 1.517 s] [INFO] Flamingo FileSystem ................................ SUCCESS [ 2.339 s] [INFO] Flamingo Log Collector ............................. SUCCESS [ 2.038 s] [INFO] Flamingo MapReduce ................................. SUCCESS [ 24.045 s] [INFO] Flamingo MapReduce for Hadoop 2 .................... SUCCESS [ 11.503 s] [INFO] Flamingo Expression Language Service Hadoop2 ....... SUCCESS [ 1.391 s] [INFO] Flamingo Interface Hadoop2 ......................... SUCCESS [ 1.035 s] [INFO] Flamingo FileSystem Hadoop2 ........................ SUCCESS [ 1.989 s] [INFO] Flamingo Workflow Engine ........................... SUCCESS [ 29.871 s] [INFO] Flamingo Web Services .............................. SUCCESS [07:05 min] [INFO] Flamingo Remote Commander .......................... SUCCESS [ 4.978 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 08:59 min [INFO] Finished at: 2014-07-02T12:46:26+09:00 [INFO] Final Memory: 66M/1205M [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] Flamingo Project ................................... SUCCESS [ 1.433 s] [INFO] Flamingo Core ...................................... SUCCESS [ 10.327 s] [INFO] Flamingo Utility ................................... SUCCESS [ 2.410 s] [INFO] Flamingo Model ..................................... SUCCESS [ 7.282 s] [INFO] Flamingo Expression Language Service ............... SUCCESS [ 3.635 s] [INFO] Flamingo Interface ................................. SUCCESS [ 1.103 s] [INFO] Flamingo Hadoop 2 Test ............................. SUCCESS [ 6.713 s] [INFO] Flamingo Locale .................................... SUCCESS [ 1.517 s] [INFO] Flamingo FileSystem ................................ SUCCESS [ 2.339 s] [INFO] Flamingo Log Collector ............................. SUCCESS [ 2.038 s] [INFO] Flamingo MapReduce ................................. SUCCESS [ 24.045 s] [INFO] Flamingo MapReduce for Hadoop 2 .................... SUCCESS [ 11.503 s] [INFO] Flamingo Expression Language Service Hadoop2 ....... SUCCESS [ 1.391 s] [INFO] Flamingo Interface Hadoop2 ......................... SUCCESS [ 1.035 s] [INFO] Flamingo FileSystem Hadoop2 ........................ SUCCESS [ 1.989 s] [INFO] Flamingo Workflow Engine ........................... SUCCESS [ 29.871 s] [INFO] Flamingo Web Services .............................. SUCCESS [07:05 min] [INFO] Flamingo Remote Commander .......................... SUCCESS [ 4.978 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 08:59 min [INFO] Finished at: 2014-07-02T12:46:26+09:00 [INFO] Final Memory: 66M/1205M [INFO] ------------------------------------------------------------------------ mvn clean package installmvn clean package install
  • 60. - 60 -  자동화도구 형상관리 서버 (Subversion) 형상관리 서버 (Subversion) 2 NEXUS 서버NEXUS 서버1 MANTIS 서버 ( 이슈관리 ) MANTIS 서버 ( 이슈관리 ) 5 ODEN 서버 ( 배포관리 ) ODEN 서버 ( 배포관리 ) 4 REDMINE 서버 ( 위키 , 진척 ) REDMINE 서버 ( 위키 , 진척 ) 6 개발자 WEB 서버WEB 서버7 WAS 서버WAS 서버8 nGrinder 서버 ( 성능테스트 ) nGrinder 서버 ( 성능테스트 ) 9 HUDSON 서버 (CI 통합빌드 ) HUDSON 서버 (CI 통합빌드 ) 3 4. 개발가이드
  • 61. - 61 - 1. 개발가이드 Hudson 사용 가이드  CI 도구 ( Hudson ) nohup nice java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -DHUDSON_HOME=/Users/jimanryu/hudson/data -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -jar hudson-3.1.2.war --httpPort=9090 > ./hudson.log 2>&1 nohup nice java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -DHUDSON_HOME=/Users/jimanryu/hudson/data -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -jar hudson-3.1.2.war --httpPort=9090 > ./hudson.log 2>&1
  • 62. - 62 -  성능테스트툴 4. 개발가이드

×