1. 클라이언트(브라우저)가 서버(WAS)에게 Request를 한다. 2.WAS에서 데이터베이스에게 Request를한다.(Service & DAO) 3. WAS는 UI작업을 해서 클라이언트에게 Response를 http로 준다.
단점
WAS쪽에 때려박다보니 유지보수 측면에서 너무 빡세다.
모델2 방식(MVC 방식) Spring도 그렇고 거의 대부분 이거다.
기본적인 설계 모델
흐름
위와 차이점 1. WAS들어 올때 Controller, Service, DAO를 거친다. 2. Service 모듈화 (기능) 3. DAO->모델->데이터베이스 4. Controller에게 줄때 JSP(view)를 거쳐서 Response해준다.
장점
유지보수 측면에서 좋다.
13-2 스프링 MVC프레임워크 설계구조
가장 중요한 부분이며 암기!!!
설계구조
흐름도
1, DispatcherServlet 이라는 객체가 요청을 클라이언트(브라우저)로 부터 받는다. 2. HandlerMapping에게 던진다. (HandlerMapping이란 녀석은 여러 수많은 컨트롤러에서 가장 적합한 컨트롤러를 매핑해준다) 3. HandlerAdapter 각 컨트롤러의 가장 적합한 메서드를 찾아내고 model를 받아온다. 중략... (Service->DB) 4. ViewResolver (뷰)한테 Model 보낸다. 가장 적합한 JSP를 선택한다. 5. View 응답생성(JSP)
가로챈 정보를 HandlerMapping에게 보내 요청을 처리할 수 있는 Controller를 찾아낸다. 디폴트 전략 : BeanNameUrlHandlerMapping, DefaultAnnotationHandlerMapping
요청을 찾은 컨트롤러에게 보낸다. (컨트롤러 → 개발자 구현 영역)
컨트롤러에서 해당 요청 처리 후 요청을 응답받을 View의 이름을 리턴. 이 이름을 ViewResolver가 먼저 받아 해당하는 View가 있는지 검색
해당 View가 존재한다면 처리결과를 View에 보낸 후 결과를 다시 DispatcherServlet에게 전달. DispatcherServlet은 최종 결과를 클라이언트에게 전송
13-3 DispacherServlet 설정
DispatcherServlet 설정
설명
*web.xml이 생소하다면 JSP, Servlet등의 레퍼런스를 검색해본다. 1. web 어플리케이션의 가장 첫 관문이자. 사거리의 신호등과도 같다. 2. servlet에 DispatcherServlet을 설정해준다. 3. org.springframework.web.servelt.dispacherServlet설정 4. init-param에 스프링 설정파일도 설정해준다. (web.xml이라는 기존 설정에 Dispatcher를 삽입하는 과정)
좌측 그림은 초기화 파라미터에서 스프링 설정 파일을 했냐 안했냐의 따라서 어떻게 컨테이너가 설정되는가에 대한 그림이다.
1. 스프링 설정파일(초기화 파리미터) 경우(일반적인 방법) - 초기화 파라미터에서 지정한 파일(servlet-context.xml)을 이용하여 스프링 컨테이너를 생성 2. 초기화 하지 않은 경우 - appServlet-context.xml을 이용한 스프링 컨테이너를 자동으로 생성
9-1 의존객체 자동 주입이란? 스프링 설정 파일에서 의존 객체를 주입할 때 <constructor-org> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능이다. 구현 방법은 @Autowired와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다.
스프링 컨테이너
방법
@Autowired @Resource
9-2 @Autowired 주입하려는 객체의 타이비 일치하는 객체를 자동으로 주입한다.
@Autowired사용시 주의할 점 생성자에는 Autowired 주는 것은 상관없는데 프로퍼티 또는 메서드에 @Autowired를 줄 때에는 반드시 기본 생성자(디폴트 생성자)를 명시해주고 사용한다. 이유는 간단하다. 다음과 같이 WordDao를 필요로하는 메서드인데 해당 객체가 없으면 의존성 주입이 어렵다.
9-3 @Resource 주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입한다.
싱글톤(Singleton) 스프링 컨테이너에서 생성된 빈 (Bean) 객체의 경우 동일한 타입에 대해서는 기본적으로 한 개만 생성이 되며, getBean() 메소드로 호출될 때 동일한 객체가 반환된다.
Spring
Java
생성
new ClassName(); new ClassName(); new ClassName();
차이점
Spring Container는 처음 생성될 때 객체를 미리 생성한다. 따라서 getBean을 호출1, 호출2에서 각각 호출할 때 같이 "A" 객체를 바라본다.
기존 자바 코드에서 new를 할 때, 각각은 다른 메모리를 사용하여 객체를 생성한다.
프로토타입(ProtoType) 싱글톤 범위와 반대의 개념, 프로토타입의 경우 개발자는 별도로 설정을 해줘야 하는데 스프링 설정 파일에서 빈(Bean) 객체를 정의할 때 scope속성을 명시해 주면 된다. scope="prototype"을 해주면 Spring Container의 객체를 참조하는 것 아닌 새로운 메모리의 객체를 생성하게 끔 해준다. (위의 기존 java처럼, 흔치 않음)
스프링의 핵심인 DI(Depnedency Injection)와 IoC(Inversion of Control)를 제공한다.
spring-aop
AOP구현 기능 제공
spring-jdbc
데이터베이스를 쉽게(적은 양의 코드)다룰 수 있는 기능 제공
spring-tx
스프링에서 제공하는 트랜잭션 관련 기능 제공
spring-webmvc
스프링에서 제공하는 컨트롤러(Controller)와 뷰(view)를 이용한 스프링MVC 구현 기능 제공
스프링 프레임워크에서 제공하는 모듈을 사용하려면, 모듈에 대한 의존설정을 개발 프로젝트에 XML 파일등을 이용해 개발자가 직접 하면된다.
1-3 스프링 컨테이너(IoC)
스프링에서 객체를 생성하고 조립하는 컨테이너(container)로, 컨테이너를 통해 생선된 객체를 빈(Bean)이라고 부른다.
1) 객체생성 및 속성 데이터 작성
2) 스프링 컨테이너에서 객체 생성 및 조립
3) 애플리케이션 구현
필요할 때마다 스프링컨테이너에서 기능을 빼서 쓰는 개념이다.sprin
(2강 개발환경설정)
3-1 프로젝트 생성
groupId와 artifactId
groupId
큰 프로젝트 단위
지하철(1~9호선)
artifactId
세부 프로젝트 단위
1호선, 2호선, 3호선...
3-2 pom.xml 작성
pom.xml
필요한 모듈을 가져오는 기능
3-3 폴더 및 pom.xml 파일의 이해(기본 폴더 디렉토리)
src/main
src/main/java
특별한 것은 없고, 앞으로 만들어지는 자바 파일들이 관리되는 곳이다.
src/main/resource
자원을 관리하는 폴더로 스프링 설정파일(XML) 또는 프로퍼티 파일 등이 관리된다.
src/test
4-1 처음해보는 스프링 프로젝트
java 객체생성 및 Bean 생성
기존 java 객체 생성
//기존 자바 객체생성 (main)
TranspotationWalk transpotationWalk = new TranspotationWalk();
transpotationWalk.move();
//TranspotationWalk
public void move(){
System.out.println("도로로 이동 합니다.");
}
Spring Bean이용 IoC생성
//XML Bean 추가
<bean id="tWalk" class ="testPjt.TranspotationWalk"/>
//main
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");
TranspotationWalk transpotationWalk = ctx.getBean("tWalk",TranspotationWalk.class);
transpotationWalk.move();
ctx.close();
6-1 DI(Dependency Injection) 의존성 주입
배터리 일체형 : 의존성 없음 / 배터리가 떨어지면 새로 구입해야한다.(비효율)
public class ElectronicCarToy{
private Battery battery;
public ElectoincCarToy(){
battery=new NormalBattery();//객체 생성될때 new해준다.
}
}
배터리 분리형1 : 초기에는 배터리X, 사용자가 넣어줘야함(의존성 주입)
public class ElectronicCarToy{
private Battery battery;
public ElectoincCarToy(){
}
//setter
public void setBattery(Battery battery){
this.battery = battert;
}
}
배터리 분리형2 : 초기에 배터리O, 사용자가 배터리 교체(의존성 주입)
public class ElectronicCarToy{
private Battery battery;
//생성자
public ElectoincCarToy(){
this.batter=battery;
}
//setter
public void setBattery(Battery battery){
this.battery = battert;
}
}
같은 DB 사용하기(DAO 의존성 주입)
public StudentAssbler(){
studentDAO = new StudentDAO(); //DAO 생성=DB
registerService = new registerService(studentDAO);
modifyService = new ModifyService(studentDAO);
deleteService = new DeleteService(studentDAO);
selectService = new SelectService(studentDAO);
allSelectService = new AllSelectService(studentDAO);
}
studentDAO를 각각의 객체에 주입함으로써 같은 DB를 공유한다. 만약 각각의 객체에서 studentDAO를 생성했다면 각각 다른 DB를 사용하는 것이다.
상기 코드를 Spring ApplicationContext화 하겠다. IoC(제어의 역전) 사용하기
//applcationContext.xml
//studentDao Bean 생성
<bean id ="studentDao" class="ems.member.dao.StudentDao"> </bean>
//의존성 주입
<bean id ="registerService" class="ems.member.service.StudentRegisterService">
<constructor-arg ref="studentDao"> </constructor-arg>
</bean>
.
.
.
7강 다양한 의존 객체 주입
스프링의 의존 객체를 주입하는 다양한 방법
java
spring
비고
7-1 생성자를 이용한 의존 객체 주입
1) 네이밍이 중요하다 첫 글자는 무조건 소문자이다.
7-2 setter를 이용한 의존 객체 주입
1) 첫 글자는 소문자 2) setter의 set을 제외시킨다. 3) 보통 db연동에서 많이 쓰인다.(초기화)