Spring 애플리케이션 : 구동
Spring 애플리케이션 : 구동
1. WEB_INF (웹 애플리케이션 정보 폴더 : 톰캣이 자동인식)
2. WEB_INF => web.xml 읽기
3. WEB_INF => <servlet>, <servlet-mapping>, <welcome-file-list> 설정 확인
<servlet> 내의 <servlet-class> 에서 가장 오류가 많이 발생..
이유: org.springframework.web.servlet.DispatcherServlet
만약: WEB_INF => lib => spring.jar, spring-sebmvc.jar 가 없을경우 DispatcherServlet 생성 불가 => 따라서 404 오류
만약: WEB_INF => lib => spring.jar, spring-sebmvc.jar 존재하지만, 패키지 구조 오타가 나도 DispatcherServlet 생성 불가
<servlet><servlet-name>board</servlet-name>~~~</servlet>
만약: WEB_INF => board-servlet.xml 의 파일명이 다를 경우 HandlerMapping 불가
파일명이 다를경우: <servlet-name>board</servlet-name>
b-servlet.xml
board.xml
오류: HandlerMapping 불가
VO 역할 구분 이유:
사용자 입력값은 5개 / 테이블의 필드 10개중 사용자 입력 값은 5개, 기본값 설정이 되어있는 필드 5개일 경우
기존 VO는 테이블의 전체 필드에 대한 멤버변수를 선언. 그에 대한 getter/setter 가 필요
동시 접속자가 100,000일 경우 불필요한 5개 변수에 대한 메모리가 낭비!!
따라서 사용자 입력값을 저장할 VO 객체와
데이터베이스의 결과 값을 저장한 VO 객체를 분리하여 사용!!
1. JDBC 드라이버를 이용 : 접속할 때마다 Connection 객체를 생성 및 해제...
따라서 동시 접속자가 많을 경우, 퍼포먼스가 저하된다!!
2. 스프링이 제공하는 DataSource 를 이용한 접근 방식 : 미리 Connection 객체를 여러개 생성 후, 풀에 담아 놓고 사용
예) 100명이 접속할 경우,
JDBC 드라이버 : 100번 요청이 있으면 Connection객체를 100번 생성.. 이후 재활용 불가!
DataSource : 미리 100개를 생성해두고, 1000명이 요청 시, 이미 만들어놓은걸 내보내주기만 하면 됨!
사용자가 일을 마치면 해당 Connection 객체를 다시 pool에 반환.. (재사용 가능)
자동으로 관리해준다..(Connection 객체를 꺼내고/반환)
멤버변수: DataSource ds;
DAO 클래스의 생성자 : Context.xml를 이용하여 커넥션들을 미리 생성..
생성자 내에서
1. Context 생성 : InitialContext 클래스를 이용하여 객체 생성
InitialContext는 Context인터페이스를 구현받은 클래스
2. Context객체의 lookup() 메서드를 이용하여 DataSource 객체얻기..
lookup()메서드에게는 JNDI 방식 이름을 전달
lookup()메서드는 Object 타입으로 반환하기 때문에 DataSource 타입으로 형변환 필요!!
BoardDAO 객체는 웹 애플리케이션 구동 전에 미리 생성되어 각 필요 컨트롤러에게 전달되기 때문..
web.xml 실행순서
WEB_INF => web.xml 시작
=> board-servlet 시작 => <bean id="defaultHandlerMapping" ~~/>
=> <bean id="boardDAO" class="board.dao.BoardDAO"/>
=>BoardDAO의 생성자 => Context.xml
=> <bean name="/list.do"~~
=> <bean name="/writeui.do"~~
=> <bean name="/write.do"~~
=> <bean id="viewResolver"~~
=> board-servlet.xml 종료
=> web.xml 종료
=> 웹 애플리케이션 구동 완료
웹 애플리케이션 구동 완료 후
DispatcherServlet defaultHandlerMapping boardDAO
- /list.do 처리 컨트롤러 객체 <=boardDAO 객체전달
- /writeui.do 처리 컨트롤러 객체
- /write.do 처리 컨트롤러 객체 <=boardDAO 객체전달
viewResolver
- prefix = 화면출력 파일에 대한 경로
- suffix = 화면출력 파일에 대한 구체적인 내용 (즉, 확장자)
비지니스 로직을 처리하는 각 컨트롤러
- 목록 처리 컨트롤러 : ListActionController
- 쓰기화면 처리 컨트롤러 : 스프링이 제공하는 ParameterizableViewController (화면만 응답처리 할 경우)
- 저장 처리 컨트롤러 : WriteActionController extends AbstractCommandController
- 상세보기 컨트롤러 구현 : RetrieveActionController implements Controller
<bean name="/retrieve.do" class="board.controller.RetrieveActionController"> <property name="dao"> <ref bean="boardDAO"/> </property> </bean>
- 수정 컨트롤러 구현 : UpdateActionController extends AbstractCommandController
- AbstractCommandController 가 가지고 있는 객체
- Request 요청객체
- Response 응답객체
- Object 입력받은 값을 저장하는 객체
- BindException 사용자로부터 값을 입력시 에러가 발생하면 처리해주는 class
<bean name="/update.do" class="board.controller.UpdateActionController"> <property name="dao"> <ref bean="boardDAO"/> </property> <property name="commandClass" value="board.command.BoardCommand"/> </bean>
- AbstractCommandController 가 가지고 있는 객체
- 삭제 컨트롤러 구현 : DeleteActionController implements Controller
-
<bean name="/delete.do" class="board.controller.DeleteActionController"> <property name="dao"> <ref bean="boardDAO"/> </property> </bean>
-