(1)편에 이어서 MVC 설계로 게시판예제를 이어서 포스팅하겠다.
1. mappers 폴더 생성 후 BoardMapper.xml 생성하기
src/main/resources의 하위에 mappers 폴더를 생성한다. 폴더명은 root-context.xml에서 작성했던 path를 따른다.
mappers 폴더 밑에 BoardMapper.xml을 생성한다.
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="com.firstspring.mapper.BoardMapper">
</mapper>
이때 <namespace>의 경로는 실제 경로대로 정확한 작성이 필요하다.
전체적인 src/main/resources 디렉토리구조는 위와 같은 구조로 구성한다.
2. service, controller, mapper 등 package 생성하기
요청과, 실제 처리, 응답 등을 처리할 패키지를 생성한다.
<package별 기능>
- ServiceImpl는 Service인터페이스를 상속받아 비즈니스 로직을 수행한다.
- Controller는 client의 요청/응답 등의 과정을 제어한다. (java파일을 찾고 jsp를 응답하는 등..)
- Mapper는 쿼리문 값을 담아오는 역할을 수행한다. Mybatis 매핑XML에 기재된 SQL을 호출하기 위한 인터페이스이다.
- VO는 DB에 생성된 객체를 spring f/w로 가져올때 담아오는 value object이다.
3. BoardVO 클래스 생성하기
Oracle의 Board 테이블과 동일한 형태의 VO를 담아줄 클래스를 생성한다.
Board 테이블은 아래 쿼리문을 이용하여 생성하였다.
CREATE TABLE "BOARD"
( "SEQ" NUMBER(5,0),
"TITLE" VARCHAR2(200 BYTE),
"WRITER" VARCHAR2(20 BYTE),
"CONTENT" VARCHAR2(2000 BYTE),
"REGDATE" DATE DEFAULT SYSDATE,
"CNT" NUMBER(5,0) DEFAULT 0,
PRIMARY KEY ("SEQ")
) ;
com.firstspring.vo 패키지에 BoardVO.java를 생성해준다.
lombok라이브러리를 이용하여 getter/setter도 자동생성을 한다.
( lombok 라이브러리 설치 방법 : https://cceeun.tistory.com/77 )
package com.firstspring.vo;
import java.util.Date;
import lombok.*;
@Getter
@Setter
public class BoardVO {
int seq, cnt;
String title, writer, content;
Date regdate;
}
4. BoardMapper.xml에 실제 Select 쿼리문 추가하기
<!-- 전체 내용 조회 -->
<select id="viewAll" resultType="com.firstspring.vo.BoardVO">
SELECT * FROM board ORDER BY SEQ DESC
</select>
root-context.xml에 작성했던 내용을보면,
<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"/>
이렇게 되어있는데, *Mapper.xml형태로 들어오는 것들에 대해 매퍼로 지정한다는 의미이다.
5. BoardMapper.interface 생성하여 추가하기
BoardMapper.xml의 쿼리문과 namespace에 매핑되어있는 com.firstspring.mapper의 인터페이스를 연동하고자 한다.
id 값을 통하여 아래의 메소드와 연동이 될 수 있도록 한다.
package com.firstspring.mapper;
import java.util.List;
import com.firstspring.vo.BoardVO;
public interface BoardMapper {
public List<BoardVO> viewAll();
}
6. BoardService.interface 생성하기
실제 비즈니스로직이 이루어질 수 있도록 service 단을 구성해준다.
com/firstspring/service 패키지 아래에 BoardSerivce.interfacd를 생성하고
public List<BoardVO> selectBoardAll(); 함수를 추가해준다.
package com.firstspring.service;
import java.util.List;
import com.firstspring.vo.BoardVO;
public interface BoardService {
public List<BoardVO> selectBoardAll();
}
(+) BoardMapper인터페이스에서 사용한 메소드명인 viewAll은 매퍼의 id와 일치시켜주어야 하나
Service단에서는 해당 쿼리문을 통해 어떤 기능을 하는지에 대해서 메소드명을 지어주면 된다.
7. BoardServiceImpl.java 생성하기
BoardService를 상속받아서 실제 비즈니스로직을 구현하는 클래스인 BoardServiceImpl를 생성한다.
package com.firstspring.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.firstspring.mapper.BoardMapper;
import com.firstspring.service.BoardService;
import com.firstspring.vo.BoardVO;
@Service
public class BoardServiceImpl implements BoardService{
@Autowired
public BoardMapper mapper;
@Override
public List<BoardVO> selectBoardAll() {
return mapper.viewAll();
}
}
BoardMapper는 Interface이기때문에 new를 할 수 없지만 @Autowired의 어노테이션을 통하여 의존성 주입이되고, 실제 매핑된 SQL문이 들어있는 BoardMapper.xml의 값이 들어오게된다.
BoardService를 상속받는 BoardServiceImpl 클래스로 이동한 후 위의 코드를 작성한다.
@Service 어노테이션은 해당 클래스가 구현된 Service란것을 알리기 위한것이다.
@Override 어노테이션은 부모 객체에 있는 메소드를 Override했다는 뜻이다.
@Autowired 어노테이션은 의존성 주입을 위한 것이다.
@Autowired를 사용하면 Spring Framework가 해당 인터페이스(BoardMapper)를 참조하고 해당 인터페이스와 연동된
매퍼(BoardMapper.xml)을 참고해 자동으로 객체를 생성해 mapper란 변수에
주입한다. 이러한 작업을 의존성 주입(Dependency Injection)이라 한다.
위 메소드를 보면 의존성 주입을 받은 mapper변수로 BoardMapper 안의 viewAll 메소드를 호출했다.
mapper -> BoardMapper 인터페이스 -> BoardMapper.xml -> viewAll을 참조해 BoardMapper.xml에 작성된 id가 viewAll인 SQL문의 결과 값이 위 메소드의 리턴값이 되는것이다.
참고 : https://po9357.github.io/spring/2019-05-13-MyBatis_Oracle2/
위의 화면단으로 가져오는 것은 다음 포스팅으로 넘기겠다.
- 참고자료
https://twofootdog.github.io/Spring-DAO%EC%99%80-Mapper%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90/ Mybatis 연동, DAO와 Mapper의 차이점
https://www.slideshare.net/hanmomhanda/spring-mvc-fullflow spring MVC구조와 역할
https://multifrontgarden.tistory.com/97
https://elvis-note.tistory.com/entry/9-Spring-MVC-2-Service%EC%99%80-ServiceImpl
'프로그래밍 > Spring Framework' 카테고리의 다른 글
[Spring] 스프링 게시판 예제 (3) - DB연동 + View단 출력 (0) | 2020.07.25 |
---|---|
[Spring] Maven 빌드, 인스톨 시 fatal 오류 해결법 (0) | 2020.07.25 |
[Spring] STS에 Lombok 라이브러리 설치하기 + Lombok 메소드 기능 (0) | 2020.07.19 |
[Spring] 스프링 게시판 예제 (1) - DB 연동 (Oracle, Mybatis) (0) | 2020.06.28 |
[Spring] STS - Spring 한글 인코딩하기 (0) | 2020.06.28 |