jsp - controller - service(인터페이스:implement구현) - dao(클래스) - xml - db
오토와이어 : 컨트롤러에서 서비스를 쓸때 함
왜? 스프링은 인터페이스를 요청하는 곳
스프링은 인터페이스를 좋아해!
create.jsp : post방식으로된 /create 실행
```
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>책 생성하기</title>
</head>
<body>
<h1>책 생성하기</h1>
<form method="post" action="/create">
<p>제목 : <input type="text" name="title" /></p>
<p>카테고리 : <input type="text" name="category" /></p>
<p>가격 : <input type="text" name="price" /></p>
<p><input type="submit" value="저장" /></p>
</form>
</body>
</html>
> book_SQL.xml
**클래스이름까지 다쓰는게 파라미터 타입**
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="book">
<insert id="insert" parameterType="kr.or.ddit.BookVO">
insert into book(BOOK_ID,TITLE,CATEGORY,PRICE,INSERT_DATE)
values(#{bookId},#{title},#{category},#{price},#{insertDate})
</insert>
</mapper>
> BookDao.java
package kr.or.ddit;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
//mapper xml을 실행해주는 클래스.
//어노테이션을 붙여서 이 클래스는 데이터에 접근하는 클래스야~
//Spring에게 알려줘!
//Spring이 데이터를 관리하는 클래스라고 인지해서 자바 빈(java bean)으로 등록해서 관리
@Repository
public class BookDao { //사람
//sqlSessionTempate 사용
/*
* new 키워드를 통해 직접 생성 안했는데 객체가 생성이 됨!! 싱기방구
* 이게 바로 의존성 주입임!!!(Dependency Injection - DI)
* DI로 주입 받는 것임
* 스프링이 이미 만들어 놓은 sqlSessionTemplate 타입 객체를 BookDao 객체에 주입
* 이 과정은 자동으로 스프링에서 실행되며, 개발자가 직접 객체를 생성하지 않음(이것이 바로 IoC: 제어의 역전)
*
*/
@Autowired//자동 주입
SqlSessionTemplate sqlSessionTemplate;//미리 만들어 놓은 백신
public int insert(BookVO bookVO) {
//book_SQL.xml 파일에서
//namespace="book"
//id="insert"
//book.insert : 매퍼 쿼리 명
//bookVO : 두 번째 인수.. 쿼리에 전달할 데이터(String, int, VO, Map)
return this.sqlSessionTemplate.insert("book.insert", bookVO);
}
}
> BookServiceImpl.java
package kr.or.ddit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//어노테이션 : 스프링에게 이 클래스는 서비스 클래스임을 알려줌
//자바 빈(java bean)으로 등록하여 관리
@Service
public class BookServiceImpl implements BookService {
//이미 관리되어있는 객체를 가져다 쓴다
@Autowired
BookDao bookDao;
//부모 객체의 메소드를 재정의 하는 것
@Override
//메서드를 재정의 하는거라 오버라이드가 맞음 근데 어디서?
public int insert(BookVO bookVO) {
int affectRowCount = this.bookDao.insert(bookVO);
if(affectRowCount == 1) {//입력 성공
return bookVO.getBookId();
}
//입력 실패
return 0;
}
}
> BookService.java
package kr.or.ddit;
/*
* 서비스 클래스는 비즈니스 클래스(기능)가 위치하는 곳임
* 스프링 MVC 구조에서 Contoller(요청 받기 / 응답) - Service(중간연계) - DAO(DB작업)
* 컨트롤러와 DAO를 연결하는 역할도 함
*
* 스프링은 직접 클래스를 생성하는 것을 지양(안함)하고,
* 인터페이스를 통해 접근하는 것을 권장하는 프레임워크.(확장의 여지를 남겨 놓는것)
*/
public interface BookService {
//dao에 있는메소드를 그대로 복붙한 것
//book 테이블로 insert
public int insert(BookVO bookVO);
}
> BookController.java
package kr.or.ddit;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
//컨트롤러 어노테이션(Annotation)
//어노테이션이 있는 클래스
//스프링 프레임워크(디자인 패턴 + 라이브러리 집합)기
//웹 브라우저(크롬)의 요청(request)을 받아들이는 컨트롤러라고
//인지해서 자바 빈(java bean)으로 등록해서 관리
@Controller
public class BookController {
private static final Logger logger =
LoggerFactory.getLogger(BookController.class);
@Autowired //컨트롤러지만 서비스를 쓸수 있게 해줌
BookService bookService;
//Model : 컨트롤러가 반환할 데이터(VO객체, List, List<VO>, Map, List<Map>, JSONG)를 담당
// 반환 타입은? 1)forward(데이터 담기O) 2)redirect(데이터 담기X)
//View : 화면 담당
//localhost:8090/create
//url에 입력하면 입력폼만 보여주기
@RequestMapping(value="/create", method=RequestMethod.GET)//create요청이 오면 get메서드를 실행 할거야
public ModelAndView create() {
ModelAndView mav = new ModelAndView();
//localhost:8090/WEB-INF/views/book/create.jsp
//servlet-context.xml에서
//prefix : /WEB-INF/views/
mav.setViewName("book/create");
//suffix : .jsp
return mav;
}
//HTTP파라미터 : 웹 브라우저(크롬)에서 서버(톰캣)로 전달하는 데이터
// 제목, 분류, 가격 등이 HTTP파라미터로 넘어오는 것
//?title=톰소여의모험&category=소설&price=10000
//스프링은 HTTP파라미터를 자바 메소드의 파라미터로 변환해서 컨트롤러 메소드를 호출해줌
//map으로 받을때에는 RequestParam 어노테이션 쓰기
//{"title":"톰소여의모험", "category":"소설"...}//키와 값 형식
//vo로 받을 때에는 ModelAttribute 어노테이션 쓰기
//입력 데이터를 받아서 db에 넣기
@RequestMapping(value="/create", method=RequestMethod.POST)
//create.jsp에서 요청되는 파라미터 목록들을 받는것(하나하나 안쓰고 이것만 쓰면됨!)
public ModelAndView createPost(ModelAndView mav,
@RequestParam Map<String, Object> map) {//입력한값을 map에 받아라
logger.info("map : "+map.toString());
//map ->BookVO로 변환(public BookVO mapToVo(map)..메소드로 처리)
BookVO bookVO = new BookVO();
//20220127숙제
//map -> BookVO로 변환(public BookVO mapToVo(map)..메서드로 처리)
bookVO.setTitle((String)map.get("title"));//담을때는 String이지만 object그릇에 담아서 가져와서 형변환 필요
bookVO.setCategory((String)map.get("category"));
bookVO.setPrice(Integer.parseInt((String) map.get("price")));
bookVO.setBookId(1);
bookVO.setInsertDate("2022-01-27");
int result = bookService.insert(bookVO);
logger.info("result : " + result);
mav.setViewName("book/create");
return mav;
}
@RequestMapping(value="/make", method=RequestMethod.GET)
//make요청이 오면 get메서드를 실행 할거야
public ModelAndView make() {
//배달해줄 라이더 생성
ModelAndView mav = new ModelAndView();
mav.setViewName("book/make");
return mav;
}
//RequestMapping어노테이션 : 웹 브라우저의 요청에 실행되는 자바 메소드를 지정해줌
//method : 속성, http 요청 메소드를 의미함
// 1) GET : 데이터를 변경하지 않는 경우 사용
// 2) POST : 데이터가 변경될 경우 사용
//웹 브라우저에 화면을 보여줄 뿐 데이터의 변경이 일어나지 않으므로 GET 메소드를 사용한것임
//jjajang() 메소드는 웹 브라우저에서 /jjajang 주소가 GET 방식으로 입력되었을 때
// book/jjajang 경로의 뷰를 보여줌
@RequestMapping(value="/jjajang", method=RequestMethod.GET)
public ModelAndView jjajang(ModelAndView mav) {
//book/jjajang : 뷰의 경로
mav.setViewName("book/jjajang");
return mav;
}
}
> BookVO.java
```
package kr.or.ddit;
public class BookVO {
//멤버변수
private int bookId;
private String title;
private String category;
private int price;
private String insertDate;
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getInsertDate() {
return insertDate;
}
public void setInsertDate(String insertDate) {
this.insertDate = insertDate;
}
@Override
public String toString() {
return "BookVO [bookId=" + bookId + ", title=" + title + ", category=" + category + ", price=" + price
+ ", insertDate=" + insertDate + "]";
}
}