2018년 11월 14일 수요일

oracle db..接続の件、

oracle db..接続の件、

C:\oraclexe\app\oracle\product\11.2.0\server\odp.net\bin\2.x
のOracle.DataAccess.dllを使うこと。
---> ターゲットCPU --> x64

宛先フォルダ:C:\oraclexe\
Oracleホーム: C:\oraclexe\app\oracle\product\11.2.0\server\
Oracleベース:C:\oraclexe\
'Oracle Databaseリスナー'のポート: 1521

'Oracle Services for Microsoft Transaction Server'のポート: 2030
'Oracle HTTPリスナー'のポート: 8080

ODAC for Visual Studio 2017 Downloads
https://www.oracle.com/technetwork/topics/dotnet/downloads/odacmsidownloadvs2017-3806459.html

.NETへの快適なドライブ
https://www.oracle.com/technetwork/jp/articles/dotnet/o24odp-2147205-ja.html

【.NET】Oracleクライアント不要なODP.NET Managed Driverの接続方法

2018년 9월 2일 일요일

spring 설정 xml과 소스코드에서 properties 사용하기

spring 설정 xml과 소스코드에서 properties 사용하기

포르테시모 2013.07.18 13:52
spring 설정 xml에 다음과 같은 구문을 추가한다.
(첫번째)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:component-scan base-package="com.tutorialspoint" />

 <!-- context:property-placeholder location="classpath:database.properties"  /!-->
<context:property-placeholder location="/WEB-INF/*.properties" />
굵은 표시를 한 부분을 추가한다.
classpath:database.properties의 의미는 classpath로 지정된 경로들에 있는 database.properties를 읽어오라는 뜻이라한다.
classpath:properties/*.properties의 의미는 classpath로 지정된 경로들에 있는 확장자가 properties인 파일들을 모두 읽어 오라는 뜻이라한다.

난 /WEB-/INF/database.properties,/WEB-/INF/file.properties  2개의 properties를 넣어서
<context:property-placeholder location="/WEB-INF/*.properties" />  이렇게 사용하였다.
주의할 점은 properties들에 같은 key 값이 있다면 원하지 않는 데이터가 읽힐수 있다고 한다. 그럴 경우 다른 방법을 사용해야한다고 한다.

spring 설정 xml에 추가로 다음과 같이 db연결 정보를 변경한다.

(두번째)
 기존코드
     <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="cubrid.jdbc.driver.CUBRIDDriver" />
        <property name="url"
            value="jdbc:cubrid:localhost:30000:springdemo:::?charset=UTF-8" />
        <property name="username" value="dba" />
        <property name="password" value="admin" />
    </bean> <!-- Definition for studentJDBCTemplate bean -->
    
 신규코드
     <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />

(세번째)
database.properties
jdbc.driver=cubrid.jdbc.driver.CUBRIDDriver
jdbc.url=jdbc:cubrid:localhost:30000:springdemo:::?charset=UTF-8
jdbc.username=dba
jdbc.password=admin

file.properties
file_dir.url=/static/file_upload_data/
file_dir.thumbnail.url=/static/file_upload_data/thumbnail/
file_dir.english_word_audio_file.url=/static/english_word_audio_file/

(네번째)
자바 코드에서 해당 properties 값을 가져다 쓸때는 아래와 같이 했다.
@Value("${file_dir.url}")
private String fileUploadLoc;
속성으로 지정해야했다. 지역변수로는 annotation을  이용해서는 받아올수 없었다.
properites에 해당 키값이 없다면 컴파일시에 오류를 낸다.

위에 내용은 내가 메인으로 사용할 properties의 내용을 가져올때 사용할 방법이다.
나혼자 만들때는 문제가 안되겠지만 혹시나 나중에 다른사람들과 협업을 할때를 고려하여 다른 방법도 적는다.

SpEL이용
(첫번째)
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">

<util:properties id="db" location="/WEB-INF/database.properties" />
<util:properties id="file" location="/WEB-INF/file.properties" />
위에 굵게 표시한 부분을 넣어줘야한다.
주의 할점은  첫번째와는 다르게 <util:properties id="db" location="/WEB-INF/*.properties" /> 이렇게
사용할수가 없다. 에러가 발생한다.   파일명을 온전히 써주어야한다.

(두번째)

이전코드
   <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
 신규코드
 <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="#{db['jdbc.driver']}" />
       <property name="url" value="#{db['jdbc.url']}" />
       <property name="username" value="#{db['jdbc.username']}"  />
       <property name="password" value="#{db['jdbc.password']}"  />
         </bean> <!-- Definition for studentJDBCTemplate bean -->  

(세번째 properties 설정은 동일하다.)
(네번째) 소스코드에서 사용할때 
    @Value("#{file['file_dir.url']}")
    private String fileUploadLoc;
소스코드에서 사용할때 첫번째 것은 동일한 key가 두개이상 존재할때 내가 원하는 값을 선택할수 없는 문제가 있고.
두번째것은 값이 실제로 존재하지 않아도 오류를 내지않고 null로 들어가게 된다.

두방법을 모두 한꺼번에 사용해도 에러가 발생되지 않는다.
단 두번째 방법을 사용하고 spring 설정 xml에 첫번째 방법의 태그를 지우고
첫번째 방법과 같이 
@Value("${file_dir.url}")
private String fileUploadLoc;
쓰게 되면 fileUploadLoc에는 "${file_dir.url}"  라는 문자열이 들어가게 된다. 조심해야한다.

Spring config
<util:properties id="db" location="/WEB-INF/database.properties" />
jsp
<spring:eval expression="@db.getProperty('jdbc.password')" />
테스트 해보니까 SpEL만 되는 것 같다.  참고 자료에는 context:property-placeholder 태그도 사용했지만 
없어도 정상동작 하는 것을 확인하였다.


출처: http://jijs.tistory.com/entry/spring-설정-xml과-소스코드에서-properties-사용하기 [나살고싶어~]

2018년 8월 23일 목요일

Apache POIで実現が手間、困難な事

■Apache POIで実現が手間、困難な事

投稿者:  | 2014年4月1日
今回の開発でApache POI(以下POI)を使用する機会があったので
POIで実現が手間、困難な事を紹介したいと思います。
ライブラリを選定する参考になれば幸いです。
今回使用した開発言語、POIとExcelのバージョンは下記の通りです。
・Java 1.7.0_45 64bit
・poi 3.8 20120326
・Excel 2010 xlsx形式

1.シートのコピーでオブジェクトのコピーが行えない

 図形やグラフ、フォーム部品などオブジェクトを含む
 シートのコピーを行った場合、ファイルが破損します。
 予めオブジェクトが置かれているシートを操作する、
 コピーしたシートにオブジェクトの追加などは
 問題ありません。

2.列単位の操作が行えない

 処理単位が行やセルしか無く、列単位での挿入は
 行をループさせながらセルを増やすという処理を
 実装しなければなりません。

3.基本的にセル範囲は行、セルの追加とは非同期

 結合セル、参照、印刷範囲などのセル範囲は行の追加削除、
 セルの追加削除を行っても自動的には更新されません。
 場合によってはファイルが破損するので注意が必要です。
 全て範囲を確認しながら範囲を広げたり、狭めたりを
 行わなければなりません。

4.行の自動高さ調整はされない

 多くのExcelライブラリがそうであるようにセルに
 折り返すようなテキストを挿入しても行の自動高さ調整は
 されません。

5.画像の細かい調整できない

 配置した画像の位置や大きさなどをピクセル指定などで
 調整する事ができないようです。
 配置自体はセル範囲に対して行うのですが、
 セルに対してフィットするように配置されて縦横比は
 無視されます。
 セル範囲からオフセットを行う引数もあるのですが、
 残念ながら今回は上手く機能させる事ができませんでした。

6.配置しているグラフを操作する方法がない

 3.8バージョンでは配置済みのグラフを取得できる処理があると
 思うのですが、上手く取得する事ができませんでした。
 結果、配置しているグラフのデータ範囲などを更新する
 事はできませんでした。
 名前定義は更新が可能なので上手くテンプレートを作成すれば
 データ範囲は調整が可能かも知れません。
 また、グラフの新規作成についてもドキュメントが非常に
 少なく、あまり現実的ではありません。
 グラフ自体は予め配置してデータ範囲を決めておけば、
 出力した値での集計は問題なく可能です。

7.非常に多くのメモリを使用する

 3.8時点でのPOIは全てのデータをメモリ上に展開する為、
 かなりのメモリを消費します。
 保存された実ファイルの10倍以上は使用するようです。
 クライアント側で動作させるプログラムなら大きな問題には
 ならないかも知れませんが、WEBサーバで動作させる場合には
 出力するデータに制限をかける事をオススメします。
以上が今回の開発で悩まされたPOIで実現が手間、困難な事です。
デメリットは大きいですが、オープンソースというメリットは
非常に大きいものです。
いくつかの問題点はラッピングクラスなどを実装すれば
使いやすいようにカスタマイズできると思います。
問題が多いオブジェクトに関してもある程度はテンプレートの
工夫などで切り抜ける事ができますので、
簡単な帳票や表などには十分使用できると思います。
今後はオブジェクトやメモリの問題なども改善していく
予定があるようなので、期待したい所です。
システム構築のご依頼でしたらお気軽にご相談下さい。
弊社お問い合わせ

POIで、読み込んだExcelファイルから図形を取得して値をセットする

POIで、読み込んだExcelファイルから図形を取得して値をセットする

  
Excelファイル(※2007以降の.xlsx形式)から目的の図形を取得し、値をセットする。
今回はテキストボックスを取得してセットするサンプル。

既に対象のWorkbookとSheetを取得している状態から。
// 図形描画の為のXSSFDrawingから図形のListを取得
XSSFDrawing drawing = sheet.createDrawingPatriarch();
List shapeList = drawing.getShapes();

// Listから目的の図形を探索
for (XSSFShape sh : shapeList) {
  // (1)実際の型を確認
  if (sh instanceof XSSFSimpleShape) {
     XSSFSimpleShape ss = (XSSFSimpleShape) sh;
     // (2)テキストの値をkeyに対象かどうか判断
     if (ss.getText().equals("key")) {
      ss.setText("value you want to set");
     }
  }
}

(1)Listで取得されるオブジェクトはXSSFShapeのサブクラス(※)であり、検査せずにSimpleShapeとして扱おうとするとClassCastExceptionが発生する。
 ※こいつら。↓
  XSSFConnector, XSSFGraphicFrame, XSSFPicture, XSSFShapeGroup, XSSFSimpleShape。

(2)APIDocなんかを読み漁ったけれども、定義した名前から図形を取得する方法がわからず。とりあえずテキストから判断するやり方で記述。

【環境】

 POI 3.10
 Java SE7

【参考】

XSSFSimpleShape (POI API Documentation)


[追記 2014/5/7] 

上記のやり方で値をセットすると、図形にもともと設定されていたフォントや揃方がクリアされてデフォルト値になってしまうことがわかった。

もともと設定されていたフォントなどを維持したままテキストのみを置き換える場合は下記のようにテキストを分解し、テキストの最小単位(TextRun)に対して操作を行わなければいけないらしい。
// 上記の11行目から
if (ss.getText().equals("key")) {
  for (XSSFTextParagraph p : ss.getTextParagraphs()) {
   for (XSSFTextRun r : p.getTextRuns()) {
    r.setText("value you want to set");  // ※1
   }
  }
}
※1 改行を含む文字列をブチ込んでも大丈夫だった。だがParagraphの扱いがよくわかっていないので、複数行を操作する場合はもう少し工夫が必要なのかもしれない。

FontはFontクラスで管理してたり、AlignはTextParagraphで管理していたり。Excelの実装自体がそうなのかもしれないけど、Excel上の設定と各オブジェクトの結びつきがわかりづらく、直感的に操作しづらい。。

2018년 5월 27일 일요일

JavaScriptまとめ ➤ 正規表現 サンプル

http://cya.sakura.ne.jp/js/regexp.htm#s005
http://www.kanaya440.com/contents/tips/


$(document).ready(function(){

// HOME > JavaScript > 数値の文字数(桁数)を調べるときにlengthは使えない
var no = 10000;
var figure = String(no).length;
$('#testDiv').text(figure);

// 숫자 3자리 단위마다 콤마(comma) 찍기
var no2 = 33333;
var aaa = no2.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
$('#testDiv').text(aaa);

});

2018년 3월 23일 금요일

Take my breath away

Take my breath away
Berlin
Watching every motion
In my foolish lover's game
On this endless ocean
Finally lovers know no shame
Turning and returning
To some secret place inside
Watching in slow motion
As you turn around and say
Take my breath away
Take my breath away
Watching I keep waiting
Still anticipating love
Never hesitating
To become the fated ones
Turning and returning
To some secret place to hide
Watching in slow motion
As you turn to me and say
Take my breath away
Through the hourglass I saw you
In time you slipped away
When the mirror crashed I called you
And turned to hear you say
If only for today
I am unafraid
Take my breath away
Take my breath away
Watching every motion
In this foolish lover's game
Haunted by the notion
Somewhere there's a love in flames
Turning and returning
To some secret place inside
Watching in slow motion
As you turn my way and say
Take my breath away
Take my breath away
Take my breath away
Take my breath away
Watching every motion in my foolish lover"s game
당신의 동작 하나하나를 지켜보죠. 바보 같은 사랑의 게임 속에서
On this endless ocean finally lovers know no shame
이렇게 끝없는 바다위에 결국 연인들은 아무런 부끄럼도 모르게 되죠.
Turning and returning to some secret place inside
마음속깊이 은밀한 곳을 향해 계속 돌고 돕니다.
Watching in slow motion as you turn around and say
난 가만히 지켜보고 있어요. 당신이 돌아서며 말하는 모습을
Take my breath away, Take my breath away
내 마음을 가져가세요. 내 마음을 가져가세요.
Watching I keep waiting still anticipating love
당신을 지켜보며 당신의 사랑을 기다리고 있어요.
Never hesitating to become the fated ones
운명적인 사랑을 이루는데 조금도 주저하지 않아요.
Turning and returning to some secret place to hide
마음속 깊은 곳을 향해 끝없이 돌고 돕니다.
Watching in slow motion as you turn to me and say
가만히 지켜보고 있어요. 그대가 내 쪽으로 돌아서며 말하는 걸...
Take my breath away
내 마음을 가져가세요.
Through the hourglass I saw you, in time you slipped away
모래시계를 통하여 나는 당신을 보았어요. 세월 속에 당신은 슬쩍 가버렸죠.
When the mirror crashed I called you, and turned to hear you say
거울이 깨졌을 때 나는 당신을 소리쳐 부르고 몸을 돌려 당신이 말하는 것을 들었죠.
If only for today I am unafraid
오직 오늘만을 위해서라면 나는 두렵지 않아요.
Take my breath away, Take my breath away
내 마음을 가져가세요. 내 마음을 가져가세요.
Watching every motion in this foolish lover"s game
이 바보 같은 사랑게임을 하면서 당신의 모든 움직임을 지켜보고 있어요.
Haunted by the notion somewhere there"s a love in flames
어딘가에 불타는 사랑이 있을 거라는 생각에 사로잡히지요.
Turning and returning to some secret place inside
깊이 감추어진 내 마음속의 사랑을 향해 끝없이 돌고 돕니다.
Watching in slow motion as you turn to me and say
난 가만히 지켜보고 있어요. 당신이 내 쪽으로 돌아서며 이렇게 말하는 모습을..
Take my breath away, My love, take my breath away
내 마음을 가져가세요. 내 사랑, 내 마음을 가져가세요.

2018년 3월 13일 화요일

terasoluna error


<t:messagesPanel />

<div>
<form:errors path="*" />
</div>

YearMonthUpdateUpdateBLogicOutput output = null;
try {
    output = yearMonthUpdateUpdateBLogic.execute(input);

    if (!result.hasErrors()) {
        ResultMessages messages = ResultMessages.info().add("i.ne.fw.0002");
        model.addAttribute(messages);
    }

} catch (BusinessException e) {
    model.addAttribute(e.getResultMessages());

} catch (Exception e) {
    ResultMessages messages = ResultMessages.error().add("e.ne.fw.8002")
            .add(ResultMessage.fromText(e.getMessage()));
    model.addAttribute(messages);
}

BindingResult result = input.getResult();
if (result.hasErrors()) {
    return null;
}

if (!mYearMonth.getSysYearMonth().equals(form.getSysYearMonth())) {
    ResultMessages messages = ResultMessages.error().add("e.ne.fw.9001");
    throw new BusinessException(messages);
}

2018/03/14 일본어

ふよ[付与·附与] 부여; (내려) 줌.(↔剝奪)

単項目チェックはBean Validation、
相関チェックはSpring Validator又はBean Validationでチェックを行う。

いじょう[委譲·依譲·移譲]
위양·이양.

せんい[遷移]
천이.(=転移)

てっする[徹する]
철저하다; 투철하다; 꿰뚫다.사무치다.
사무치다, 철저하다;투철하다, 밤을 새우다

すいしょう[推奨]추장.

てったい[撤退]철퇴.

こな[粉]
가루; 분말; 특히, 밀가루.(=粉)

@Autowired、@Inject、@Resourceの違いについての検証

@Autowired、@Inject、@Resourceの違いについての検証
Java
spring
 この記事は最終更新日から1年以上が経過しています。
@Autowired、@Inject、@Resourceについて、共通的な動きとしては、何れも自動でフィールドにbeanをインジェクションすることです。今回はそれらの違いについて、検証してみます。

@Resource⇨javax.annotation
@Inject⇨javax.inject
@Autowired⇨org.springframework.bean.factory
事前準備
以下のクラスを用意する。
・インタフェースクラスPrint
・インタフェースクラスPrintの実装クラスHelloWorldPrintImp
・インタフェースクラスPrintの実装クラスHelloMoonPrintImp

public interface Print {
    public void print();
}

@Component
public class HelloWorldPrintImp implements Print {

    @Override
    public void print() {
        System.out.println("Hello World");
    }
}
@Component
public class HelloMoonPrintImp implements Print {

    @Override
    public void print() {
        System.out.println("Hello Moon");
    }
}
検証1
@Autowired
private Print print;
@Inject
private Print print;
@Resource
private Print print;
上記のケースは、何れも例外NoUniqueBeanDefinitionExceptionが発生した。
インタフェースクラスPrintの実装クラスのbeanがユニックでないのが原因である。

検証2
@Autowired
private Print helloWorldPrintImp;
@Inject
private Print helloWorldPrintImp;
@Resource
private Print helloWorldPrintImp;
インジェクション対象のフィルド名を@Componentのクラス名と一致すればに、検証1の例外を回避し、上記何れも正常にインジェクションできる。

実行結果は以下の通りです。
@Autowired:Hello World
@Inject:Hello World
@Resource:Hello World

検証3
@Autowired
@Qualifier("helloWorldPrintImp")
private Print print;
@Inject
@Qualifier("helloWorldPrintImp")
private Print print;
@Resource
@Qualifier("helloWorldPrintImp")
private Print print;
@Qualifier("name")を上記のアノテーションと併用することで、インジェクション対象bean名を指定でき、検証1の例外も同様に回避する。

実行結果は以下の通りです。
@Autowired:Hello World
@Inject:Hello World
@Resource:Hello World

検証4
@Autowired
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
@Inject
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
@Resource
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
フィルド名=コンポーネントクラス名、且つ@Qualifierで別のコンポーネントを指定する場合、@Autowiredと@Injectの動きは一緒であり、@Qualifierで指定するコンポーネントがインジェクションされている。
@Resourceは@Qualifierで指定のコンポーネントを無視し、フィルド名と一致のコンポーネントがインジェクションされている。

実行結果は以下の通りです。
@Autowired:Hello Moon
@Inject:Hello Moon
@Resource:Hello World

また、@Resource(name="name")でコンポーネント名を指定できる。

@Resource(name="helloMoonPrintImp")
private Print helloWorldPrintImp;
その場合に、nameで指定されるコンポーネントがインジェクションされる。

実行結果は以下の通りです。
@Resource:Hello Moon

結論
タイプ一致の場合に、インジェクションの優先順位:
@Autowiredと@Inject
1.Qualifier指定のコンポーネント
2.フィルド名と一致のコンポーネント

@Resource
1.@Resource(name="name")で指定のコンポーネント
2.フィルド名と一致のコンポーネント
3.Qualifier指定のコンポーネント

@Component、@Service、@Repository、@Controllerの違いについて

@Component、@Service、@Repository、@Controllerの違いについて
Java
spring
 この記事は最終更新日から1年以上が経過しています。
Springアノテーション「@Component、@Service、@Repository、@Controller」について、
動きとして基本的同じであり、何れもアノテーションが付与されたクラスをSpringのDIコンテナにbeanとして登録します。
使い分けとしては、Spring MVCにおいてコントローラー層のクラスには@Contoroller、
サービス層のクラスには@Serivice、データ層のクラスには@Repository、
どれにも当てはまらない場合は@Componentを付けます。

@Controller
Spring MVCでコントローラー層のクラスに付与する。
Controller は、主に以下の役割を担う。
・画面遷移の制御
・ドメイン層の Service の呼出 (主処理を実行する)

@Controller
@RequestMapping("findProduct")
public class FindProductController {

    @Inject
    FindProductService findProductService;

    @RequestMapping(value="list")
    public String list(Model model) {
        Collection<Product> products = findProductService.findAll();
        model.addAttribute("products", products);
        return "product/list";
    }
}
@Service
Sping MVCでサービス層のクラス(ビジネスロジック等)に付与する。
Service は業務処理を提供する。

@Service
public class FindProductServiceImp implements FindProductService {

    @Inject
    FindProductRepository findProductRepository;

    public Todo findAll() {

        Collection<Product> products = findProductRepository.findAll();

        if (products == null) {

            // エラー処理
            ...
        }
        return products;
    }
}
@Repository
Spring MVCでデータ層のクラス(DAO等のDBアクセスを行うクラス)に付与する。

@Repository
public class FindProductRepositoryImpl implements FindProductRepository {

    private Collection<Product> products;

    @Override
    public Collection<Product> findAll() {
        return products;
    }
}
@Component
Spring MVCに限らず、SpringのDIコンテナにbeanとして登録したいクラスへ付与する。

@Component
public class checkComponentImp implements checkComponent{

    @Override
    public boolean check(BLogicParam param) {
        ...
    }
}

[Spring] @Autowired, @Resource, @Inject의 차이 Spring

[Spring] @Autowired, @Resource, @Inject의 차이   Spring
2014. 7. 7. 18:01
https://blog.naver.com/platinasnow/220053030295

이번에 소개하는 세가지 어노테이션 @Autowired, @Resource,@Inject은 모두 의존관계를 자동으로 연결해주는 기능을 가진 어노테이션입니다. 다만 조금씩의 차이가 있습니다.

@Autowired
@Inject
@Resource

범용
스프링 전용
자바에서 지원
자바에서 지원
 연결방식
타입에 맞춰서 연결
타입에 맞춰서 연결
이름으로 연결

 자세한 설명을 하자면, @Inject와 @Resource는 JSR에 실려있는 자바 기존의 어노테이션입니다. 반면 @Autowired의 경우에는 스프링에서 등장한 어노테이션입니다. 따라서 스프링 이외에서는 사용 할 수 없습니다. 만약에 프로젝트를 스프링에서 다른 프레임워크로 바꿀 생각이 있으시다면 @Autowired보단 @Inject나 @Resource를 쓰시면 됩니다. 다만 이런 경우는 거의 없다고 봅니다.

또한 연결 방식은 @Autowired와 @Inject는 타입에 맞춰서 하는 반면, @Resource는 이름에 맞춰서 연결하게 됩니다. 예를 들어보겠습니다.

Bird 인터페이스를 상속하는 Chicken과 Penguin 이라는 클래스가 있다고 합시다.
Chicken과 Penguin 클래스를 연결할 것이므로 @Component로 빈에 등록해주었습니다.
public class Bird{}
@Component
public class Chicken implements Bird{}
@Component
public class Penguin implements Bird{}

그리고 다음과 같이 연결해봅시다.
@Autowired
private Chicken penguin;  //Chicken 타입으로 연결됩니다.

@Inject
private Penguin chicken; //Penguin 타입으로 연결됩니다.

@Resource
private Chicken penguin;  //penguin 타입으로 연결됩니다만, Chicken 클래스를 자료형으로 두었기에 캐스팅이 되지 않아 에러가 납니다

@Resource
private Bird penguin;      //penguin 타입으로 연결되어 호출해보면 penguin 클래스의 값을 호출하는 것을 볼 수 있습니다.

@Autowired와 @Inject의 경우에도 @Qualifier 어노테이션을 사용하면, 타입 이외의 방법으로도 연결 할 수 있습니다.

@Autowired
@Qualifier("chicken")
pirvate Brid penguin;

위와 같이 쓰면 이름에 상관없이 Chicken 타입으로 연결되는 것을 알 수 있습니다. 이렇게 @Qualifer와 함께 쓰면 더욱 강력한 기능을 쓸 수 있는 장점이 있습니다.

[출처] [Spring] @Autowired, @Resource, @Inject의 차이|작성자 심해펭귄

[Spring] ViewResolver 설정

[Spring] ViewResolver 설정
2014.12.18 23:51
Posted in Programing/Spring by devbox

ViewResolver 설정

뷰 영역 구현

컨트롤러는 최종적으로 결과를 출력할 뷰와 뷰에 전달할 객체를 담고 있는 ModelAndView 객체를 리턴한다.

DispatherServlet은 ViewResolver를 사용하여 결과를 출력할 View 객체를 구하고, 구한 View 객체를 이용하여 내용을 생성한다.

1. 컨트롤러 구현 및 설정 추가

컨트롤러를 구현하려면 먼저 @Contoller 어노테이션을 클래스에 적용한다. 그리고, @RequestMapping 어노테이션을 이용해서 클라이언트의 요청을 처리할 메서드를 지정한다.

package madvirus.spring.chap06.controller;

import java.util.Calendar;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

// @Controller 어노테이션은 해당 클래스가 스프링 MVC의 컨트롤러를 구현한 클래스라는 것을 지정한다.

@Controller
public class HelloController {

// @RequestMapping 어노테이션은 값으로 지정한 요청 경로를 처리한 메서드를 설정한다.

// 이 경우 http://host:port[/컨텍스트 경로]/hello.do 요청을 HelloController 클래스의 hello() 메서드가 처리하게 된다.

@RequestMapping("/hello.do")
public ModelAndView hello() {

//ModelAndView는 컨트롤러의 처리 결과를 보여줄 뷰와 뷰에서 출력할 모델을 지정할 때 사용된다.

ModelAndView mav = new ModelAndView();
// 컨트롤러의 처리 결과를 보여줄 뷰의 이름을 'hello'를 지정한다.

mav.setViewName("hello");
// 모델에 'greeting'이라는 이름으로 String 타입의 값을 추가하였다.

mav.addObject("greeting", getGreeting());

return mav;

}

// 스프링은 ModelAndView 뿐만 아니라 String이나 modelMap, 또는 Map과 같은 타입을 이용해서 뷰 이름과 모델 정보를 설정할 수 있도록 하고 있다.

private String getGreeting() {

int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);

if (hour >= 6 && hour <= 10) {

return "좋은 아침입니다.";

} else if (hour >= 12 && hour <= 15) {

return "점심 식사는 하셨나요?";

} else if (hour >= 18 && hour <= 22) {

return "좋은 밤 되세요";

}

return "안녕하세요";

}

}

DispatherServlet은 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에 스프링 설정 파일에 컨트롤러를 빈으로 등록해 주어야 한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<bean id="helloController" class="madvirus.spring.chap06.controller.HelloController" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>

</beans>

스프링 2.5 버전까지는 @Controller 어노테이션이 적용된 클래스를 컨트롤러로 사용하려면 별도의 DefaultAnnoationHandlerMapping과 AnnotationHandlerAdapter를 스프링 설정 파일에 등록해 주어야 한다. 하지만 스프링 3.0부터는 이 두 빈 객체를 기본 구현체로 사용하기 때문에 별도의 설정을 하지 않을 경우 @Controller 어노테이션이 적용된 클래스를 컨트롤러 구현체로 사용할 수 있게 된다.

2. 설정 파일에 ViewResolver 설정 추가

컨트롤러 클래스는 직접 또는 간접적으로 ModelAndView 객체를 생성하게 된다.
예를 들어 앞서 작성한 HelloController 클래스는 다음과 같이 ModelAndView 객체를 생성해서 리턴하였다.

public ModelAndView hello() {

ModelAndView mav = new ModelAndView();

// 뷰이름
mav.setViewName("hello");// setViewName() 메서드를 이용하여 뷰 이름을 지정한 모습

mav.addObject("greeting", getGreeting());

return mav;
}

컨트롤러의 처리 결과를 보여줄 뷰의 이름을 'hello'를 지정하였는데, DispatherServlet은 이 뷰 이름과 매칭되는 뷰 구현체를 찾기 위해 ViewResolver를 사용한다.

JSP를 뷰 기술로 사용할 경우 다음과 같이 InternalResourceViewResolver 구현체를 빈으로 등록해주면 된다.

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/view"/>
<property name="suffix" value=".jsp/>

// 이는 ViewResolver가 "WEB-INF/view/뷰이름.jsp"를 뷰 JSP로 사용한다는 것을 의미한다.

// 즉, 앞의 예에서 HelloController는 뷰 이름으로 "hello"를 리턴하므로, 실제로 사용되는 뷰 파일은 "WEB-INF/view/hello.jsp"파일이 된다.

</bean>

InternalResourceViewResolver는 컨트롤러가 지정한 뷰 이름으로부터 실제로 사용될 뷰를 선택하는데, 이 때 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 추가한 값이 실제로 사용될 자원의 경로가 된다.

※ ViewResolver 구현 클래스
스프링 컨트롤러는 뷰에 의존적이지 않다. 컨트롤러는 아래 코드와 같이 결과를 생성할 뷰의 이름만 지정할 뿐이다.

컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체는 ViewResolver가 구한다.

스프링은 몇 가지 ViewResolver 구현 클래스를 제공하고 있는데, 이중 주료 ViewResolver 구현 클래스는 다음과 같다.

3. ViewResolver 인터페이스

package org.springframework.web.servlet;

import java.util.Locale;

public interface ViewResolver{
View resolveViewName(String viewName, Locale locale) throws Exception;
}

ViewResolver는 뷰 이름과 지역화를 위한 Locale을 파라미터로 전달받으며, 매핑되는 View 객체를 리턴한다. 만약, 매핑되는 View 객체가 존재하지 않으면 null을 리턴한다.

4. View 객체
ViewResolver는 응답 결과를 생성할 뷰 객체를 리턴한다. 모든 뷰 클래스는 View 인터페이스를 구현하고 있으며, View 인터페이스는 다음과 같이 정의되어 있다.

public interface View {

    String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";

    String getContentType();

    void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;

}

getContentType() 메서드는 "text/html"과 같은 응답 결과의 컨텐츠 타입을 리턴한다. render() 메서드는 실제로 응답 결과를 생성한다. render() 메서드의 첫 번째 파라미터인 model에는

컨트롤러가 리턴한 ModelAndView 객체의 모델 데이터가 전달된다. 각각의 View 객체는 이 모델 데이터로부터 응답 결과를 생성하는데 필요한 정보를 구한다.

출처: http://devbox.tistory.com/entry/Spring-ViewResolver-설정 [장인개발자를 꿈꾸는 :: 기록하는 공간]

2018년 3월 11일 일요일

npm (소프트웨어)

npm (노드 패키지 매니저/Node Package Manager)은 자바스크립트 프로그래밍 언어를 위한 패키지 관리자이다. 자바스크립트 런타임 환경 Node.js의 기본 패키지 관리자이다. npm이라는 이름의 명령 줄 클라이언트, npm 레지스트리라는 이름의 그리고 공개 패키지와 지불 방식의 개인 패키지의 온라인 데이터베이스로 이루어져 있다. 이 레지스트리는 클라이언트를 통해 접근되며 사용 가능한 패키지들은 npm 웹사이트를 통해 찾아보고 검색할 수 있다. 패키지 관리자와 레지스트리는 npm사에 의해 관리된다.

npm은 온전히 자바스크립트로 작성되어 있으며 모듈 패키징이 엉망으로 완성되는 것을 관찰하고 펄의 CPAN과 PHP의 PEAR와 같은 기타 유사한 프로젝트의 단점들에서 영향을 받은 Isaac Z. Schlueter가 개발하였다.

원저자 Isaac Z. Schlueter
개발자 Rebecca Turner, Kat Marchan, others
발표일 2010년 1월 12일(8년 전)[1]
최근 버전 5.6.0 / 2017년 11월 28일(3달 전)[2]
프로그래밍 언어 자바스크립트
라이선스 아티스틱 라이선스

웹사이트 www.npmjs.com