[강의필기] spring

이클립스 마켓 플레이스에서

sts 검색

루나용 sts설치 ㄱㄱ

 

메이븐과 그래드를 쓸 수 있다

 

아파지 메이픈 여러 개발자들이 개발 환경을 맞출때 각각 다르므로 또 다운 받는곳이 다름 버전이 안맞는 문제 그래서 그걸 맞추는게 메이븐 서버가서 안받아도 되고 구성 맞출 수 있고 하지만 이거 꼭 안써도 보통 svn으로 공유해서 쓰기때문에 딱히 문제는 없음 걍 이런것도 있다정도

메이븐은 프로젝트 오브젝트 모델이 있어야 프로젝가 만들어지면서 해당 서버에 가서 파이릉ㄹ 동적으로 다운 받는다. 자르 파일 안받아도 됨

현재 4.01이 나와있음

 

다운 받고 싶으면 해당 유알엘로 들어가면 되고

 

우린 메이븐써서 다운 받아볼꺼임

 

 

기존의 프로젝트를

스프링 프로젝트로 바꾸는 법

오른쪽 spring tools - add spring project nature

 

해제는 마찬가지 탭에서 리무브

 

http://projects.spring.io/spring-framework/#quick-start

 

*Spring Framework

- Road Johnson이 EJB없이 업무로직 개발하기에서 부터 시작

 

Enterprise Java Beans : 업무를 모듈로 개발하여 분해 또는 재조립이 편하게 만드는 기술(재조립이 편하다는ㄴ건 재사용또한 편하다는 의미 ㅇㅇ). 무겁다(느리다), 안정적이다. DB를 붙이는 일과 그렇지 않은 일을 구분하여 SessionBean(DBX), EntityBean(DBO), MessageDriverBean등의 업무 환경에 맞는 개발을 하도록 지원한다. EJB를 서비스하기 위해서는 WAS가 필요하다. 즉 EJB server가 필요(비용 발생)하다.

EJB로 개발하려면 서버의 기술 비용도 필요함 부가적인 비용이 크다. 따라서 나온게 스프링

 

- SpringFramework.org.에서 다운받을 수 있다.

- 경량의 프레임워크(빠르다)

- 스프링을 돌리기 위한 서버가 필요 없다. 

- 분산환경을 구축할수없다.(web으로 해결할 수 있다.0)

- 확장성이 좋다. => 다른 기술(Framework)과 연동이 편하다.

 

 

* 구조

DI(Dependuncy Injection)

-  의존성 존입을 다른 객체에서 해주기 때문에 유연성이 좋아진다.

 

* AOP(Aspect Onented  Pragraming)

- 관점지향 프로그래밍(횡단 관심사)

 

* JDBC

 

* ORM(Object Relation Mapping)

iBATIS(myBATIS), Hibernate 연동

 

* Context - JNDI 사용

 

* Web - Web Framework과 연동

 

*  MVC 

 

- MVC pattern 을 적용하여 사용

 

 

* Spring을 기반으로 한 FrameWork 이 많이 나와있다. 

 

     - 국가 표준 프레임웍, AnyFrameWork...

 

  * DI(Dependuncy Injection) 객체관의 유연성을 높이기 우해서

- Spring IOC(Inversion of control) : 제어의 역행

- 객체간의 관계를 객체외부에서 설정하는것

- 약결합을 구현하여 객체간의 유연성을 높이기 위해서

(강결합보다 약결합이 좋음. 강결합은 분리하기가 어렵다. 약결합은 모듈로 만들어놓고 끼워넣기가 편함.)

자바의 꽃은 인터페이스이다. 객체간의 '유연성'을 높이기 위해 . 인터페이스는 내 자식이 일해야할 구성을 정의해줄 수 있다. 여러 자식을 하나로 묶어 쓸 수 있다. 짱편함. 객체도 아닌것이 객체 흉내를 낼 수 있고 간결하게 만들 수 있다.자바에서 제공하는 기능과 상속개념도 사용 가능하며 강제성을 부여할 수 있다. 강제성(ex 지문찍는거 생각해봐라 지문은 꼭 찍어야만 하지만 어느손가락으로 하던지 상관은 없다. 졸라 유연함.)

 

약결합의 클래스 다이어그램

 

 

업무를 보는데 디비를 쓸 일이 생겼다. 자 그러면 디비가 여럿이 있을 수 있음. 그러면 DAO추상클래스를 만들고 그 안에 insert(xxxVO), select() : list 등등의 일의 목록을 정의해 놓는다. 그리고 그 클래스의 자식클래스를 만든다. 오라클 디비를 사용하는 애는 OracleDAO클래스라고 만들고 DAO추상클래스를 상속한다. 상속받는 자식 클래스는 Override해주어야하는데 각각에 맞게 처리해 주면 된다.

업무는 Service로 처리해준다. 예를 들어 add(xxxVO : int, search(): List<xxxVO> 등을 정의해 놓는다. 근데 생각해봐라. A은행의 행원과 B은행의 행원의 하는일은 같지 않은가? 근데 세부적으로 전부다 똑같은가? 그것은 아마 같은수도 있고 다를 수도 있을 것이다. 예를 들어 A은행은 행원이 도장찍고 날리지만 B는 대리에게 넘겨서 입금완료가 될 수도 있다는 이야기다. 따라서 Service에는 할 일의 정의만 추상클래스로 정의하고 xxService클래스를 생성 Service클래스를 상속하여 Override하여 기술한다.

이때 업무에서 디비를 쓸때 자식클래스를 가지게되면 강결합이된다. 부모를 가지면 약결합이 된다. 따라서 부모 클래스를 is a관계로 가지면 생성자의존성주의가 된다.

조립하는 클래스인 Assembly클래스 안에는 getBean(): Service. getBean 안에서 무슨 일이 일어나냐하면 DAO를 가진다. 의존성주입할 애를 생성하여(자식클래스) 서비스 객체를 생성하면서 DAO를 가지니까 매개변수로 넣어주고 해당 서비스를 반환한다. 리턴된 서비스는 해당 DAO를 가지고 작업한 서비스가 될 것이다.

근데 

Run클래스는 실행할 수있는 매서드를 가지게된다. main같은거

잘만들수록 분리결합이 쉬워짐

프레임워크가 좋아도 개발자가 만드는 방법인 패턴을 알아야함.

 

 

월요일날 컨테이너랑 설정용 xml만드는거랑 beans에 bean을 만들어서 의존성DAO쓰는방법도 할거다. 5,6,7 삼일 남았는데 DI랑 MVC두가지 할꺼임.

 

 

 

 

 

 

0105

*Spring Container

- 설정정보파일(applicationContext.xml)을 읽어들여 객체 생성, 사용, 소멸시키는 생명주기를 관리하는 클래스들

- Spring Container가 관리하는 객체들을 Bean이라고 부른다.

- Container 들

BeanFactory : 의존성 주입, 빈의 life cycle을 관리한다.

ApplicationContext : 의존성 주입, 빈의 life cycle을 관리한다. 추상화, 파일관리, 국제화 등을 지원

WebApplicationContext : 의존성 주입, 빈의 life cycle을 관리한다. 추상화, 파일관리, 국제화 등을 지원. Web Application 사용

 

- 사용법)

1. 설정용 xml생성

<beans>

<bean id="객체명" class="객체화할 클래스" scope="singleton : 객체를 하나만 생성할 때/prototype : 객체를 여러개 만들 때/(request/session : Web ApplicationContext에서만 사용 가능)">

-> Spring Container가 객체화할 클래스

- 의존성 주입(생성자 의존성 주입)

<bean id="" class="" scope="">

<constructer-arg ref="의존성 주입할 객체의 id"/>

</bean>

id : Container가 의존성 주입을 하거나 getBean() method로 찾아서 사용할 class의 식별자

 

2. Container의 생성

ApplicationContext ac = new ClassPathXmlApplicationContext(설정용 xml);

 

3. Bean을 꺼내와서 서비스를 사용

서비스클래스 객체명 = ac.getBean(id); <- 스프링 2.5까지는 id만 사용, 3.0부터는 reflect가 지원된다. 클래스명을 바로 넣을 수 있다. 예를들어 (Test.class)

객체명.method();

 

 

 

 

 

0106

 

* method 의존성 주입

 

class Test{

- 기본 생성자 - 

 

public void setDao(Dao dao){

this.dao = dao;

}

}

 

위의 클래스를 사용하기 위해서는

 

<bean id="id명" class="00">

<property name="set을 제외한 method명" ref="추가할 id"/>

</bean>

을 사용한다.

 

위에 setDao를 사용한다고 가정하면

<bean id="id명" class="00">

<property name="dao" ref="추가할 id"/>

</bean>

 

* Spring MVC

- MVC pattern을 미리 구현해 놓은 것.

- Controller 역할은 DispatcherServlet이 수행하고

- 일반 클래스가 @Controller anontation을 가지면 Action이 하던일을 처리하게 된다.

- method 하나가 (요청 URL 하나 : @RequestMapping(value="url", method=RequestMethod.GET|POST) )를 처리하게 된다.

- method의 매개변수는 parameter를 처리할 목적으로 만든다.

<form action="a.do">

<input type="text" name="id"/>

</form>

 

@Controller

class Test{

@RequestMapping(value="a.do", method=RequestMethod.GET)

public String method(String id){

// 파라메터명이 같다면 매개변수에 들어간다.

return "응답할 jsp명";

}

- 서비스에서 처리된 결과를 jsp로 보내기 위해서 (forward)로 보낸다. Model, ModelAndView객체가 사용된다.

Model은 method에서 parameter로 받으면 된다. 인터페이스지만 객체화해서 사용하지는 않는다.

즉 public String test(Model m){ m.addObject("이름", 값); }받으면 되고 jsp에서는 request.getParameter("이름");으로 받아서 사용한다. Object이므로 캐스팅해서 사용한다. 겁나어렵네잉 ㅇㅅㅇ

 

프레임워크는 설정하는것과 어떻게 뽑아서 쓰는지가 어렵게 느껴짐 다 배운거니까 겁내지 말고 고고

 

 

* 동작 (01/06노트 그림 참고)

* DispatcherServlet : 모든 요청 받기

 

* HandlerMapping

: 요청 URL을 분석하여 처리할 수 있는 method가 있는지 판단하여 해당 Controller이름을 반한 하는 일

 

* Controller

: parameter의 처리, 유효성 검증, service 객체 사용, 응답할 페이지 설정

 

*viewResolver

: view를 하는 jsp가 있는지 판단하고, jsp의 이름을 반환한다.

 

 

 

 

 

0107

 

* parameter 처리

- HTML Form Control의 이름과 @RequestMapping 아래에 선언된 method parameter의 이름이 같으면 자동으로 처리된다.

- Control이 여러개인 경우 VO를 선언하여 처리한다.

 

* view로 데이터 전달

Model interface 사용

@RequestMapping

public String method(Model m){

m.addAttribute("이름", 값);

return "view이름";

}

 

jsp에서는 ${ 이름 }을 사용하여 써준다.

 

* filter를 사용한 한글처리

필터 : 실제 일을 하는 클래스를 건드리지 않고 업무를 추가할 때 사용한다.

- web.xml에 등록하여 사용한다.

-  org.Springframework.web.filter.characterEncodingFilter클래스 사용

 

 

* 사용법(web.xml 등록)

<filter>

<filter-name>이름</filter-name>

<filter-class>org.springframework.web.filter.charaterEncodingFilter</filter-class>

</filter> -> 요기까진 filter 클래스 등록

<filter-mapping>

<filter-name>이름</filter-name>

<url-mapping>동작할 경로</url-mapping>

</filter-mapping>