BookVO/SQL/Service/Dao - 책 생성

조수경·2022년 1월 27일
1

Spring

목록 보기
7/43

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 + "]";
	}
	
	
	}
profile
신입 개발자 입니다!!!

0개의 댓글