1.MyBatis 환경설정 파일(SqlSessionConfig.xml): MyBatis가 JDBC 코드를 실행하는데 필요한 전반에 걸친 세팅을 한다 - TypAlias 설정 : 사용할 모델 클래스에 대한 별칭 설정. <typeAlias> - DB 연동을 위한 설정 : DataBase에 어떻게 접속할 것인지에 대한 설정. <enviroment> - Mapper 설정 파일 등록 : 매핑 설정이 어디있는지. <mapper> 2.Mapper 설정 파일(member.xml, company.xml): Sql문과 관련된 설정을 하는 파일로서 MyBatis 설정파일(SqlSessionConfig.xml)에 등록을 하여야 한다. - 주요 구성 요소 1) SQL문 등록 태그 - SQL문 태그의 구성 요소 : Parameter, Result, ,SQL문 등록 - SQL 태그 : insert, delete, update, select - 공통 SQL문 설정 태그 : <sql> 2) select 결과 처리 설정 - <resultMap>
구성요소 / 구성파일
설명
MyBatis configuration file
MyBatis3의작업설정을설명하는 XML 파일입니다.
데이터베이스의연결대상, 매핑파일의경로, MyBatis3의작업설정등과같은세부사항을설명하는파일입니다. Spring과통합하여사용할때데이터베이스의연결대상과매핑파일경로설정을구성파일에지정할필요가없습니다. 그러나 MyBatis3의기본작업을변경하거나확장할때설정이수행됩니다.
1) void type: void 타입일 경우 접근하는 URL 경로에 해당하는 jsp를 찾아 실행한다.
// 예를 들어 /ex01/doA로 접근했다면 ex01 폴더 아래 doA.jsp를 찾아 실행시킨다.
@Controller
@RequestMapping("/ex01")
public class SampleController1
{
private static final Logger logger = LoggerFactory.getLogger(SampleController1.class);
@RequestMapping("/doA")
public void doA(){
logger.info("doA 실행..........");
}
2) String type: 리턴 타입이 String일 경우에는 해당 ["String"].jsp로 view를 처리하게 된다. 예를 들어 SampleController2의 doC( )는 /ex01/doC라는 URL을 처리한다. 그리고 결과로 result.jsp를 view로 호출한다. (/WEB-INF/views/result.jsp)
@Controller
@RequestMapping("/ex01")
public class SampleController2 {
private static final Logger logger = LoggerFactory.getLogger(SampleController2.class);
@RequestMapping("/doC")
public String doC(@ModelAttribute("msg") String msg){
logger.info("doC 실행..........");
System.out.println("doC 메시지 : "+msg);
return "result"; // 문자열이 사용될 경우 문자열.jsp 파일을 찾아서 실행한다.
}
3. String type + 데이터 전달:
데이터 전달은 Model객체를 통해서 전달이 가능하다. Model에 데이터를 담고 View로 전달을 하게 되는것이다.
Model에 데이터를 담을 때 addAttribute( ) 메소드를 사용하는데, 2가지 사용 방법이 있다.
addAttribute("이름", 객체) : 이름을 이용해 객체를 사용할 수 있다.
addAttribute(객체) : 이름을 지정하지 않을 경우 자동적으로 객체의 클래스명 앞글자를 소문자로 처리해서 이름으로 사용한다.
먼저 com.github.study.ex01.vo 이란 패키지를 생성하여 MemberVO를 만든다.
MemberVO 클래스를 생성하여 데이터 전달에 사용할 객체를 준비한다.
내 해석: 데이터 전달을 위해 객체를 만드는데 그게 VO클래스이다. 그래야 내부의 멤버변수에 데이터를 담을 수 있게! (ex: userid, userpw)
package com.github.study.ex01.vo;
public class MemberVO {
private String userid;
private String userpw;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUserpw() {
return userpw;
}
public void setUserpw(String userpw) {
this.userpw = userpw;
}
@Override
public String toString(){
return "MemberVO [User Id = " + userid + ", User Pw = " + userpw + "]";
}
}
출처: https://all-record.tistory.com/167 [세상의 모든 기록]
다음으로 com.github.study.ex01.controller 패키지에 SampleController3를 작성한다.
package com.github.study.ex01.controller;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.github.study.ex01.vo.MemberVO;
@Controller
@RequestMapping("/ex01")
public class SampleController3 {
private static final Logger logger = LoggerFactory.getLogger(SampleController3.class);
@RequestMapping("/doD")
public String doD(Model model){
logger.info("doD 실행...........");
MemberVO member = new MemberVO();
member.setUserid("userid-01");
member.setUserpw("userpw-01");
model.addAttribute("member", member);
//model.addAttribute(member);
logger.info("MemberVO : "+member.toString());
return "ex01/data";
}
@RequestMapping("/doE")
public String doE(Model model){
logger.info("doE 실행...........");
Map<String,String> map = new HashMap<String,String>();
map.put("userid", "userid-02");
map.put("userpw", "userpw-02");
model.addAttribute("map", map);
return "ex01/data";
}
}
출처: https://all-record.tistory.com/167 [세상의 모든 기록]
위에서는 addAttribute("이름", 객체) 를 사용하였기 때문에 뷰인 data.jsp 에서는 member 라는 이름으로 MemberVO 에 담긴 값을 사용할 수 있다. 다음으로 doE( )를 보자. doD( )와 차이점은 Map을 사용했다는것인데 기본적으로는 동일하다. doE( )가 실행되면 data.jsp에서 map 이라는 이름으로 Map에 담겨있는 값을 사용하는게 가능하다.
컨트롤러를 구현하면서 가장 많이 사용되는 어노테이션이 바로 @RequestParam 어노테이션이다. @RequestParam 어노테이션은 HTTP 요청 파라미터를 메서드의 파라미터로 전달받을 때 사용된다. @RequestParam 어노테이션과 HTTP 요청 파라미터의 관계는 다음과 같다.
(밑의 이미지 중요!!!)
첫번째 파라미터인 userName은 name 요청 파라미터의 값을 전달 받으며, 두 번째 파라미터인 userEmail 파라미터는 email 파라미터 값을 전달 받는다.
바로, JSP에서 String name = request.getParameter("name"); 과 같다.
@RequestParam은 Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션이다. 관련 속성은 아래와 같다.
@RequestParam 어노테이션이 적용된 파라미터는 기본적으로 필수 파라미터이다. 따라서 @RequestParam 어노테이션에 명시한 HTTP 요청 파라미터가 존재하지 않을 경우
스프링 MVC는 잘못된 요청을 의미하는 400 응답 코드를 웹 브라우저에 전송한다. 예를 들어 @RequestParam 어노테이션의 별도 설정을 하지 않은 경우, 다음의 URL을 요청하면 400 에러가 발생하게 된다.
@Controller public class SearchController{ @RequestMapping("/search/internal.do") public ModelAndView seachInternal( @RequestParam("query") String query, @RequestParam("p") int pageNumber){ . .. } }
첫 번째 파라미터는 query 요청 파라미터의 값을 전달받으며, 두 번째 파라미터인 pageNumber 파라미터는 p 파라미터의 값을 전달받는다.
@RequestParam 어노테이션이 적용된 파라미터가 String이 아닐 경우 실제 타입에 따라서 알맞게 타입 변환을 수행한다. 예를 들어,pageNumber 파라미터의 타입은 int인데, 이 경우 자동으로 문자열을 int 타입으로 변환해준다.
기존의 모델은 JSP 안에 controller(자바 bean 클래스) + view (JSP 페이지)를 이용하여 웹 페이지를 만들었다. 여기서는 사용자의 요청을 JSP 가 전부 처리했습니다.
JSP Model2(MVC) architecture 동작방식:
새로운 방식은 Controller 를 새로 추가하고, 그 안에서 model.addAttribute()를 사용하는 것입니다. 모델 1 과 달리 웹브라우저 사용자의 요청을 서블릿이 받습니다. 그리고 서블릿은 웹브라우저의 요청을 받아 View 로 보여줄것인지 Model 로 보내줄것인지 정하여 전송해줍니다. 여기서 view 페이지는 사용자에게 보여주는 역할만 담당하고 실질적인 기능의 부분은 Model 에서 담당합니다.
Model/View/Controller 의 역할: Model: 웹페이지에 필요한 기능(Java bean 소스) View: 실질적으로 보여지는 페이지 Controller: View 와 Model 을 연결시켜주는 역할을 수행
Spring framework 란? Java 기반 플랫폼을 위한 오픈소스로 제공되는 어플리케이션 개발 프레임워크입니다.
Spring framework 장점: POJO Based: Plain Old Java Object 라는 뜻으로, POJO 구성만으로도 프로젝트 제작이 가능하여
따로 프레임워크에 대해 공부할 필요가 없습니다 Lightweight: 경량화된 소프트웨어 Modular: 모듈화를 통해 패키지와 클래스와 상관없이 필요한 부분만 코딩 가능
IoC(Inversion of Control): 제어의 역전: 객체의 생성부터 소멸까지 생명주기를 개발자가 아니라 컨테이너가 대신 관리해준다.
이렇게 말하는 것보돠 IOC는 DI를 통해 이루어 지는데, 둘다 같은 뜻으로 사용되기도 한다. 관리의 주체가 개발자가 아닌 프레임워크로, container가 알아서 중간단계 역할을 하여 파일들끼리 연결해주고, 개발자는 프레임워크 안에서 개발만 하면 되는것이다. 특정 파일이 필요하면 그 파일을 호출하도로고 하는게 아니라 프레임워크를 통해서 호출이 되게끔 만드는것이다. (Hollywood principle)
POJO: Plain Old Java Object 라는 뜻으로, 자바 객체를 생성할때 특정 '기술'에 종속되어 동작하는 것이 아닌 순수한 자바 객체를 말하는 겁니다. 특정 기술의 객체를 사용할때 특정 기술을 지원해주는 프레임워크가 필요하지 않도록 hibernate 프레임워크를 의존하도록 합니다.
Spring project 의 폴더 구조 설명: src/main/java: controller 위치함. src/main/webapp/resources : 필요한 리소스 (파일, 이미지 등) . src/main/webapp/WEB-INF: servlet-context.xml + views + web.xml target: deploy에 필요한 war 파일 위치
DTO는Data Transfer Object의 약자로서,VO (Value Object)랑 혼용해서 쓴다. 보통은 DTO와 VO를 혼용해서 사용들 하지만,\ 필자는 용어를 정확히 구분해서 쓰는걸 중요하다고 생각한다.
(추가로, DB에 값을 저장하고 싶으면 javabean을 사용할 때 이미지 필드도 추가되게 하기 위해, (Book.java bean에 image이라는 변수를 추가해주고, getter 와 setter 메서드를 추가해줘야 한다 -> 그럼 BookDAO.java도 당연스럽게 새로운 변수인 image를 위해 함수들을 수정해야한다. )
pageContext.request.contextPath ==> 이게 뭔지 잘알아보기... 아니.. DB에는 이미지 이름만 넣어도 localhost/upload폴더에 잘 들어가있고, 이걸 heroku에서 접근할 수 있다는게 그러니까, 어떻게 heroku에서 db4free에 있는 파일을 접근했더라...? 아니 DAO에서 db4free로 접근하니까 그렇지. Heroku는 그냥 외부에 프로젝트를 서비스하게 해주는거고...!
Project Explorer-> 우클릭-> new -> Dynamic Web Project 생성
maven project로 변환-> 프로젝트명 우클릭-> configure-> convert to maven project
§Maven project로 변환 후, library 추가
아래 사진과 같이 pom.xml 파일로 들어가서 build 태그 하단에 <dependencies> 태그 삽입후 안에, 아래의 링크를 방문하여 maven project dependencies에 필요한 mysql-connector 라이브러리와 JSTL 라이브럴리를 추가해줍니다.
src폴더에 있는 내용이 DB연결 및 백엔드 작업이었다면, jsp파일은 프런트엔드 작업이라고 생각하면 되겠다. webcontent 폴더 및에 아래 사진과 같이 코드를 추가한다.
o실습 2) 사이트 실행 테스트
§index.jsp 실행하여 게시판 목록 표시 확인
§10개 이상 샘플 게시물 등록
§게시물 수정, 삭제기능 확인
§실습1), 실습2) 과정 정리. 필요한 화면 캡쳐
§프로젝트 소스파일 분석
§각 파일의 역할정리
§7개의 JSP 파일에 대한 분석
§어떤 일을 하고 있는가?
·addpost.jsp: 이 jsp 파일은 jsp action tags를 사용하여 자바빈 객체를 생성하여 새로운 포스트를 작성하면 추가 완료 메세지를 띄우거나, 꽉 찼을 경우에는 에러 메시지를 띄웁니다.
·addpostform.jsp: 새로운 포스틀 작성하기 위해 html에서 보여질 내용입니다. 해당 텍스트 박스에서 새로운 값을 입력할 수 있습니다.
·deletepost.jsp: 삭제하고자 하는 란이 선택되면, 해당 id 가 넘겨져서 그 id 값을 가지고 새로운 BoardVO객체를 생성하여 이 객체로 BoardDAO table에서 값을 지울 수 있게 되는 것입니다.
·editform.jsp: deletePost.jsp 와 비슷하게 선택된 항목에 대한 id가 넘겨져서 해당 항목을 편집한다.
·editpost.jsp: editform.jsp에서 수정된 사항을 editpost.jsp를 통해 새로운 내용을 업데이트하고 (boardDAO.updateBoard(u);) HTTP redirection을 하여 새로운 페이지를 로드한다. (response.sendRedirect("posts.jsp");
·index.jsp: index.jsp가 시작 페이지이다. 이 페이지는 posts.jsp 파일의 도움으로 페이지 html을 제작한다.
·posts.jsp: html의 모습을 html태그와 internal css 방식으로 꾸며주고 Edit과, delete, add new post 부분에서는 EL 언어를 사용하여 jsp에서 자바빈 seq번호를 ${u.getSeq()}을 사용하여 작업을 처리한다.
§사용된 JSP 기능에 관한 설명을 찾아 정리
§각 소스에 다음 기능이 사용된 부분들을 찾아 주석문 추가(jsp action tag, jsp directives, tag library, el(expression language) 사용된 부분) - 주석문을 포함한 소스를 직접 보고서에 Text로 복붙하여 추가
// jsp directives (page directives)
// 전체페이지는자바언어를사용하고 html 텍스트만을사용하고(이미지와같은 binary 파일은 )
import : 특정 class나 interface나 페키지의 모든 멤버를 import 하는데 사용 contentType: HTTP response의 MIME(Multipurpose Internet Mail Extension)을 정의함 extends: servlet으로부터 상속받을 부모 클래스를 정의한다 (드물게 쓰임) info:JSP 페이지에 대한 텍스트 정보를 설정함 buffer:JSP 페이지에서 생성 된 출력을 처리하기 위해 버퍼 크기를 킬로바이트 단위로 설정 <버퍼의 기본 크기: 8Kb> language:JSP 페이지에서 사용되는 스크립팅 언어를 지정 <기본값: java> isELIgnored:jsp의 EL (Expression Language)을 무시할 수 있음 <default 값: false(기본적으로 EL이 사용됨)> isThreadSafe: 서블렛과 JSP둘다 멀티쓰레딩 방식으로 작동하여서, isThreadSafe 속성을 사용하여 이 방식을 제어할 수 있다. <default 값: true>이다.,
errorPage:오류 페이지를 정의하는 데 사용 <현재 페이지에서 예외가 발생하면 오류 페이지로 리디렉션> isErrorPage: 현재 페이지가 오류 페이지임을 선언하는 데 사용 <예외 개체는 오류 페이지에서만 사용 가능>
Jsp Include Directive
이 태그는 외부 HTML, JSP, text file을 현재의 파일에 include하는데에 사용된다.
장점은 코드 재사용성.
Syntax: <%@ include file="resourceName" %>
JSP Taglib directive
많은 태그를 정의하는 태그 라이브러리를 정의하는 데 사용. TLD (Tag Library Descriptor) 파일을 사용하여 태그를 정의합니다.