※ 책은 Spring 3.0 인데 위의 이미지랑 조금 다름... 몇개 빠져있음, 아마 위에껀 상위버전인듯 3.1 인가'- ';;


- Core, Beans

  스프링의 핵심 모듈. Bean 컨테이너 관련기능을 제공


- Context

   국제화(il8N)나 Java EE 가 제공하는 몇몇 기능(JNDI, EJB, JMX등)을 지원


- AOP

  관점지향 프로그래밍 기능을 제공


- ORM

  Object Relational Mapping 기능을 제공, 


- JDBC

   JDBC 추상화 기능을 제공. JDBC에 의한 데이터베이스 엑서스를 지워나혐, 트랜잭션관리의 기반


- Web

   예를 들어 파일 업로드 같은 웹어플리케이션 이용에 편리한 기능을 제공


- Web Servlet

   웹어플레케이션에 MVC 프레임워크 기능을 제공



- 적는글

   오랜만에 스프링 3.0 서적보면서, 해볼려다가 하는김에 최신버전으로 하고 싶어서 기존과 같은 라이브러리를 찾아봤지만,

   찾지 못했다.

   이유는 스프링의 모듈이 다양해지면서, 더 이상 버전별 라이브러리를 묶어서 따로 배포하지 않는다.

   라이브러리 배포버전 젤 최신은 3.1.4 버전이고, 그 이후의 버전을 사용 할 경우에는,

   Maven 이나, gradle 로 다운받아서 내가 필요한것만 컴파일해서 사용해야한다.

   그래서 3.1.4 버전으로 다시 공부 중'- ' 근데.. 스프링 너무한다. 배째라는 식인데..

   3.1.4 버전까지 스프링 라이브러리 배포판 받는 경로는 여기!!! 남긴다.

   http://docs.spring.io/downloads/nightly/release-download.php?project=SPR

   

Spring 3.0 으로 개발중에 로컬 테스트 DB는 Oracle10g JDBC 드라이버는 ojdbc14-10.2 버젼

로컬에서 테스트완료하고, 테스트 DB Oracle11g 에 반영을 하니까, 서버 기동중에 자꾸

'Could not get a DatabaseId Form dataSource' 라고 ERROR 나오고 기동안됨.

딱 보면 dataSource 이름을 못가져온대서 이름도 바꿔보고...

구글링해서 나오는거 이것 저것 다해봐도 똑같음.. 하다하다 안되서, 옆에 다른 시스템 개발중이신 분한테 여쭈어 보니

자기는 ojdbc14-11.2 버젼 쓰고있는데, 잘 된다고, odjbc14 바꿔서 해보라고 하니.. 바로 됨'- '


내가 멍청한건지... 암튼 경력(?)은 무시 못함. 또 하나 배움'- ' 수고요



- 컴파일러가 일반적으로 경고하는 내용 중 제외시킬때 쓰인다.(경고제외)


- 옵션

1. all : 모든 경고를 억제

2. cast : 캐스트연사자 관련 경고억제

3. dep-ann : 사용하지 말아야 할 주석관련 경고억제

4. deprecation : 사용하지 말아야 할 메서드관련 경고억제

5. fallthrough : switch 문에서의 break 누락관련 경고억제

6. finally : 반환하지 않는 finally 블럭관련 경고억제

7. null : null 분석관련 경고억제

8. rawtypes : 제네릭을 사용하는 클래스 매개변수가 불특정일때의 경고억제

9. unchecked : 검증되지 않은 연산자관련 경고억제

10. unused : 사용하지 않는 코드관련 경고억제


- 예 ) @SuppressWarnings("unchecked")

- 스프링에서는 간편하고 프레임워크안에서 스케쥴링 하던 quatz 를 annotation 으로 더 간단하게 설정 할 수 있다.

1. applicationContext.xml 같은 bean 을 설정하는 설정파일에

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/task

http://www.springframework.org/schema/task/spring-task-3.0.xsd

<task:annotation-driven />

 

구문을 입력하면 된다.

EX) 별도의 context-schedule.xml 로 관리(첨부파일 확인)

파일명 : context-schedule.xml  (context-schedule.xml)

 

 

2. 스케쥴링 할 메소드위에 @scheduled 어노테이션을 입력한 후에 시간설정하면 끝

 

3. 시간 설정 @scheduled(cron=" ")  * 리눅스 crontab 과 같은 설정방법

ex> @Scheduled(cron="0 0 02 * * ?") = 매일 새벽2시에 실행

ex> @Scheduled(cron="0 0 02 2,20 * ?") = 매월 2일,20일 새벽2시에 실행

 

4. 스케쥴러 cron 양식? 의미?

 

초 0-59 , - * /
분 0-59 , - * /
시 0-23 , - * /
일 1-31 , - * ? / L W
월 1-12 or JAN-DEC , - * /
요일 1-7 or SUN-SAT , - * ? / L #
년(옵션) 1970-2099 , - * /

* : 모든 값
? : 특정 값 없음
- : 범위 지정에 사용
, : 여러 값 지정 구분에 사용
/ : 초기값과 증가치 설정에 사용
L : 지정할 수 있는 범위의 마지막 값
W : 월~금요일 또는 가장 가까운 월/금요일
# : 몇 번째 무슨 요일 2#1 => 첫 번째 월요일

 

예제)
Expression Meaning
초분시일월주(년)
 "0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
 "0 15 10 ? * *" : 모든 요일, 매월, 아무 날이나 10:15:00
 "0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00
 "0 15 10 * * ? *" : 모든 연도, 아무 요일, 매월, 매일 10:15
 "0 15 10 * * ? : 2005" 2005년 아무 요일이나 매월, 매일 10:15
 "0 * 14 * * ?" : 아무 요일, 매월, 매일, 14시 매분 0초
 "0 0/5 14 * * ?" : 아무 요일, 매월, 매일, 14시 매 5분마다 0초
 "0 0/5 14,18 * * ?" : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초
 "0 0-5 14 * * ?" : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초
 "0 10,44 14 ? 3 WED" : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00
 "0 15 10 ? * MON-FRI" : 월~금, 매월, 아무 날이나 10:15:00
 "0 15 10 15 * ?" : 아무 요일, 매월 15일 10:15:00
 "0 15 10 L * ?" : 아무 요일, 매월 마지막 날 10:15:00
 "0 15 10 ? * 6L" : 매월 마지막 금요일 아무 날이나 10:15:00
 "0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00
 "0 15 10 ? * 6#3" : 매월 3번째 금요일 아무 날이나 10:15:00

 

사진도 첨부합니다.

 

 

 

@Autowire 속성에 지정 가능한 값


1. no

- Autowiring 을 하지 않는다. 기본 값.


2. byName

- Bean 필드 이름과 같은 이름의 id를 갖는 Bean을 연결해준다.


3. byType

- Bean 필드에 대한 Setter 메서드의 인수 타입을 사용해 연결해준다.


4. constructor

- 생성자에 대해 byType을 사용해 연결해준다.


5. autodetect

- constructor인지 byType 인지 자동으로 판단한다.

  기본 생성자가 정의되어 있지 않은 경우는 constructor를, 정의되어 있는 경우에는 byType을 사용해 연결해준다.

- 기존에 @RequestParam 을 사용해서 파라미터를 받는방법 말고 @PathVariable 어노테이션을 이용해서

URI 에 아이디나 이름 등을 포함되도록 URL을 구성하여 Controller 로 넘긴다.


사용예)

@Controller

@RequestMapping("/game/users/{userId}")

public class CharaterInfoController {

@RequestMapping("/characters/{characterId}") {

public String characterInfo(@PathVariable String userId,

@PathVariable String characterId, ModelMap model) {

model.addAttribute("userId", userId);

model.addAttribute("characterId", characterId);

return "game/character/info";

}

}

}




[부록]_ @RequestMapping 어노테이션은 Ant 스타일의 패턴을 지원한다.

따라서. 다음과 같이 경로명에 "*" 나 "**"를 값으로 사용할 수 있다.


@RequestMapping("/members/*.do")

public String memberInfo(...) {

...

}


@RequestMapping("/game/*/items/{itemId}")

public String itemInfo(...) {

...

}

- ?   : 1개의 문자와 매칭

- *   : 0개 이상의 문자와 매칭

- ** : 0개 이상의 디렉터리와 매칭


@ModelAttribute 어노테이션을 이용하면 다음 두 가지 작업을 수행할 수 있다.

- 1. @RequestMapping 어노테이션 없는 메서드로 모델에 추가될 객체 생성

@ModelAttribute 어노테이션 메서드에 적용하면 해당 메서드가 생성한 객체가 뷰에 전달된다.

따라서, @ModelAttribute 어노테이션을 사용하면 두 개 이상의 요청처리 메서드에서 공동으로

사용되는 모델 객체를 생성할 수 있다.

(쉽게 Controller 에서 해당 @RequestMapping value 값과 상관없이 @ModelAttribute 어노테이션 메서드 실행 후

뷰 페이지로 객체럴 넘겨준다란 뜻 - 그럼 @RequestMapping 선언 메서드의 객체와 @ModelAttribute 메서드의

객체 두개 모두 뷰에 전달된다)


- Client 에서 /serach/main.do 요청이 오면 GameSearchController 의

main() 메서드만 실행이 되는게 아니라 @ModelAttribute 어테이션 선언된 메서드도 실행 후

생성된 객체가 함께 뷰로 전달된다.



- 2. 커맨트 객체의 초기화 작업 수행(작업순 : @ModelAttribute -> @RequestMapping 메서드)

@ModelAttribute 어노테이션이 적용된 메서드가 @RequestMapping 어노테이션 적용된 메서드 보다 먼저 실행되기 때문에, 커맨드 객체에 대한 초기화 작업이 필요하다면 커맨드 객체와 동일한 이름을 같는 @ModelAttribute 어노테이션을 적용된 메서드를 이용하여 초기화 작업을 수행시킨다.




PS> @ModelAttribute 어노테이션은 Controller 에서 @RequestMapping 메서드의 참소변수 Bean 객체의 Return 명?

쉽게말해 뷰에 건너줄 커맨드객체의 명칭을 임의로 바꿀때도 사용이 된다. 이건 알고 있어야징


 - 인코딩 처리필터 클래스명 : org.springframework.web.filter.CharacterEncodingFilter


요청 파라미터 캐릭터 인코딩이 'ISO-8859-1'이 아닌 경우

request.setCharacterEncoding("UTF-8");

메서드를 사용해서 요청 파라미터의 캐릭터 인코등을 설정해 주어야 한다.


모든 Controller 에서 위 코드를 실행할 수도 있지만 번거롭다.

이러면 스프링을 쓰는 이유가 없지 않겠는가?


스프링은 요청 파라미터의 캐릭터 인코딩을 설정할 수 있는  필터 클래스인 CharacterEncodingFilter 제공하고

있다. 다음과 같이 Web.xml 파일에 CharacterEncodingFilter 클래스를 설정함으로써

요청 파라미터의 캐릭터 인코딩을 손쉽게 설정할 수 있다.



특정 Bean의 기능 수행을 위해 다른 Bean을 참조해야 하는 경우 사용하는 Annotation으로는 @Autowired, @Resource 그리고 @Inject가 있다.

  • @Autowired
    Spring Framework에서 지원하는 Dependency 정의 용도의 Annotation으로, Spring Framework에 종속적이긴 하지만 정밀한 Dependency Injection이 필요한 경우에 유용하다.

의존관계를 자동으로 설정해주는 어노테이션

: 타입을 이용하여 의존객체를 자동으로 설정한다.

: 생성자, 필드, 메서드 세곳에 적용 가능하다.

 

예) 프로퍼티 설정 메서드 이용

import org.springframework.beans.factory.annotation.Required

public class TestBean {

    private TestDao testDao;

 

    @Autowired

    public void setTestDao(TestDao testDao) {

        this.testDao = testDao;

    }

}

위와 같은 경우 testDao프로퍼티에 TestDao 타입의 bean객체를 전달한다.

AutowiredAnnotationBeanPostProcessor 클래스를 설정파일에 빈객체로 등록하면 @Autowired 어노테이션을 이용한 자동설정이 적용된다.

 

또한 Required어노테이션과 마찬가지로 <context:annotation-config>태그를 사용하면 된다.

@Autowired 어노테이션은 프로퍼티 설정 메서드 뿐 아니라 일반 메서드나 멤퍼필드 자체에 적용시킬수도 있다.

제너릭이 적용된 컬렉션 타입에도 적용시킬 수 있다.

 

@Autowired 어노테이션은 타입을 이용하여 자동으로 빈객체를 전달하기 때문에 타입에 맞는 객체가 없거나 두개 이상일 경우 예외를 발생시킨다.

 

@Autowired 어노테이션을 적용한 프로퍼티를 반드시 설정할 필요가 없는 경우에는 @Autowired 어노테이션의 required속성 값을 false로 지정한다.

@Autowired(required=false)

 

이렇게 지정된 경우에는 해당 타입에 맞는 빈객체가 존재하지 않는다고 해도 예외를 발생시키지는 않는다.

 

@Qualifier

: 동일한 타입의 빈객체들 중 특정 빈 객체를 자동으로 설정하도록 한다.

: @Autowired 어노테이션과 함께 사용되며 자동 연결될 빈객체의 수식어를 값으로 갖는다.

 

public class TestBean {

    @Autowired

    @Qualifier("main")

    private TestDao testDao;

}

위 코드에서 수식어구는 main 이고

이러한 수식어는 설정파일에서 <qualifer> 태그를 이용하여 설정한다.

 

<bean id="testDao" class="lja.test.TestDao">

    <qualifier value="main"/>

</bean>

  • @Resource
    JSR-250 표준 Annotation으로 Spring Framework 2.5.* 부터 지원하는 Annotation이다. @Resource는 JNDI 리소스(datasource, java messaging service destination or environment entry)와 연관지어 생각할 수 있으며, 특정 Bean이 JNDI 리소스에 대한 Injection을 필요로 하는 경우에는 @Resource를 사용할 것을 권장한다.

  • @Inject
    JSR-330 표준 Annotation으로 Spring 3 부터 지원하는 Annotation이다. 특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다. @Inject를 사용하기 위해서는 클래스 패스 내에 JSR-330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 함에 유의해야 한다.

@Autowired, @Resource, @Inject를 사용할 수 있는 위치는 다음과 같이 약간의 차이가 있으므로 필요에 따라 적절히 사용하면 된다.
  • @Autowired : 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능
  • @Resource : 멤버변수, setter 메소드에 적용가능
  • @Inject : 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능

@Autowired, @Resource, @Inject를 멤버변수에 직접 정의하는 경우 별도 setter 메소드는 정의하지 않아도 된다.

※ spring 3.0 공부 중에 책의 설명을 보면 @Autowired @Resource 두개 모두 내가보기엔 똑같은 연결을 한다.(내 생각일뿐...)
    이해가 안되서 인터넷 뒤져서 설명을 찾긴 했는데... 그래도 큰 차이점을 모르겠다. 그냥 일반메소드에는 @Resource 가
    적용이 안된다는 점정도? 아직 부족한가보다...


- 어노테이션별 BeanPostProcessor

1. RequiredAnnotationBeanPostProcessor : @Required 어노테이션처리

2. AutowiredAnnotationBeanPostProcessor : @Autowired 어노테이션처리

3. CommonAnnotationBeanPostProcessor : @Resource, @PostConstruct, @PreDestroy 어노테이션처리

4. ConfigurationClassPostProcessor : @Configuration 어노테이션처리


※ 특별히 특정 기능을 사용하지 않아야 하는 경우가 아니라면 <context:annotation-config> 태그를 사용하는 것이 설정

파일을 단순하여 만들어준다.

+ Recent posts