일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 버블소트
- 오름차순정렬
- Spring
- 자바알고리즘
- 버블정렬
- 자바
- MVC
- GUI
- 이클립스 #이클립스단축키 #자바 #자바단축키
- Java
- 스프링
- 계산기GUI
- 자바 계산기
- 계산기
- 자바GUI
- 알고리즘
- Eclipse
- 내림차순정렬
- 배열정렬
- annotation
- 이클립스
- 어노테이션
- Swing
- 숫자정렬
- 자바 #java #이클립스 #eclipse #switch #switch문 #사칙연산 #계산기 #calculator #간단한계산기
- Today
- Total
온 코딩
[Spring](간단한게시판) 기본 구조 및 .xml 준비 본문
!Spring 사용을 위해서는 lib에 spring.jar파일들이 필요함
1. DispatcherServlet
: 스프링에서 제공 됨
: 모든 요청사항을 전달받는 객체
: web.xml에 등록을 할 예정 => 별도의 class 파일 필요 없음
2. HandlerMapping
: 스프링에서 제공 됨
: 모든 요청사항에 관련된 Controller 반환
: board-servlet.xml // 직접 만들어야함
3. ~~~~Controller
: 개발자가 생성
: Controller 관련 클래스를 상속 또는 구현 받음
4. 데이터베이스 접근
: xml 문서를 이요
: Context.xml //직접 만들어야 함 (META-INF폴더 안)
: Connection 객체들을 여러개 미리 생성 => pool에 담아두기
5. DAO/DTO
: 개발자가 생성
6. 웹 브라우저 응답 파일
: .html / .jsp
web.xml
- 애플리케이션 구동 시 가장 먼저 읽는 문서이기 때문에 오타/오류 등이 있으면 404오류(구동불가)
1. 서블릿 등록하기
<servlet>
<servlet-name>서블릿 이름1</servlet-name>
<servlet-class>Servlet Class Location and Class Name</servlet-class>
</servlet>
<servlet>
<servlet-name>서블릿 이름2</servlet-name>
<servlet-class>Servlet Class Location and Class Name</servlet-class>
</servlet>
-> 서블릿을 여러개 쓸 경우 이름을 달리 함
2. 서블릿 요청
<servlet-mapping>
<servlet-name>서블릿 이름1</servlet-name>
<url-pattern>웹 주소줄을 통하여 요청</url-pattern>
</servlet-mapping>
=>url-pattern에 요청사항이 있을 경우 servlet-name을 가져옴
+ 404 오류가 나서 xml문서 확인하는 경우
: 가장 먼저 welcom-file 확인해서 경로 지정이 잘 되어 있는지 보기
: <servlet-mapping> 에 <url-pattern>에 요청사항 확인 / 서블릿이름 확인(맵핑이 잘 되어 있는지)
예시
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>spring_simple_board</display-name>
<!-- DispatcherServlet 등록 -->
<servlet>
<servlet-name>board</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<!-- 요청사항에 따른 서블릿 클래스 찾기 -->
<servlet-mapping>
<servlet-name>board</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- .do로 끝나는 모든 요청사항 처리 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
board-servlet.xml
- HandlerMapping 역할을 담당하는 xml문서
- DB 접속 / DAO 객체 선언
- 페이지이동을 위한 컨트롤러
- 그 외 컨트롤러
- viewResolver 선언
- 전체를 감싸는 태그
<beans xmlns="http://www.springframework.org/schema/beans"
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.xsd">
</beans>
- 작업에 필요한 객체 생성 및 클래스 등록은 빈즈 사이에 넣기
<bean></bean>
- 가장 먼저 핸들러맵핑 등록
- ViewResolver도 반드시 등록
- 그 외의 컨트롤러는 반드시 해당 클래스를 만든 후 등록 / xml 문서에 미리 설정하면 안됨
- 클래스 등록방법
1) 해당 xml 문서에서 사용할 클래스(객체)를 등록하는 방법
<bean id="객체명" class= "패키지.클래스" ></bean>
2) 컨트롤러 클래스 등록방법
- 전달받는 데이터가 없을 경우 :
<bean name="요청사항(url)" class="요청사항처리클래스" >
<property name="해당 클래스의 멤버변수명">
<ref bean ="변수에 전달할 값(객체)" />
</property>
</bean>
3) ViewResolver 클래스 등록방법
<bean id ="객체명" class="스프링이 제공하는 InternalResourceViewResolver">
<property name="viewClass" value="스프링이 제공하는 InternalResourceView"></property>
<property name="prefix" value="경로"></property>
<property name="suffix" value="구체적인내용(확장자)"></property>
</bean>
->한글이 아닌 부분 수정 불가능
예시
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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.xsd">
<!-- 요청에 따른 컨트롤러 반환 담당 -->
<bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- viewResolver(위치, 이동할 페이지 지정) -->
<bean id="viewResolover" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Context.xml
META-INF 안에 파일 생성
Context : Application에 대한 환경을 뜻함
JDNI(Java Naming Directory Interface) 방법으로 DB연결
파일 안의 속성 중, name, username, password를 바꿔 DB에 연결 / 그 외는 바꿀 수 없음
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/orcl"
auth="container"
type="javax.sql.DataSource"
username="계정명"
password="계정비밀번호"
driverClassName="oracle.jdbc.driver.OracleDriver"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
url="jdbc:oracle:thin:@loclahost:1521:XE"
maxActive="20"
maxIdle="10">
</Resource>
</Context>
+ 에플리케이션 구동 순서
웹 브라우저 요청 =>
web.xml의 DispatcherServlet =>
board-servlet.xml내의 HandlerMapping에게 전달 =>
HandlerMapping은 요청을 처리할 수 있는 컨트롤러 반환 =>
반환받은 DispatcherServlet은 ~~Controller =>
요청사항 처리 후, 결과 값과 출력 파일명을 ModelAndView 객체로 반환 =>
반환 받은 DispatcherServlet은 ViewResolver 에게 전달 =>
ViewResolver는 해당 파일의 위치와 확장자를 반환 =>
반환 받은 DispatcherServlet은 해당 위치의 파일을 웹브라우저에게 응답 처리!
프로젝트 구조
데이터 저장 VO의 구분
- board.command => BoardCommand.java (글쓰기 / 수정 .. 사용자 입력값 => 컨트롤러에게 전달 전용VO)
- board.dto => BoardDTO (데이터베이스와 컨트롤러 전달 전용 VO)
VO 역할 구분 이유
사용자 입력값은 5개 / 테이블 필드 10 중 사용자 입력값은 5개일 경우 DTO사용시 ==> 10개를 다 만들면 낭비
사용자 입력값을 저장할 VO객체와 데이터베이스 결과값을 저장할 VO객체를 분리하여 사용!
DB 접근 방식
1) JDBC 드라이버를 이용하는 경우 : 접속할 때마다 Connection 객체를 생성 및 해제(재사용 불가)
: 동시 접속자 수가 많을 경우, 퍼포먼스 저하
2) 스프링이 제공하는 DataSource를 이용한 접근 방식
: 미리 Connection 객체를 여러개 생성 후 풀에 담아 놓고 사용
: 사용자가 일을 마치면 해당 Connection 객체를 다시 pool에 반환 , 재사용 가능
: DataSource에 접근하기 위해 JDNI 방식을 씀
- board.dao =>BoardDAO.java
META-INF => Context.xml
: JNDI 방식으로 데이터베이스에 접근하기 위해 만든 xml
BaordDAO.java
- BoardDAO 객체는 웹 애플리케이션 구동 전에 미리 생성되어 각 피요 컨트롤러에 전달 됨
1) BoardDAO 클래스의 맴버변수
: DataSource ds; (Context.xml 문서 참조)
- type="javax.sql.DataSource"
- name="jdbc/orcl" //공장 접근 이름
<=이 이름으로 커넥션에 접근하는 방식이 JNDI 방식(* JNDI : java:comp/env/ name속성값 )
- auth="container" // 공장 관리자
- username=" "
- password=" "
- driverClassName="oracle.jdbc.driver.OracleDriver"
- factory="org.apache.commons.dbcp.BasicDataSourceFactory" //커넥션 공장
- url="jdbc:oracle:thin:@127.0.0.1:1521:XE"
- maxActive="20" // 최대 커넥션
- maxIdle="10" // 여유 커넥션
2) BoardDAO 클래스의 생성자
InitialContext ctv = new InitialContext();
ds = (DataSource)ctv.lookup("java:comp/env/jdbc/orcl");
! Context.xml을 이용하여 커넥션들을 미리 생성
1. 생성자 내에서 Context 생성 : InitialContext 클래스 이용하여 객체 생성 (Context구현 클래스 / 예외처리필요) 2. Context 객체의 lookup()메서드를 이용하여 DataSource객체 얻기
: lookup()메서드는 JNDI방식으로 이름 전달 (Object 타입으로 반환하기 때문에 DataSource로 형변환 필요)
DispatcherServlet
defaultHandlerMapping
- boardDAO 객체 (list.do, write.do...)
viewResolver
- prefix : 화면 출력 파일에 대한 경로
- suffix : 화면 출력 차일에 대한 구체적인 내용(확장자)
비즈니스 로직을 처리하는 각 컨트롤러 board.controller
1. 목록 처리 컨트롤러 - ListActionController implement Controller
2. 쓰기화면 처리 컨트롤러 - ParameterixableViewController(스프링이 제공해줌 - 화면응답만처리)
3. 저장 컨트롤러 - WriteActionController extends AbstractCommandController
- implement Controller
: 브라우저로터 파라미터로 전달 됨
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {{
}
- extends AbstractCommandController
: 브라우저 입력 파라미터명과 해당 값을 VO객체와 자동맵핑 시킨 후 컨트롤러에게 자동으로 전달 됨
@Override
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object command, <====자동맵핑 된 VO객체가 전달되는 매개변수
BindException error) throws Exception {
WEB_INF/board-servlet.xml에 등록하여 자동맵핑!
<property name="commandClass" value="board.command.BoardCommand(자동맵핑VO클래스)"></property>
- ParameterixableViewController 단순히 화면만 응답처리할 경우 사용
: 스프링이 제공
: public ModelAndView handleRequestInternal( )
- viewName속성값을 이용하여 mav 객체를 만들고 mav.setViewName("viewName 속성값") 후 mav 반환
: 등록 시, 반드시 viewName 속성에 어떤 출력화면 파일명만 설정(아래에서는 write.jsp)
<bean name="/writeui.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="write"></property>
<!-- ModelAndView.setViewName("write") return mav 객체-->
</bean>
-----
프로젝트 작업 시
1. web.xml 문서부터 만들고 test
2. servlet.xml 작업 시 defaultHandlerMapping부터 만들기 / DAO 등록(해당 클래스 미리 만들어 놓기)
그 외 컨트롤러 등록 시에도 컨트롤러 클래스(모두 구현이나 상속 받음) 먼저 만들고 등록!
viewResolver는 컨트롤러 아래에 생성 - 컨트롤러 결과에 따른 경로값을 만들기 때문에!
'복습 ARCHIVE > 모델별 프로젝트' 카테고리의 다른 글
[Spring](간단한게시판) 기능 - 글 삭제, 글 수정, 글 검색, 글 상세보기 (0) | 2021.06.11 |
---|---|
[Spring](간단한게시판) DB 연결, 컨트롤러 등록 (0) | 2021.06.10 |
[MVC](온라인쇼핑몰) js 파일 목록 (0) | 2021.06.09 |
[MVC](온라인쇼핑몰) Action모음 및 ActionFactory (0) | 2021.06.09 |
[Spring] 기본 개념 및 구조 (0) | 2021.06.09 |