JSP -> Model2 MVC -> Spring Framework 3단계 게시판 만들기.

2013. 8. 4. 15:46Java/Spring Framework

 jsp을 이용한 게시판 구성이나, 혹은 POJO 형태는 많이 진행해본 이력은 있으나, ibatis, Spring 등을 사용해본 이력이 없어서, 우선 책으로 공부하기 앞아서, 게시판 하나 정도는 인터넷에 떠돌아 다니는 강좌 같은것 있으면 참 좋겠다 라고 해서

여기 저기 뒤져보던 중에 아주 대단한 강좌를 찾아 냈다. ^^

 

그 분이 진행한 Board 게시판을 그대로 복사해 오는 것은 아니고, 링크를 걸어두는 것이 좋을 것 같다.

회사와 집에서 동일하지 않는 환경 내에서도 한번씩 진행했는데, 문제되는 사항은 거의 없었다.

 

 

1단계 JSP 게시판

 

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.1 - 게시판도 HTML부터] 게시글 리스트

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.2 - 게시판도 HTML부터] 글입력폼

2012/06/13 - [Lecture/Javascript-기초] - [본격 게시판짜기 Part1.3 - Dom 맛보기 ] 글입력폼 검사

2012/06/13 - [Lecture/Jsp] - [본격 게시판짜기 Part1.4 - HTML-> JSP] form 파라미터 받기

2012/06/26 - [Lecture/SQL / Oracle] - [본격 게시판짜기 Part1.5 JSP > Oracle] 게시판 DB 테이블 생성

2012/06/26 - [Lecture/Jsp] - [본격 게시판짜기 Part1.6 Oracle > JSP] Database 접속 및 Select

2012/07/05 - [Lecture/Jsp] - [본격 게시판짜기 Part1.7 JSP, SQLDeveloper] 게시글 입력 및 리스트조회기능

2012/07/08 - [Lecture/Jsp] - [본격 게시판짜기 Part1.8 JSP 게시글 조회] 게시글 조회기능 및 게시글 삭제

 

2단계 MVC Model 2 게시판

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.1 Model2 MVC패턴] 뷰(View) 코드 분리

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.2 Model2 MVC패턴] Entity Beans의 사용

2012/07/12 - [Lecture/Jsp] - [본격 게시판짜기 Part2.3 Model2 MVC패턴] Controller구성

2012/07/13 - [Lecture/Jsp] - [본격 게시판짜기 Part2.4 Model2 MVC패턴] Model 구성

2012/07/16 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.5 Model2 MVC패턴] Model 구성2 - i-batis의 사용

2012/07/17 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.6 Model2 MVC패턴] Model 구성2 - i-batis의 사용2

2012/07/21 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.7 Model2 MVC패턴] i-batis의 queryForList 활용 Paging기능구현

2012/07/22 - [Lecture/Jsp] - [본격 게시판짜기 Part2.8 Model2 MVC패턴] count기능추가

2012/07/28 - [Lecture/Jsp] - [본격 게시판짜기 Part2.9 Model2 MVC패턴] 파일업로드 기능추가

2012/07/28 - [Lecture/Jsp] - [본격 게시판짜기 Part2.10 Model2 MVC패턴] 파일다운로드/삭제 기능추가

 

 

1.    Board 라고 POJO 형태의 객체 생성
DB Table
구조와 동일하게 만든다.

2.    Web.xml 상에서 servlet ControllerAction 에 대한 위치와 url 패턴에 대한 매핑을 한다.

3.    ControllerAction 에서는
HTTPServlet
를 상속받아서, 실제 post,get 으로 들어오는 정보를 미리 낚아채서,
Command properties
에 매칭된 URL에 맞는 Action이 미리 Map value에 맞게 이동시킨다
.
다시말해 그 값에는 Action 클래스들의 경로가 지정되어 있다.

4.     Action들은 CommandAction 인터페이스를 구현하도록 되어 있는데, 이것은 결국 HttpServlet에서 반드시 실행해야 하는 부분을 꼭 구현하도록 강제한것이다.

5.    Action 내부에서는 DAO에 대한 DB 연결과 더불어 쿼리 실행 등의 로직이 들어 있다.

6.    BoardDao CommonDAO를 상속받았고, CommonDao SqlMapClient 라는 객체를 set,get 할수도록 했다.

7.    ibatisDBConnector 도 결국 getSqlMapInstance 로 구현해 놓은 것을 보니 싱글턴으로 구현해 놓은듯 싶다. 그리고 이것은 resource(SqlMapConfig.xml) 에서 정보를 읽어와서 구현

8.    복잡하게 구현된듯 싶으나, 결국 DB 연결하고, pool도 주고, jdbc 연결하는것 은 같고,
쿼리도 미리 구현해 놓은 것을 사용한다.

9.    다시 그 Action Class로 돌아가서 , 액션을 마무리 되면, 이동하는 View jsp String 값을 리턴해주면, Dispatcher가 그값을 받아서 그 해당 URL forward 해주면 끝이다.

 

3단계 Spring Framework

2012/07/31 - [Lecture/Jsp] - [본격 게시판짜기 Part3.1 Spring MVC] Ajax란?

2012/08/28 - [Lecture/Jsp] - [본격 게시판짜기 Part3.2 Spring MVC] lightbox 적용하기

2012/09/22 - [Lecture/Spring] - [본격 게시판짜기 Part3.3 Spring MVC] Spring MVC 개요 및 설정하기

2012/09/22 - [Lecture/Spring] - [본격 게시판짜기 Part3.4 Spring MVC] Spring MVC 개요 및 설정하기2

2012/10/13 - [Lecture/Spring] - [본격 게시판짜기 Part3.5 Spring MVC] SqlMapClientDaoSupport활용, Model 변경하기

2012/10/29 - [Lecture/Spring] - [본격 게시판짜기 Part3.6 Spring MVC] multipartResolver를 활용한 파일업로드 변경하기

2012/10/29 - [Lecture/Spring] - [본격 게시판짜기 Part3.7 Spring MVC] JSON 요청이란?

2012/10/29 - [본격 게시판짜기 Part3.8 Spring MVC] rest-ful 서비스에서 정적 자원 사용  

 

 

 

  

Spring 설정!

1.    Web.xml 상에서
1) contentConfigLocation
이라고 해서  dataSource.xml 만들어서 설정을 하라는군요
2) Listener
도 프레임워크에서 제공한걸로 세팅합니다.
3)
여기부터는 spring 설정 파일이랍니다
.
ControllerAction
을 직접 만들어 넣었다면, 이제는… dispatcher 라는 스프링 프레임워크에서 제공하는 것을 사용하랍니다. .. 글데.. dispatcher-servlet.xml 이라고 만들어서 설정을 넣으라네요
.
4)
초기에 ControllerAction에다가 매핑을 시켰다면, 이제는 이역활을 dispatcher가 하는거죠
.
url-pattern
은 좀 다르게 갑니다. *.do 에서 /
.
5)Encoding
세팅까지 완료!

2.    dataSource.xml
1) xml
상에서 beans 으로 생성하는 모양새 입니다. 하지만 속성값이 넘 길어;;;
  dataSource.xml
은 이전에 제작한 SqlMapConfig.properties 파일을 대신해주는 역할
.
2) DataSource
bean 태그를 만들고 그 속성값에 DB 계정정보를 넣습니다
.
3)
트랜잭션 매니저 정보도 세팅합니다. 위에 DataSource를 연결했네요
.
4) ibatis Sql map Config
도 세팅합니다. 실제 config 파일은 sqlMapConfig.xml 로 별도로 빼주네요.

3.    sqlMapConfig.xml
1) Board.xml
은 기존 그대로 사용할것이고, sqlMap 에 대한 링크만 걸어주는 어처구니군요.

4.    dispatcher-servlet.xml
1)
스프링 설정의 핵심이라고 합니다.
2)
이설정을 읽기 전에, URL 부분은 깔끔한 URL을 사용하여 요청하는 RESTful 서비스를 사용하며, 어노테이션 기반의 빈등록으로 mapping 정보를 담고.. 별도 xml 파일을 구성하지 않습니다.또한 json 이나 xml 형식의 요청을 위해 ContentNegotiatingViewResolver, MappingJAcksonJsonView 등을 사용합니다
.
3)
뷰를 구성할 때 사용하는 설정 파일은 template-*.xml 이랍니다
.
4) resources
부분이라는데, resources 폴더를 하나 만들어야 하는거 아닌가요
?
5) context:component-scan base-package=”*”
는 무얼 의미하는 걸까요
?
6) context:annotation-config
태그만 넣으면 실행이 되나요
?
7) resolver
가 자주 나오는데, resolve 는 해결하다란 뜻이라면 resolver는 해결사란 뜻인가? 암튼 multipartResolver 의 역할은 대충 파일 업로드등을 해결해주는 분이신가
?
8)
파일 다운로드만 전문으로 해주시는 BeanNameViewReolver 님도 계시네
.
9) View Resolver
.
10) tiles
가 나오기 시작한다. 내가 알기로는 전체적인 프레임을 나눠주는 역할을 하는 것으로 알고 있다. tilesConfigurer 의 역할은 역시암튼 template-*.xml 파일을 만들어 넣어야 한다
.
11) ContentNegotiatingViewResolver
님 이분은 mime type 등의 설정 및 json view등을 처리해주는 사람인가
?
12) DefaultAnnotationHandlerMapping :
이넘이 바로 annotation 핸들링 하는 bean 인듯.
13) dispatcher-servlet.xml  중에
<mvc:resource mapping=”/resources/**” location=”/resources/” />

이중에 mvc:resource 부분인데, 해당 태그를 쓰고 location에 해당하는 곳에 정적자원을 배치하고, mapping 속성에는 요청 URL의 패턴을 명시해 줍니다. /resource/** 로 시작되는 모든 요청들은 정적인 자원을 요청하는 URL로 인식하고 /resources/ 폴더에서 해당 자원을 찾습니다. 기준은 WebContent 이고, 정적인 자원은 Web-inf 폴더 내는 불가압니다.

5. Template-board.xml
tiles
에 대한 공부를 하면 해당 설정 파일에 대한 부분도 알수 있겠죠.
여기서 하나 주의할점은 Spring에서는 jsp 파일을 보안상의 이유로 web-inf 안에 넣어두네요.

 

6.  ModelAndView

-       Model 에 해당하는 부분은 addObject(“name” , value); 형태
( = request.setAttribute(“name”, value) )
객체를 생성할 때 주는 list insert 가 바로 template-board.xml 에서 지정했던 name 과 일치되는 부분으로 mav.setViewName(“viewname”); 형태로 대체 될수 있다.

-       ModelAndView객체의 첫번째 인자는 이전에 스프링 구성에서 타일즈를 활용한 뷰 구성을 위해 template-board.xml 에서 등록한 <definition name=”ajaxList” template=”/WEB-INF/board/ajaxList.jsp"/> 의 구분의 name에 해당하는 값이다.

-       ModelAndView(“redirect:list/0”); 이것은 redirect 라는 접두어로 바로 이동가능함.

 

7. DAO는 기존에 구성한 DAO 인데 이를 스프링에서 지원하는 SQLMapClientDaoSupport 객체 이용

ð  기존 DAO와 성능이나 기능은 별반 크게 차이는 없지만 스타일 싱크를 위해

 

 

8. 스프링에서는 MultipartFile 이라는 객체형을 지원하여 해당 객체형으로 선언된 필드의 경우 파일을 직접 담아오게 됩니다. 그렇다고 filename 필드에 객체형을 MultipartFile 로 바꿔버리면 DB 등록시 타입에러가 발생하므로 파일 업로드 처리를 하기위해 파일을 받을수 있는 MultipartFile 형 필드를 하나 더 선언하도록 한다.
Board.java (com.board.beans)
에다가.

 

9. 다운로드에서 스프링에서 지원하는 빈네임 뷰 리졸버를 사용하는데, 이것은 다운로드에 특화되었다기 보다는 클래스를 뷰네임으로 반환하여 뷰대신 사용하는 것이다.
예를 들어, 다운로드에 사용될 클래스를 지정하고 해당 클래스이름에 가장앞글자를 소문자로 치환하여 (ex- DownloadView > downloadView) ModelAndView 객체의 첫번째 인자로 전달하면 해당 클래스가 실행되는 원리이다
.

다운로드 뷰에서는 기본적으로 스프링에서 제공하는 AbstractView를 상속받아 renderMergedOutputModel을 구현합니다.
스프링에서는 별도의 설정변경을 통하여 특정 URL의 패턴이 인식되면 정적인 자원의 요청으로 판단하여 해당 요청을 수행 할 수 있다.

 

10. Controller

사용자가 브라우저에서 서버단으로 Request 하면, 첫번째로 Controller 단에서 가로채서 Mapping 한 후에 Action(로그인, 데이터 가져오고, 세션처리, 유효성검사 등등)을 취해서 View를 하게 됩니다. 그렇기 때문에 요청을 .j네 가 아닌 .do 또는 .action 와 같은 방식으로 URL을 요청하게 된다.
이런 요청은 컨트롤러에서는 해당 Action에 매핑시키기 위해 해당 맵핑정보가 들어있는 properties 파일을 읽고 해당 클래스를 사용할 수 있게 한 뒤 해당 클래스를 실행합니다.


Action 에서는 데이터베이스에 접속이 필요하면 이때 모델을 이용하게 됩니다.
모델은 데이터베이스의 접속(트랜젝션 관리, 커넥션풀 관리 등)과 각종 쿼리들을 처리할 수 있도록 메소드 빈 형식으로 구성됩니다
.

하여 DB에 접근한 뒤 필요한 데이터를 반환하거나 수정, 삭제작업을 하고 다시 Action으로 돌아와서 뷰에서 필요한 데이터들을 jsp페이지로 보내면서 View 반환을 진행하는데 이런 것들을 Dispatcher 라고 한다
.

로그인의 예

login.do
요청 > 컨트롤러에서 매핑정보 확인 login.do = LoginAction(properties 파일)을 가지고 해당 LoginAction 실행 > LoginAction에서 모델에 넘어온 id 값과 pw 값을 가지고 Model 에 쿼리 실행 > LoginAction 에서 로그인 처리 > 로그인 성공 or 실패 페이지(jsp)로 변환

l  컨트롤러의 위치를 지정해주는 태그

  
   <
servlet>

            <servlet-name>ControllerAction</servlet-name>

            <servlet-class>com.board.controller.ControllerAction</servlet-class>

</servlet>

 

l  서블릿 매핑은 해당 url 패턴으로 들어왔을 때, ControllerAction을 실행하겠다라는 태그


<servlet-mapping>

                          <servlet-name>ControllerAction</servlet-name>

                          <url-pattern>*.do</url-pattern>

  </servlet-mapping>

 

****** 스프링 설정을 통해 각 요청별로 .json 을 붙여 요청을 하면 스프링에서 지원하는 ContentNegotiatingViewResolver 를 통해 json 형태의 데이터를 받을 수 가 있다.
http://localhost:8080/board/list/0.json
으잉된다;;  일반적으로 json 요청으로 응답을 받기 위해서는 일일히 json 스트링을 통해 파싱하는 작업을 거쳐야 하는데, 그럴필요 없이 요청을 하면 단지 json 형태로 변환합니다.
ModelAndView
객체와 ContentNegotiatingResolver 의 합작!

 

 

 

여기까지 한 후에... 이제 하나씩 개념을 잡아가면서, 실무 프로젝트 진행하도 될것 같은 느낌..

많은 이해가 있어서 좋았다.