본문 바로가기
개발/교육

(Spring) 41일차

by kakk789 2022. 5. 27.

ReqeustMapping GET/POST 방식 설정

@ReqeustMapping(value=".do", method=RequestMethod.GET)
@ReqeustMapping(value=".do", method=RequestMethod.POST)

Model 클래스를 이용하여 상태유지

  • 아래와 같이 사용 가능 (매개변수로 전달)
	@RequestMapping("/listBook.do")
	public void list (Model model) {
		model.addAttribute("title", "상품목록");
		model.addAttribute("list", dao.listBook());
	}

컨트롤러 객체를 xml에 자동으로 설정 (오토 스캔)

  • component-scan : Bean으로 등록 될 준비를 마친 클래스를 스캔하여 Bean으로 등록!
  • @Controller, @Service, @Component, @Repository 어노테이션을 붙힌 클래스를 자동으로 Bean으로 등록한다
  • @Autowired : 특정 객체에 대해 해당 어노테이션을 붙히면 자동으로 Bean으로 등록 한다.
1. context에 대한 네임스페이스 설정 필요 ( servlet.xml에 필요 )
xmlns:context="http://www.springframework.org/schema/context"

2. xsi:schemaLocation에 2개의 URL 추가
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"

3. 오토스캔 (해당 패키지 명 안에 존재하는 컨트롤러 클래스를 자동으로 xml에 등록)
<context:component-scan base-package="패키지 명" />

xxx-servlet.xml

       xmlns:context="http://www.springframework.org/schema/context"
	<context:component-scan base-package="com.sist.controller"></context:component-scan>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="
    ................
    xmlns:context="
    http://www.springframework.org/schema/context"
    ...............
    
    xsi:schemaLocation="
    .............. 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.sist.controller"></context:component-scan>
    <context:component-scan base-package="com.sist.dao"></context:component-scan>

@Repository

@Repository
public class BookDAO {

	public List<BookVO> listBook(){
		
		return DBManager.listBook();
	}
	
	public int insertBook(BookVO vo) {
		return DBManager.insertBook(vo);
	}
}

 

@Autowired 예시
@Autowired : 특정 객체에 대해 해당 어노테이션을 붙히면 자동으로 Bean으로 등록 한다.

Mybatis란

  • 자바 객체와 데이터베이스 테이블을 맵핑을 해줌
  • VO를 이용한 getter/setter 작업을 덜어 줌.
  • DAO를 사용하기 대신에 xml 을 이용할 것임 (BookMapper.xml)
  • xml이 매핑 파일에 의해 관리될 것임 (sqlMapConfig.xml)

Spring / Mybatis 설정 or 동작 원리 / 순서

1. web.xml

  • 기존과 동일하게 DispactcherServlet / HandlerMapping 을 동일하게 선언
  <servlet>
  	<servlet-name>gaebal</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>gaebal</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>

2. xxx-servlet.xml

  • web.xml에서 설정한 servlet-name을 접두어로 하는 xml 생성
  • servlet-name이 xxx라면 xxx-servlet.xml
  • viewResolver 선언
  • 각종 Bean 선언

3. DB.properties (일반 파일로 만들 것)

  • DB 연동을 위한 변수 선언 (Driver, URL, USER, PASSWORD 선언)
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@ip주소:포트주소:해당DB서비스
username=ID입력
password=비밀번호

4. DB연동Config.xml

  • DB.properties 파일 선언
<properties resource="com/sist/db/db.props" />
  • VO 알리아스 선언 (필수 아님)
<typeAliases>
	<typeAlias type="com.sist.vo.BookVO" alias="bookVO"/>
</typeAliases>

  • DB.properties를 기반으로 DB Connection 할 xml
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  • mapper의 위치 선언
  <mappers>
    <mapper resource="com/sist/db/BookMapper.xml"/>
  </mappers>

5. Mapper.xml

  1. SQL 문이 담긴 Mapper 
    1.1 실행 결과의 값이 담겨 있을 속성은 resultType   --> select 시 필요
    1.2 실행에 필요한 매개변수가 담길 속성 parameterType --> insert/update/delete 시 필요
  2. namespace를 선언하는 게 좋음 (DB연동Config.xml 사용 될 것임)

아래 코드는  DBManager.java 에서

book.findAll(), book.inserBook(vo) 식으로 호출 될 것임

<mapper namespace="book">
  <select id="findAll" resultType="bookVO">
    select * from book order by bookid asc
  </select>
  
  <insert id="insertBook" parameterType="bookVO">
  	insert into book values(#{bookid}, #{bookname}, #{publisher}, #{price})
  </insert>
</mapper>

6. controller

  • @Controller 클래스 선언
@Controller
  • DAO 객체 생성 ( 실제 객체는 xxx-servlet.xml 에서 선언 ) - byName, byType, contstruct
private BookDAO dao;

	//예시는 setter에 의한 dao
	public void setDao(BookDAO dao) {
		this.dao = dao;
	}
  • dao의 함수 실행 후  result ModelAndView 리턴
	@RequestMapping(value="/xxx.do", method=RequestMethod.GET)
	public ModelAndView nonono() {
		ModelAndView mav = new ModelAndView();
		return mav;
	}

7. dao

  • @Repository 선언 필수
  • 실제 DAO의 역할은 8번에서 할 것임
@Repository
  • DBManaer에서 함수 실행 결과 return (해당 함수 return만 있고 DBmanaer에서 실제 함수 정의)
	public int insertBook(BookVO vo) {
		return DBManager.insertBook(vo);
	}

8. DBManager  ( 일전의 DAO 역할을 하는 녀석 )

- 4번의 DB연동Config.xml 과 연동 필요

  • DB연동Config.xml 위치를 InputStream타입으로 저장 (Resources.getResourceAsStream)
  • InputStream을 SqlSessionFactory 타입의 객체 생성후 Build(InputStream)
	String dbContentPath = "com/sist/db/sqlMapConfig.xml";
	InputStream inputStream = Resources.getResourceAsStream(dbContentPath);
	sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

- session open 후 SQL 명령어 실행

  • session오픈 (sqlSessionFactory.openSession())
  • 해당 session을 이용하여 DB쿼리문 실행 (mapper에 담겨있는 DB 쿼리문을 실행할 것임)
  • 만약 insert/delete/update 라면 commit 까지 해줘야함
  • 아래 예시의 insert는 실제 insert 함수임 (session의 기본 함수임)
  • book.insertBook은 mapper.xml에 정의 한 sql 을 호출 하는 것임
	static public int insertBook(BookVO vo) {
		int re=1;
		SqlSession session = sqlSessionFactory.openSession();
		re = session.insert("book.insertBook", vo);
		session.commit();
		session.close();
		return re;
	}

redirect 명령어

  • 리다이렉트 하는 명령어 mav.setViewName("redirect:/listBook.do")
  • response.sendRedirect() 와 동일하거나 비슷
setViewName("redirect:/listBook.do");

Spring filter (한글 처리)

  <filter>
  	<filter-name>enc</filter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>  	
  </filter>
  
  <filter-mapping>
  	<filter-name>enc</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

static { }

  • 시스템이 가동될 때 자동으로 동작하도록 할 수 있음
static {
     .....
     .....
반응형

'개발 > 교육' 카테고리의 다른 글

(Thymeleaf/JPA) 58일차  (0) 2022.06.23
(Spring) 57일차  (0) 2022.06.22
(JSP)36일차  (0) 2022.05.20
(JSP)35일차  (0) 2022.05.19
(JSP) 34일차  (0) 2022.05.18

댓글