IT_Note


미리 URL과 파라미터를 설정해 주자.

만들기 전 철저한 구성을 해두어야 차후 실수할 일이 적다.


게시글 리스트

URL : cp/bbs/list.do

JSP : [/WEB-INF/views]/bbs/list.jsp


글 쓰기 폼

URL : cp/bbs/created.do

JSP : [/WEB-INF/views]/bbs/created.jsp


글 저장 -> 게시글 리스트로 리다이렉트

URL : cp/bbs/created.do


글 보기

URL : cp/bbs/article.do

JSP : [/WEB-INF/views]/bbs/article.jsp


글 수정 폼

URL : cp/bbs/update.do

JSP : [/WEB-INF/views]/bbs/created.jsp


글 수정 완료 -> 게시글 리스트로 리다이렉트

URL : cp/bbs/update.do


글삭제 -> 게시글 리스트로 리다이렉트

URL : cp/bbs/delete.do


-------------------------------------

파라미터


1. 게시글리스트 


페이징처리와 검색등등 복잡하다,, 리스트가 가장 까다로움.


게시물 리스트 -> 글쓰기버튼클릭 -> 글쓰기 폼

게시물 리스트 -> 글제목 클릭  글번호,페이지번호[,검색키,검색값]  -> 글보기 

게시물 리스트 -> 페이지번호 클릭 - 페이지번호[,검색키,검색값] -> 게시글리스트

게시물 리스트 -> 검색버튼 검색키,검색값 -> 게시글리스트


- 넘겨받은 파라미터 

[페이지번호] [검색키,검색값] 

- 프로그램작성 

파라미터로 넘어온 페이지번호 받기. 넘어온 페이지가 없으면 1페이지.
파라미터로 넘어온 검색키,검색값 받기 검색키와 검색값이 존재하면서 get방식으로 넘어온 경우 디코딩.
전체 데이터개수, 전체 페이지수 구하기
전체 페이지보다 표시할 페이지가 큰 경우 표시페이지를 전체 페이지로 변경
테이블에서 가져올 시작과 끝 위치 구하기
테이블에서 게시물 리스트 가져오기
검색 값이 존재하는 경우 검색 값을 인코딩 [get 방식 전송에서 사용하기 위해] 
페이징처리
포워딩할 jsp에 넘길 값 설정 [request.setAttribute["이름",값];]
게시물리스트, 페이징, 현페이지, 전체개수[,검색키,검색값]등
리스트jsp로 포워딩

------------------------------------

2. 글 쓰기 폼


글 쓰기 폼 -> 등록하기 폼-제목,글쓴이,내용,패스워드  -> 글 저장

글 쓰기 폼 -> 취소버튼 -> 게시글 리스트



- 프로그램작성 

포워딩 할 페이지에 넘길 작업 구분값을 설정
 request.setAttribute["mode","created"]

글쓰기 jsp로 포워딩

-----------------------------------

3. 글 저장 

- 넘겨 받은 파라미터
 제목, 이름, 내용, 패스워드

- 프로그램작성

파라미터로 넘어온 제목,이름,내용,패스워드 넘겨받기
[ 파라미터로 넘어온 값을 받는 방법은 프레임워크에 따라 다르다]

ipAddr - ip주소 request.getRemoteAddr()

데이터를 테이블에 저장하기

게시물 리스트 페이지로 리다이렉트

--------------------------------

4. 글보기



글 보기 -> 리스트버튼 페이지번호 [,검색키,검색값]  -> 게시글 리스트

글 보기 -> 이전글,다음글 클릭 글번호[이전 또는 다음글],페이지번호[,검색키,검색값]  -> 글 보기

글 보기 -> 수정버튼 글번호,페이지번호 ->글 수정 폼

글 보기 -> 글 삭제 버튼 글번호, 페이지번호 -> 글 삭제



- 넘겨 받은 파라미터

글번호, 페이지번호, [검색키,검색값] 

- 프로그램 작성

파라미터로 넘어온 글번호 페이지번호 받기
파라미터로 넘어온 검색키,검색값 받기 검색키와 검색값이 존재하면서 get방식으로 넘어온 경우 디코딩
테이블에 해당 게시물의 조회수를 증가한다 [ 테이블의 자료를 update ]
해당 게시물을 테이블에서 가져 온다.
해당 게시물이 없으면 리스트로 리다이렉트 한다 [파라미터 : page ]
글 내용[content]의 엔터를 <br>로 변경한다
해당 게시물의 이전글과 다음글을 테이블에서 가져온다.[ 글번호,제목 등]
검색값이 있으면 검색값을 인코딩 한다.
포워딩 할 jsp에 넘길 값 설정 해당 게시물,이전글,다음글,페이지번호 [,검색키,검색값] 등
글 보기 jsp로 포워딩 


---------------------------------------

5. 글 수정 폼



글 수정 폼 -> 수정하기버튼  폼 - 제목,글쓴이,내용,패스워드,글번호,페이지번호 -> 글 수정 완료

글 수정 폼 -> 취소버튼 페이지번호 -> 게시글 리스트


-넘겨받은 파라미터

 글번호, 페이지번호


-프로그램 작성

파라미터로 넘어온 글번호,페이지번호 넘겨받기

해당게시물을 테이블에서 가져온다

해당 게시물이 없으면 리스트로 리다이렉트 한다. [파라미터 : page ]

포워딩할 jsp로 넘길 값 설정 해당 게시물, 페이지번호, 작업구분 [mode : update]

글 수정 JSP로 포워딩

-----------------------------------------------

6. 글 수정 완료

- 넘겨 받은 파리미터

 제목,이름,내용,패스워드,글번호,페이지번호


- 프로그램 작성

파라미터로 넘어온 제목, 이름, 내용,패스워드, 글번호, 페이지번호 넘겨 받기

테이블의 해당 게시물을 수정한다.

글 리스트로 리다이렉트 한다. [파라미터 : page]


----------------------------------------------------


7. 글 삭제

- 넘겨 받은 파라미터 

 글번호, 페이지번호


- 프로그램 작성

파라미터로 넘어온 글번호, 페이지번호 넘겨 받기

테이블의 해당 게시물을 삭제한다.

글 리스트로 리다이렉트 한다. [ 파라미터 : page]





STS -스프링 4.xx mvc2 , 마이바티스 3.xx 게시판 환경설정


- 환경설정 전체적인 개요 


1. STS 설치 및 실행 

2. tomcat 8.5설치후 - sts에 톰캣추가

3. Spring MVC 프로젝트 생성 (스프링레거시 프로젝트생성)


4. MVC 4.x.x환경설정 

 - pom.xml 라이브러리 레포지터리,디펜던시 설정 

   (오라클 등)

 - web.xml(빈 환경설정,서블릿등록 컨트롤러 환경설정파일 경로지정,매핑방식등)

 - mvc-config.xml ( 스프링 환경설정) 커맨더의 처리결과를 보여줄 view를 결정

 - application-config.xml (스프링에서 공통적으로 사용되는 객체를 생성하기 위한 xml)


5.Mybatis환경설정 및 DAO클래스 작성

 - jdbc.properties ( JDBC 오라클 환경설정파일 주소,계정정보 등.

 - mybatis-config.xml ( mybatis환경설정 )

 - mybatis-context.xml ( mybatis 객체생성을 위한 xml)


---------------------------------



6. 맵퍼, DAO등 작성

 - bbsmapper.xml ( 게시판에 사용될 맵퍼 우선은 내용없이 만들기.)

 - CommonDAO.java , MyBatisDaoImpl.java ( 공통으로 사용될 DAO )

 - myutil.java ( 페이징 처리등을 작성할 클래스 )


------------------

1.테이블생성

2.게시물 입력 폼 작성

3.DTO클래스

4.컨트롤러,서비스 클래스

5.맵퍼 작성

--------------------

글쓰기 기능부터 개발 후 데이터 들어가는지 확인한다.



마이바티스란? 

마이바티스는 퍼시스턴스계층 (데이터처리계층)의 프레임워크로

정형화된 테이블 구조에 의존하지 않고 sql구문의 실행결과에 객체를 매핑하는 방식이다.


테이블 구조가 복잡해지고 정규화 되 있지 않아도 테이블을 변경할 필요 없이 기존 개발방법에서 사용한

sql을 그대로 사용할 수가 있고

sql에 적용한 튜닝들도 모두 그대로 유지된다.


작동흐름


- 데이터처리를 위해 DAO는 MYBATIS에 제공하는 객체의 메서드를 호출한다

- 마이바티스는 SQL문이 저장된 맵퍼 파일에서 데이터 처리에 필요한 SQL문을 찾는다.

- 마이바티스는 맵퍼 파일에서 찾은 SQL을 서버에 보내고자 JDBC드라이버를 사용

- JDBC드라이버는 SQL문을 DB서버로 보낸다.

- 마이바티스는 SELECT문의 실행 결과를 값 객체에 담아서 반환. 

INSERT UPDATE DELETE문인경우 입력 변경 삭제된레코드의 개수 반환.



일반적으로 dao에서 마이바티스를 사용하는 시나리오

- dao는 sqlsessionfactory에게 sql을 실행할 객체를 요구한다
- sqlsessionfactory는 sqlsession 객체를 생성하여 반환한다.
- dao는 sqlsession객체에게 sql실행을 요청
- sqlsession객체는 sql이 저장된 맵퍼파일(xml)에서 sql을 찾는다
- sqlsession은 jdbc드라이버를 통해 db에 질의를 실행
- sqlsession은 db로부터 가져온 질의 결과를 객체로 생성하여 반환
- dao는 사용이 끝난 sqlsession을 닫는다.



---------------------------------------추가설명 ( OKKY 검색)



(오라클 기준)

애플리케이션에서 DB 접속할 때 마다 DB쪽에서도 1:1로 프로세스가 생성됩니다.  예를 들어, 클라이언트 100개가 접속하면 오라클 서버 쪽에도 100개의 프로세스가 생성되는 식이죠. 문제는 오라클 서버 프로세스 생성하는 게 상당한 오버헤드를 일으킬 수 있습니다. 무엇보다 자원 재사용이 안되니까요.


그래서 나온게 커넥션 풀링(connection pooling)입니다.  미리 DB 연결을 맺어두고 그 pool 내에서 필요할 때 꺼내서 사용하고 반환하는 식이죠. 물론 접속이 늘어나면 커넥션 풀에서 자동으로 DB 접속 세션 수를 늘립니다. 


mybatis나 ibatis가 커넥션 풀링 기능만 제공하는 건 아니에요. 말씀하신 것처럼 웹로직이나 다른 WAS에서도 기본적으로 제공하는 기능입니다.


단순히 커넥션 풀링 때문에 프레임워크를 쓰는 건 아니고요.


그리고 JSP나 ASP 코딩해보셨으면 아시겠지만, 자바 코드 내에 HTML 태그하고 SQL 쿼리가 짬뽕되면 가독성이나 유지보수성이 현저히 떨어집니다.  JAVA 코드 내에 SQL을 문자열 +해서 짠 코드 보신적 있으시죠?  SQL이 조금만 길어지고 복잡해져도 눈돌아갑니다.


그래서 이걸 분리하려는 움직임이 생긴거죠. 그러면 가독성이나 유지보수 시 상당히 편리해집니다. 생산성은 곧 비용과 직결되죠.



-----------

1. 가장 큰 이유는 빠른 개발(생산성)이 가능합니다. 

- DBCP만을 썼을때 Connection, ResultSet, Statement, Transaction 관리도 해야 하고 

- 특히 운영하다 명시적인 Connection, ResultSet, Statement, Transaction을 잘못(닫질 않아) 써서 서버가 죽는경우 허다합니다. 

- ResultSet의 데이터 매핑도 신경써야 하고

- 소스코드가 하드코딩(""+""+"")되어 있음 소스 분석 및 관리가 힘듭니다. (10,000 라인 넘어가는 소스 한번 보믄 이해하실겁니다. )

2. 보안적으로 SQL Injection 보안에 신경쓰지 않아도 됩니다. 

- 물론 DBCP를 쓸 경우 PrepareStatement 쓰믄 문제 없지만 

3. RDBMS가 Oracle일 경우 Blob, Clob 치환에 신경쓰지 않아도 됩니다. 

4. 디버깅이 쉬워집니다. 

- iBatis, myBatis 쿼리문의 ? => value로 매핑된 쿼리문으로 로그를 남기는 jar파일이 여럿 있습니다. 

5. 데이터 캐싱(LIFO,FIFO, LRU)이 가능합니다. 

- 조회용 데이터 성능이 안나올 때 데이터 캐싱 설정만으로 훌륭한 성능 개선을 할 수 있습니다. 

- 실제 대규모 사이트에서 적용 사용하고 있음. 

- 간단한 xml 설정만으로 적용 가능 

6. 꼭 resultType, resultClass로 VO를 사용 않으셔도 됩니다. Map으로만 이용 가능 




참고  - https://okky.kr/article/285215


'WEB > 이론' 카테고리의 다른 글

spring mvc 동작방식  (0) 2017.03.22
jdbc와 마이바티스  (0) 2017.03.21
스프링 MVC 구조와 MVC1패턴과 2패턴의 차이.  (0) 2017.03.20
web.xml  (0) 2017.01.18