라이프로그


성인오락황금성

성인오락황금성 성인오락황금성━━◆ASD63.COM◆클릭♨최고500만연타◀──성인오락황금성 성인오락황금성또 선택진료비·상급병실료를 포함한 전체 진료비 가운데 건강보험공단이 부담하는 비율, 이른바 건보 보장률을 성인오락황금성따지자면 현재 76% 수준인 4대 중증 질환의 보장률은성인오락황금성 2016년 이후 82~83%로 6~7%포인트(p) 정도 높아진다고 복지부는 설명했다.

정부는 이 같은 4대 중증성인오락황금성 질환 보장 확대에 5년 성인오락황금성동안(2013~2017년) 모두 8조9천900억원의 재정을 투입할 계획이다. 재원은 지난해 말 4조6천억원 정도 쌓여성인오락황금성 있는 성인오락황금성건강보험 누적적립금과 보험 재정의 효율적 관리를 통해 마련한다.

남아있는 비급여 항목에성인오락황금성 대해서는 영수증 서식을 성인오락황금성바꿔 보다 자세히 진료비 명세를 밝히고, 비급여 서비스 시행 전 환자 동의 절차를 강화하는 등 환자의 성인오락황금성선택권을 강화하는성인오락황금성 방향으로 제도를 보완할 방침이다.

진영 복지부 장관은 "4대 성인오락황금성중증질환 보장성 강화로 국민 부담이 성인오락황금성크게 줄 것"이라며 "건보 재정을 고려해 우선 4대 중증 질환부터 보장을 확대하고, 앞으로 세부 이행 계획을 마련해 차례대로 다른성인오락황금성 질환에 대해서도 보장 범위를 넓히겠다"고 밝혔다.

헌재는 "친일반민족행위의 진상을 규명해 역사의 진실과 민족 정통성을 확인하고 성인오락황금성사회정의를 구현하려는 특별법의 입법목적은 공공복리를 위한 것으로 목적의 정당성이 인정된다"고 설명했다.

헌재는 "특별법은 친일반민족행위 결정이 있더라도 조사보고서 및 사료를 공개하는 성인오락황금성것 외에 조사 대상자나 유족에 어떠한 불이익도 규정하고 있지 않다"면서 "이는 기본권 침해의 최소화 요건에도 부합한다"고 적시했다.
서울신문]27일 한·중 정상회담에서 양국 정상이 채택한 한·중 미래비전 공동성명은 성인오락황금성박근혜 정부 5년을 넘어 중장기적인 양국 공동번영을 위한 청사진이라는 데 의미가 있다. 수사적 선언에 그쳤던 과거 정상회담과 달리 성인오락황금성처음으로 실천을 위한 성인오락황금성액션플랜(이행계획)이 담긴 부속서를 채택한 것도 같은 의미다. 특히 양국관계의 업그레이드를 위해 청와대 성인오락황금성국가안보실장과 중국 국무위원급의 대화 채널을 신설하는 등 고위급 안보 대화 정례화에도 합의했다.
대화재개 성인오락황금성쉽지 않아…개성공단 사태 장기화가 '변수'


성인오락황금성

성인오락황금성 성인오락황금성━━◆ASD63.COM◆클릭♨최고500만연타◀──성인오락황금성 성인오락황금성이밖에 뇌혈관 혈전 제거 시술에 성인오락황금성사용되는 풍선 카테터 등 치료재료, 뇌종양의 정확한 위치를 탐지하는 기술, 비(非)소세포폐암 진단을 위한 EGFR유전자 돌연변이 성인오락황금성검사, 수술 후 장기 유착을 막는 방지제(필름) 등도 2015~2016년에 걸쳐 건보 급여 항목에 포함될 전망이다.

급여 항목으로 편입된 성인오락황금성필수 의료서비스는 환자는 진료비 가운데 5~10%의 법정본인부담금만 내면 된다.

또 정부는 '급여-비급여' 형태의 기존 건보 급여 분류체계에 '선별급여'를 추가, 필수는 아니지만, 더 쉽게 진료하거나 받는 성인오락황금성데 필요한 의료서비스들을 새로 건강보험 제도 안으로 끌어들여 관리할 방침이다.

예를 들어 카메라 내장형 캡슐 내시경(비용 100만~200만원),성인오락황금성 초음파로 절단·지혈하는 절삭기(40만~125만원),성인오락황금성 유방 재건술(150만~750만원) 등은 현재 비급여 항목으로 각 의료기관이 멋대로 성인오락황금성가격을 책정하고 환자가 전액 부담해야 한다. 하지만, 선택급여 항목으로 지정되면 각 시술의 가격이 공식적으로 정해지게 된다. 성인오락황금성다만, 이 선별급여 항목은 필수 처치가 아닌 만큼, 본인 부담률이 50~80%(건보급여 20~50%)로 비교적 성인오락황금성높고 본인부담금 성인오락황금성상한제 대상에서도 빠진다.

복지부는 작년말 현재 1조8천100억원(건보 법정본인부담성인오락황금성 성인오락황금성6천100억+비급여 1조2천억) 정도인 4대 중증질환자 부담 의료비(선택진료비·상급병실료 제외)가 보장 확대의 결과로 2016년 이후에는 성인오락황금성1조400억원(법정본인부담 9천600억+비급여 800억원)까지 줄어들 것으로 추산했다.

이는 현재 성인오락황금성1조2천억원인 비급여 가운데 6천900억원 규모의 필수 의료서비스는 건보 급여 성인오락황금성항목(본인부담률 평균 7%)으로, 성인오락황금성4천300억원 정도인 비(非)필수 서비스는 선별급여 항목(본인부담률 평균 70%)으로 전환돼 2016년 이후 상당 성인오락황금성부분 건보가 성인오락황금성진료비를 책임지기 때문이다.

이런 결과를성인오락황금성 현재 159만명인 4대 중증질환자 수로 나눠 비교하면, 환자 1인당 의료비 부담은 평균 성인오락황금성114만원에서 65만원으로 43% 감소하는 셈이다.

 


테스트라우 제목을 수정했지....트랙벡 받아라....

웃기셔..참말로.....   호ㅓ허호ㅓ호ㅓ호ㅓㅎ

ddd


seam


Log4J 로깅 비용 계산...... OpenSource

기존의 System.out.println() 으로 로깅 할 때 발생하는 문제의 대안으로 Log4J를 요즘 많이 사용한다.

Log4J를 사용하면 OutputStream시 발생하는 자원독점 문제 해결, logging 레벨 설정을 코드와 분리, 로깅 output target 설정 변경 등 다양한 잇점을 얻을 수 있다.

그러나 Log4J가 실행될 때 발행하는 비용을 계산해 보면 Log4J를 사용할 때 주의가 필요하다.
무작정 사용하는 것은 WAS 전체에 심각한 문제를 발생 시킬 수 있다.

모 사이트에서 JVM의 GC가 자주 발생하는 문제가 발생하여 시스템 전체에 심각한 문제가 발생한 사례가 있었다. 물론 Log4J가 문제의 핵심은 아니었지만 어느 정도 영향은 미쳤다고 생각된다.

지금 다룰 내용은 "Log4J The Complete Manual" 23 페이지에 나온 내용을 참조하였다.
이 내용을 메뉴얼을 읽을 때는 심각하게 받아 들이지 않았지만 실제 사례를 접하니 간과할 수만은 없는 문제인 듯 싶다.

문제 코드 분석
문제가 발생한 사이트는 Struts를 기반으로 하는 프레임웍 구조를 갖고 있었다.
Session 정보를 추출하기 위하여 다음과 같은 코드가 공통 코드 레벨에서 수행되고 있었다.

while ( i.hasNext()  ) {                                                                                  
Map.Entry e = (Map.Entry) i.next();                                                               
logger.debug("TABLE KEY : " + e.getKey() );                                                  
logger.debug("SESSION ID : " + ((HttpSession) e.getValue()).getId());                
}
                                                                                                                 


특정 상황에서 이 코드는 246번의 반복을 수행하였고, 두 개의 debug()이 실행하면서 각각 8메가의 임시 객체를 생성하였다. 해당 while문이 수행되면서 16메가의 임시 객체를 생성하였다.

물론 문제의 while문이 구동할 때 Log4J는 DEBUG 모드로 운영중인 상태였다.

이 코드로 발생하는 문제는 Log4J를 DEBUG 모드로 운영 중이기 때문에 발생한 것이고 WARNING이나 ERROR 모드로 운영하면 문제가 발생하지 않는다고 생각할 수도 있다. 그러나 Log4J가 실행되는 비용을 계산해 보면 이러한 문제는 Log4J의 운영 모드를 변경해도 동일하게 발생한다는 것을 알수 있다.(물론 일정 부분 감소는 할 것이다.)

1. Log4J 로깅 메소드 비용 계산
예제 코드
logger.debug("Entry number: "+i+" is "+String.valueOf(entry[i]));

예제 코드와 같은 코드가 있다고 할 때 다음과 같은 순서로 실행된다.


  1. logging 문자열 생성

    1. String 문자열 1개 생성: "Entry number: "

    2. String 문자열 1개 생성 총 2개: "Entry number: " + i

    3. String 문자열 1개 신규 생성, + 결합 1개 생성, 총 4개: 신규 생성: " is ", 결합 문자열: "Entry number: " + +i+" is "

    4. String 문자열 1개 신규 생성, + 결합 1개 생성, 총 6개: 신규생성: String.valueOf(entry[i]), 결합문자열: "Entry number: "+i+" is "+String.valueOf(entry[i])


  2. logger의 logging 레벨 체크

    1. 현재 등록된 로거의 로깅 레벨을 체크

    2. 현재 logger의 로깅 레벨이 DEBUG이면 다음단계 진행

    3. 현재 logger의 로깅 레벨이 INFO 이상이면 정지


  3. logger의 appender에 등록된 output에 출력

    1. layout 적용

    2. 출력




위와 같은 순서로 실행된다.

2. Log4j 운영 모드에 따른 비용 계산


  • Debug 모드일 때


    1. 1번 로깅 문자열 생성 = 6개의 스트링 객체 생성, 1개만 사용, 5개의 스트링 객체는 GC 대상

    2. 2번 logger의 레벨 체크 실행

    3. 3번 로깅 실행 - layout 적용 후 output에 로깅 적용


  • non-Debug 모드일 때


    1. 1번 로깅 문자열 생성 = 6개의 스트링 객체 생성, 1개만 사용, 5개의 스트링 객체는 GC 대상

    2. 2번 logger의 레벨 체크 실행

    3. 3번 실행 없이 종료




로그의 모드에 따라서 Log4J에서 생략되는 부분은 3번에 국한된다. 즉 로깅 문자열 생성이나 로그 레벨 체크의 비용은 발생한다. 여기서 로그레벨 체크는 전체 로깅 비용의 1%이하이고 극히 적은 비용을 발생하기 때문에 2번은 큰 문제가 되지 않을 수 있다. 그러나 1번의 발생 비용은 경우에 따라서 매우 심각해 질 수도 있다.

1번의 로깅 문자열은 스트링을 "+"하는 방식이기 때문에
수백번의 loop안에서 발생하거나 로깅 로직이 빈번하게 발생하는 조건에서는 temporary object를 양산하는 로직이 될 가능성이 크다.

위의 Log4j 운영 모드에 따른 실행 순서에서 알수 있듯이 이것은 로깅 모드를 변경한다고 해서 발생하지 않는 부분은 아니다.

3. 문제 해결 코드

if(logger.isDebugEnabled() {                                                                                      
logger.debug("Entry number: "+i+" is "+String.valueOf(entry[i]));                              
}
                                                                                                                             
 

위와 같은 코드의 사용이 바람직 하다. 이러한 코드는 Log4J의 예제에서 나오는 isDebugEnabled() 메소드를 이용하는 방법이다. 실제 프로젝트에서 보변 isDebugEnabled 메소드의 사용을 간과 하는 경우가 많다.

이 코드를 사용하면 로깅 문자열을 생성하기 전에 로깅 레벨을 체크하는 isDebugEnabled 메소드를 실행하여 로깅을 실행할 것인가를 미리 체크하게 된다. 기본적인 코드이지만 이러한 코드를 사용하는 것은 매우 중요하다.


4. 문제 해결 코드의 side-effect

이 코드는 DEBUG 모드일대 부가적인 문제를 발생 시킨다.
if(logger.isDebugEnabled() {                                                                                      
logger.debug("Entry number: "+i+" is "+String.valueOf(entry[i]));                              
}
                                                                                                                            


이 코드는 DEBUG 모드일 때 LOGGER의 실행 레벨 체크를 두번한다는 단점을 갖는다.

isDubugEnabled 메소드에서 한번 체크하고 debug 메소드에서 다시 체크한다. debug 모드에서 로깅 레벨 체크후 degub 상태이면 로깅을 한다.

이러한 실행 과정은 단일 로깅일 때는 문제가 되지 않지만(로깅 전체에서 체크의 실행 비용은 1% 이하이다.) debug 메소드가 loop 문 안에 있거나, 하나의 메소드에서 debug 메소드가 여러번 호출될 때는 문제가 될수 있다. 1%이하라도 반복적으로 실행된다면 문제가 될 것이다.


public void foo(Object[] a) {
for(int i = 0; i < a.length; i++) {
if(logger.isDebugEnabled()){
   logger.debug("Original value of entry number: "+i+" is "+a[i]);
}
a[i] = someTransformation(a[i]);
if(logger.isDebugEnabled()){
   logger.debug("After transformation the value is "+a[i]);
}
}


위 와 같은 메소드가 있을 경우에는 반복문속에서 두번의 debug 메소드가 실행된다.
Debug 모드 운영 중이라고 가정할 때
반복문 속에서
1. 로그레벨 체크
2. 로그레벨 체크 후 로깅
3. 로그레벨 체크
4. 로그레벨 체크 후 로깅

의 순서로 실행된다. 반복문 자체도 문제지만 반복적인 로깅 체크 역시 문제이다. 이러한 코드는 다음과 같이 변경하는 것이 바람직하다.


public void foo(Object[] a) {
boolean isLogging = logger.isDebugEnabled();
for(int i = 0; i < a.length; i++) {
if(isLogging ){
   logger.debug("Original value of entry number: "+i+" is "+a[i]);
}
a[i] = someTransformation(a[i]);
if(isLogging ){
   logger.debug("After transformation the value is "+a[i]);
}
}

} 



작은 결론 debug 메소드 사용시 주의 사항

지금은 debug 메소드에 대해서 알아 보았다. debug 메소드를 사용할 경우 다음과 같은 두가지 사항에 주의해야 할 것이다.

1. isDebugEnabled 메소드를 사용하여 사전에 로그레벨 체크: 불필요한 로깅 문자열 생성 비용 절감
2. 반복문에서는 isDebugEnabled 메소드를 반복문 외부에서 실행하여 결과 저장 및 반복문 안에서 재사용: 불필요한 로깅 레벨 중복 체크의 비용 절감

또다른 숙제...
Log4J를 사용함으로써 예전에 로깅 문제의 만은 부분은 해결되고 있지만 Log4J에 대한 올바른 사용에 주의를 기울일 필요가 있다. 지금은 debug 메소드만을 다루었지만 debug 외의 info(), warning(), error(), fatal() 메소드 역시 동일한 문제를 내포하고 있다.

이러한 고민에 앞서 로깅 관련 코드를 작성할 때 로깅 문자열 생성에 대한 각별한 주의가 필요한 것 같다.

무심코 작성한 코드 한줄이 폭탄이 될수도 있다.....^^

Flex 관련 책을 쓰시다니..

플렉스 관련 책을 준비하신다니 다단하셔요..

6월 출간 예정이면 항창 바쁘시겠내요.....

기대 만땅 입니다. ^^ 개발 효율성, 테스팅등의 기법을 많이 다렸으면 하면 조그만

바램입니다.

IBatis의 선택 ==> Abator가 약이 될까? 독이될까?

a·ba·tor [”b*it”R]
n. 『法』 토지[유산] 불법 점유자; (불법 방해의) 제거자.
IBatis가 모험을 하기 시작했다. abator를 공개했다. 물론 아직까지는 지대로 동작하는 것이 하나도 없지만 기대되는 물건이다. 왜 abator ... 의미가 좀 삐리한 걸 사용했는지는 모르겠다. 방해물을 제거하는 놈을 구상한다는 의미일까?
IBatis의 천적이 xml 이기는 하지만 IBatis의 성격상 Model 클래스와 sql map xml을 만드는 것이 만만한 작업을 아닐것인데......
 
왠지 기대가 된다.

Java Studio Creator/Java Studio Enterprise 8 == Free Edition

일본 자바원에서 썬이 또하나의 소프트웨어를 풀었습니다.

지난 미국 자바원에서 WAS를 GlassFish라는 이름으로 오픈소스화 한 이후 이번엔 개발툴을 Free로 풀었습니다.

썬은 SDN 회원에게 Java Studio Creator와 Java Studion Enterprise(JSE)를 Free로 배포하고 있습니다. 기존에 creator는 99불 JSE는 1,895불에 판매되고 있었습니다. (물론 국내에서 JSE와 Creator를 돈주고 구입한 업체는 없을것이라 생각되지만....)

Creator와 JSE는 넷빈즈를 기반으로 만들어 있습니다. Creator는 JSF에 특화되어 있고 JSE는 J2EE 전체 스펙을 지원하는 다양한 플러그인을 기본 장착하고 있습니다. 또한 넷빈즈의 프로파일링 지원이 좋습니다.

이클립스에 비해 저변이 많이 적기는 하지만 NetBeans의 성능이 엄청나게 발전한 상태이고 이것을 기반으로한 툴들이 Free로 풀렸다는 것은 반가운 소식입니다.

다운로드: 요기

SDN에 가입해야 하는 불편함은 있지만 뭐....꽁짜라는데...^^

나두 써먹어 봐야징 okcode 일상

==================================================
[김태완] 님의 말:
ㅋㅋㅋ 잘 지내시죠?
[광남](4457)eclipse에 빠아~져봅시다~ 님의 말:

[광남](4457)eclipse에 빠아~져봅시다~ 님의 말:
행복해.
==================================================
행복해......정말 오랜만에 들어보는 말이다......

나두 저런말 쓰고 싶어지네...^^

1 2 3 4 5


fgrt

rtt