원문 : http://bbangjem2.tistory.com/112


스프링 프레임 워크를 사용했고 데이터 가지고 와서 보내 줄때 다음과 같이 설정도 했고 다른데이터도 제대로 받고

1
2
3
response.setHeader("Content-Type", "application/xml");
response.setContentType("text/xml;charset=UTF-8");
response.setCharacterEncoding("utf-8");
java 파일도 jsp 파일도 js 파일에서도 전부 utf - 8 로 설정 했는데...... 한글만 유독 ???? 로 깨져서 나왔음 톰캣 설정에 URIEncoding ="utf-8" 도 붙여 봤고 그래도 안되서 계속 검색 검색 web.xml 에서 필터 부분이 기존
1
2
3
4
5
6
7
8
9
10
11
12
13
<filter>
     <filter-name>encodingFilter</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
         <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>
여기서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<filter>
     <filter-name>encodingFilter</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
      <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
</filter>
   
<filter-mapping>
     <filter-name>encodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>
이렇게 변경 했더니 해결 ~~~ 추가한 부분은
1
2
3
4
<init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
</init-param>
이부분 입니다.



어느 작은 마을에 빵집이 있었습니다.
착한 마음을 가진 빵집 주인은 마을에 사는 가난한 아이들에게
매일 맛있는 빵을 만들어 나누어 주었습니다.
아침에 만든 빵을 바구니에 담아 문을 열어두고
한 덩어리씩 가져가게 하는 것입니다.

그때마다 아이들이 몰려와 큰 빵을 먼저 집어가려고 경쟁을 했습니다.
그런데 아이 중 한 아이는 언제나 끝까지 기다렸다가 
마지막 남은 가장 작은 빵을 가져가며 '아저씨 고맙습니다!'라는
인사를 잊지 않는 것입니다.

이날도 어김없이 아이는 마지막 빵을 들고 집으로 향했습니다.
그리고 어머니와 나눠 먹기 위해 빵을 쪼갰습니다.

그런데 놀랍게도 빵 안에 예쁜 금반지가 들어있는 것입니다.
아이와 엄마는 실수로 주인아저씨가 잃어버린 것으로 생각했습니다.
아이는 다시 빵집으로 향했습니다.

"아저씨! 빵 속에 이 반지가 들어 있었어요!"
라며 반지를 돌려드렸습니다.

그러자 빵집 주인은 입가에 웃음을 띠며
"그 반지는 이제 내 것이 아니고 네 것이란다.
제일 작은 빵 속에 넣어두고 선물로 주려고 했는데
이번에도 제일 작은 빵은 네 몫이었으니 이 반지도 네 것이란다."


마음이 따뜻한 사람,
행복의 가치를 아는 사람,
진정한 비움의 행복을 아는 사람은
나누기를 원합니다.

그래서 나로 인해 
이웃에 즐거움을 더하고
사회에 행복을 더하고
아이들에게 따뜻함이 더해지는 세상을 꿈꿉니다.

5월, 많이 나누고 많이 사랑하세요!


24살 청년은 자신이 살 날이 얼마 남지 않았다는 것을 알았다. 그는 죽음을 앞두고 느낀 바를 모두와 나누고 싶은 마음에 레딧(Reddit)이라는 소셜뉴스웹사이트에 공개 편지를 올렸다


"저는 곧 세상을 떠납니다. 그래도 누군가 이걸 읽어주면 기쁠 것 같아요. 


저는 고작 24살이지만 인생의 마지막 넥타이를 준비해뒀어요. 몇 달 뒤 제 장례식에서 맬 넥타이죠. 양복과 좀 어울리지 않지만, 그 상황에 가장 어울리는 타이라고 생각해요. 


암 진단을 받은 건 이미 너무 늦은 때였어요. 치료하면 오래 살 수 있다는 희망조차 가질 수 없었죠. 죽음을 맞이하면서 가장 중요한 건, 제가 존재함으로써 이 세상이 좀 더 나은 곳이 됐다는 확신이라는 걸 깨달았어요. 이제까지 제가 살아온 인생을 돌이켜보면 저의 존재가, 좀 더 정확히 말하자면 그 존재의 상실이 큰 일은 아니예요. 별로 세상에 도움이 될 일을 하지 못했거든요. 


전에는 생각이 너무 많았어요. 하지만 시간이 얼마 남지 않았다는 것을 알게 되니까 뭐가 더 중요한 지가 명확해졌어요. 그래서, 실은 이기적인 이유로 이 글을 씁니다.  제가 깨달은 것을 여러분과 공유함으로써 제 삶의 의미를 찾고 싶어서요. 


1. 좋아하지 않는 일에 시간을 낭비하지 마세요. 안 좋아하는 일로는 절대 성공할 수 없어요. 정말 그 일을 사랑해야만 인내와 열정을 쏟아붓고 헌신할 수 있으니까요.

2. 남의 시선을 두려워하는 것만큼 멍청한 일은 없어요. 두려움은 당신을 무력하게 만들어요. 남들의 눈치를 보고 한 번 굽힌다면 상황이 계속 악화돼 당신에게는 빈 껍데기만 남을 거예요. 내면의 소리를 따르세요. 누군가는 미쳤다고 할 수도 있지만, 당신을 전설로 생각하는 사람도 분명히 있을 거니까요.

3. 인생의 주도권을 잡으세요. 인생에 일어나는 모든 일에 전적으로 책임질 수 있도록. 나쁜 습관을 없애고, 건강한 삶의 습관을 기르세요. 즐겁게 할 수 있는 운동도 찾으면서요. 무엇보다도 미루지 마세요. 남이 아닌 당신 스스로 내린 결정이 인생을 좌우하게 하세요.

4. 주위 사람들에게 감사하세요. 친구들과 가족은 무한한 에너지의 근원이자 사랑이니까요. 어떤 것도 당연하게 여기지 마세요.


이 단순한 깨달음이 얼마나 중요한지 말로 다 표현할 수가 없네요. 그래도 전 이제 시간의 가치를 뼈저리게 깨달았고, 여러분이 제 말에 귀 기울여주면 좋겠어요. 인생의 마지막에 의미있는 일을 할 수 있어서 다행이예요. 인공지능의 발전이나 엘론 머스크( Elon Musk, 테슬라모터스 CEO)의 멋진 프로젝트를 볼 수 없다는 건 좀 유감스럽네요. 그리고 시리아와 우크라이나 전쟁이 빨리 끝나기를 기도합니다. 


우리는 죽을 때까지 건강과 균형 잡힌 육체를 유지하는데 신경을 쓰지만, 우리 몸이 포장에 불과하다는 걸 깨닫지 못해요. 우리의 인성, 생각, 신념, 의도를 세상에 배달하기 위한 상자요. 이 상자에 세상을 바꿀 만한 알맹이가 들어있지 않다면, 상자가 사라져도 큰 문제는 아니예요. 우리 모두에게 가능성이 있지만, 그것을 실현하려면 엄청난 용기가 필요해요.


당신은 그저 주어진 상황대로 흘러가면서 하루 하루, 또는 매 시간을 잃어버릴 수도 있어요. 혹은 당신의 신념을 위해 싸우고 멋진 이야기를 써 나갈 수도 있겠죠. 현명한 선택을 하시길 바랄게요.


이 세상에 흔적을 남겨주세요. 의미있는 인생을 사세요. 당신 방식대로요. 일단 저질러 봐요. 종국에는 우리 모두가 떠나게 될 이 장소는 뭐든지 가능한 아름다운 놀이터예요. 어쨌든 영원히 머무를 수는 없죠. 지구는 미지의 우주와 끝없는 어둠을 향해 엄청난 속도로 달려가고 있고, 우리의 삶은 찰나의 불꽃일 뿐이잖아요.그러니 열정을 갖고 인생을 즐기세요. 재미있고, 의미있게요! 


고맙습니다!"


이 젊은 청년은 정말 중요한 메시지를 전달하려 했다. 그가 세상을 떠나도 마지막 당부의 말은 오래 기억될 것이다. 

'향기나는글' 카테고리의 다른 글

성공을 가르는 다섯가지  (0) 2017.02.06
착한 빵집 아저씨  (0) 2016.05.11
인생에서 가장 행복 했던 순간  (0) 2016.04.27
제이슨 마라즈 - I'm yours  (0) 2016.04.23
빈틈  (0) 2016.04.23











'하늘을 사랑한 사람 여행기' 카테고리의 다른 글

남해 보리암  (0) 2016.05.29
남해 독일 마을  (0) 2016.05.29
전주한옥마을_풍남문  (0) 2016.05.06
윤동주 시인님의 언덕에 가다  (0) 2016.04.09
윤동주 시인님 문학관에 가다  (0) 2016.04.09












'하늘을 사랑한 사람 여행기' 카테고리의 다른 글

남해 독일 마을  (0) 2016.05.29
전주한옥마을 2  (0) 2016.05.06
윤동주 시인님의 언덕에 가다  (0) 2016.04.09
윤동주 시인님 문학관에 가다  (0) 2016.04.09
외도 여행 두번째  (0) 2015.05.31

-- 분석 함수

    -- RANK OVER()

    -- ROW_NUMBER() OVER() ** 중요  제일 많은 씀 **

      -- 순위를 구함. 

      -- RANK() OVER()는 동일 순위인 경우 1,1,3, 형식으로 출력하지만

      -- ROW_NUMBER() OVER()는 동일 순위인 경우 1,2,3, 형식으로 출력

      -- DENSE_RANK() OVER()는 동일 순위인 경우 1,1,2 형식으로 출력

      -- ROW_NUMBER() OVER()는 매우매우매우 중요한 함수이므로 반드시 알아 둘것 !!!!!!!!!!!!!!!!!!!!!!!

      

      --기본급 내림차순으로 순위를 구하기

      SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa; -- 비교데이타가 똑같으면 순위를 건너뜀

      

      SELECT name, basicpay, ROW_NUMBER() OVER(ORDER BY basicpay DESC) 순위 FROM insa; -- 비교데이타가 똑같아도 순위를 차례대로 매김

      

      -- 기본급 내림차순으로 순위. 단, 기본급이 같으면 수당 내림차순.

      SELECT name, basicpay, sudang, RANK() OVER(ORDER BY basicpay DESC, sudang DESC) 순위 FROM insa;

      

       SELECT name, basicpay, sudang, ROW_NUMBER() OVER(ORDER BY basicpay DESC, sudang DESC) 순위 FROM insa;

      

      -- 부서별 기본급의 내림차순 순위 구하기

      SELECT name, basicpay, buseo, 

        RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

      

      SELECT name, basicpay, buseo, 

        ROW_NUMBER() OVER(PARTITION BY buseo ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

      

      -- 출신도별 부서별 순위(학년의 반별)

      SELECT name, basicpay, city, buseo, 

        RANK() OVER(PARTITION BY city ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

        

      -- 여자 인원수가 가장 많은 부서는?

      SELECT buseo, COUNT(*) FROM insa

        WHERE SUBSTR(ssn,8,1) IN (2,4,6)

        GROUP BY buseo;

        

      SELECT buseo FROM(

      SELECT buseo, COUNT(*) cnt, RANK() OVER(ORDER BY COUNT(*) DESC) 순위

        FROM insa WHERE SUBSTR(ssn,8,1) IN (2,4,6) GROUP BY buseo

        ) WHERE 순위 =1;

        

      -- 기본급여 많이 받는 1~10등 까지 출력(name, basicpay)

      SELECT name, basicpay,RANK() OVER(ORDER BY basicpay DESC) 순위 FROM(

      SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa 

      ) WHERE 순위 <=10;

      

      -- 기본급 상위 10% 출력(name, basicpay)

       SELECT name, basicpay FROM(

        SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa 

        )WHERE 순위<=TRUNC((SELECT COUNT(*) FROM insa) *0.1);

      

      -- 기본급 하위 10% 출력(

      SELECT name, basicpay FROM(

        SELECT name, basicpay, RANK() OVER(ORDER BY basicpay) 순위 FROM insa 

        )WHERE 순위<=TRUNC((SELECT COUNT(*) FROM insa) *0.1);

      

      -- 부서별 기본급여 가장 높은 사람들 출력( name, buseo, jikwi)

      SELECT name, buseo,basicpay, RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC) 순위

      FROM insa; -- 일단 부서별 순위를 매기는 쿼리

      

      SELECT name, buseo,basicpay FROM(

        SELECT name, buseo,basicpay,

        RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC) 순위 

        FROM insa

        ) WHERE 순위=1;

        

    -- ***** 나중에 게시판 작성 할 때 사용하는 쿼리 형식이므로 반드 암기 해야함. *****

    -- ROW_NUMBER()를 이용한 쿼리가 아래 ROWNUM을 사용한 쿼리보다 우수

      SELECT num,name,basicpay FROM(

        SELECT num, name, basicpay, ROW_NUMBER() OVER(ORDER BY num DESC) rnum FROM insa

        ) WHERE rnum>= 10 AND rnum <=15 ORDER BY num DESC;

        

     SELECT num,name,basicpay FROM(

      SELECT ROWNUM rnum, num, name, basicpay FROM(

        SELECT num, name, basicpay FROM insa ORDER BY num DESC

      )

    )WHERE rnum>=10 AND rnum<=15;


출처 : http://tibang.tistory.com/

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

오라클에서 COMMENT 다는 법  (0) 2019.04.24
오라클 테이블스페이스 생성  (0) 2019.04.04
oracle hr 사용자 unlock  (0) 2016.01.25
ORACLE PLS-553 오류 처리  (0) 2015.04.29
오라클 백업  (0) 2015.04.24

@Aspect annotation 기반 AOP 사용

1. 로그인 하지 않은 사용자가, 로그인페이지를 제외한 다른페이지에 접근했을 때 

2. 접근권한이 없는(세션값) 사용자가, 접근할 수 없는 페이지에 접근했을 경우 등

   로깅이나, 공통기능을 사이트 전반에 적용시켜야 할 때 이용한다.


@Aspect 어노테이션은 AspectJ 5버전에 새롭게 추가된 어노테이션으로서, xml파일에 Advice 및 Pointcut 등의 설정을 하지않고도,

자동으로 Advice를 적용할 수 있다.


#STS를 사용할 경우 메이븐 dependency 추가

<!-- AspectJ -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


# spring 환경 설정 xml 파일에 아래 내용을 추가한다.

<aop:aspectj-autoproxy />

<bean id="loginAspect" class="com.common.LoginAspect"/>


# aspect 구현 소스

@Aspect

public class LoginAspect {

 

    @Pointcut("execution(public * com.admin..*(..))")

    private void adminMethod(){}

     

    @Pointcut("execution(public * com.bbs..*(..))")

    private void bbsMethod(){}

     

    @Pointcut("execution(public * com.common..*(..))")

    private void commonMethod(){}

     

    @Pointcut("execution(public * com.onm.administrator..*(..))")

    private void onmAdministratorMethod(){}

     

    @Pointcut("execution(public * com.onm.membership..*(..))")

    private void onmMembershipMethod(){}

     

    @Pointcut("execution(public * com.onm.report..*(..))")

    private void onmReportMethod(){}

         

    private String[] access_url = {

            };

     

    @Around(value ="adminMethod() || bbsMethod()  || commonMethod()

                                || onmAdministratorMethod() || onmMembershipMethod() || onmReportMethod()")

    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable{

 

System.out.println("#### LoginAspect 시작 ####");     

        HttpServletRequest request = null;

        HttpServletResponse response = null;

        for ( Object o : joinPoint.getArgs() ){ 

            if ( o instanceof HttpServletRequest ) {

                request = (HttpServletRequest)o;

            } 

            if ( o instanceof HttpServletResponse ) {

                response = (HttpServletResponse)o;

            } 

        }

        try{

            HttpSession session = request.getSession();

 

                String loginId = (String) session.getAttribute("loginId");

                String userEnterType = (String) session

                        .getAttribute("UserEnterType");

 

                System.out.println("### Margo ==> loginId : " + loginId);

                if (loginId == null || "".equals(loginId)) {

                    System.out.println("### Margo ==> in if loginId : "

                            + loginId);

                    throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

                }           

        }catch(Exception e){

             

            throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

 

        }       

        Object result = joinPoint.proceed();

System.out.println("#### LoginAspect 끝 ####");      

        return result;

    }

}


1라인 에 적용한 @Aspect 어노테이션을 적용한 클래스는 advice구현메소드나, pointcut정의를 포함할 수 있게된다.


4 라인에 AspectJ의 pointcut 표현식으로 pointcut을 정의한다. 


execution(수식어패턴 리턴타입 클래스이름패턴 이름패턴(파라미터패턴))


수식어패턴: public, protected 등


각패턴은 * 를 이용하여 모든 값을 표현할 수 있고. '..' 를 이용하여 0개 이상이라는 의미를 표현가능

Controller라고 끝나는 이름의 클래스에만 적용할때는 - execution(public * com.bbs..*Controller.*(..))


5라인 처럼 pointcut 정의 메소드는 무조건 리턴타입이 void여야한다.

 이 메소드는 advice 관련 어노테이션인 @around의 값으로 사용될 메소드이다.




이제 trace메서드를 이용해서, 필요한 처리를 구현하면된다.

!!!!!!!!!!!!!!!! 여기서...중요한게 있다!!!!!!

27라인에서 joinPoint는 수행될 메소드인데, 보통 세션값 이용할때 request에서 빼내오는데

그 원래 해당메소드 파라메타로 HttpServletRequest가 지정되어 있지 않으면, request가 null이 되겠지..


끝으로 51,55라인에서 뿌린 Exception을 잡을 놈도 xml에 정의해야한다.

servlet xml에다가 추가해주자

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="java.lang.Exception">

index

</prop>

</property>

</bean>


출처 : http://winmargo.tistory.com/164

google map 서비스 만드는 과정 

1. sdk manager로 들어가서 google play service를 설치한다.


2. 라이브러리를 등록한다.



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.vincentgoo.myapplication">


<!-- 내 프로젝트에 대한 보안 수준 설정. 내 프로젝트의 패키지가 com.example.vincentgoo.myapplication 인 경우 -->
<!--android:name="com.example.myapplication.permission.MAPS_RECEIVE"-->
<permission
android:name="com.example.vincentgoo.myapplication.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />

<!-- 구글맵 API v2의 권한 설정 -->
<uses-permission android:name="com.example.vincentgoo.myapplication.permission.MAPS_RECEIVE" />

<!-- 구글맵 API v2의 일반 권한 설정. -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

<!-- 일반 권한 설정 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- OpenGL 사용 설정 -->
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">

<!-- 라이브러리 사용 설정 -->
<uses-library android:name="com.google.android.maps" />

<!-- 구글맵 API v2 키 설정 -->
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyAnZOuHXGxWoTuxXejtC0BWfuEJE7vnJAI" />

<!-- GMS 라이브러리 버전 설정 -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

<구글 map api key 받기>


작업 1 : 고급설정에 path에 C:\Program Files\Java\jdk1.7.0_40\bin 설정여부를 확인한다. 작업 2 : C:\Users\a\.android/debug.keystore을 이용해서 MD5값을 생성하기 위해서 콘솔창을 실행하고 C:\Users\a\.android/으로 경로를 이동한다. 작업 3 : keytool -v -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android 실행한다. 작업 4 : 'SHA1:'뒤에 있는 값을 이용하여 구글맵을 사용하기 위한 API키를 발급받는다. 작업 5 : 구글맵을 사용하기 위한 API키를 발급받기 위해 https://code.google.com/apis/console/사이트에 접속한다. 작업 6 : Google Maps Android API v2 을 'API사용설정'을 클릭한다. 작업 7 : Api Acess서브메뉴선택후 create new android key버튼을 클릭한다. 작업 8 : SHA1;어플리케이션 패키지명을 입력후 create버튼을 클릭한다. 작업 9 : 작업8단계에서 생성된 API키를 androidmanifast.xml파일에서 <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="API키" /> value속성에 작성한다



https://code.google.com/apis/console/ 접속





Google Maps APIs 에서 Google Maps Android API 클릭



Credentials 클릭



API key 설정




+ Recent posts