2021. 11. 29. 14:25ใSpring
๊ฐ๋จํ ์ฌ์ฉ์ ๊ด๋ฆฌ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ,
์์ ์ jsp๊ณต๋ถํ ๋ ๋ง๋ค์๋ jdbc ๊ฒ์ํ์ ์์ฉํด
Spring MVC ๋ฒ์ ์ผ๋ก ๊ฒ์ํ์ ๋ง๋ค์ด๋ณผ ์์ ์ด๋ค.
์ต์ข ๊ฒฐ๊ณผ ํ๋ฉด์ผ๋ก
๊ธ ์์ฑ, ์์ , ์ญ์ , ์กฐํ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ํ์ ๋ง๋ค์ด๋ณผ ์์ ์ด๋ค.
Board ํ ์ด๋ธ
board_seq ์ํ์ค๋ฅผ ์์ฑํด ๊ฒ์๊ธ์ ์์ฑํ ๋๋ง๋ค ์๋์ผ๋ก 1์ฉ wr_uid๊ฐ ์ฆ๊ฐํ๋๋ก ํ๋ค.
๊ธฐ๋ณธํค๋ wr_uid
0๏ธโฃ MVC ํ๋ก์ ํธ ์์ฑํ๊ธฐ
โ ํจํค์ง๋ช ์์ฑํ ๋๋ ์๋ฅผ ๋ค์ด com.lec.board๋ค ํ๋ฉด ๋ง์ง๋ง ์ธ๋ฒ์งธ ์ฆ board๊ฐ ์ปจํ ์คํธ ์ด๋ฆ์ด ๋๊ธฐ ๋๋ฌธ์
์ค์ ์ํด์ฃผ๊ธฐ!
์ด๋ฐ์์ Sping MVC ํ๋ก์ ํธ๊ฐ ์์ฑ๋์๋ค๋ฉด
src/main/java๋ ์น root
servlet-context.xml์ ์คํ๋ง ์ค์ ํ์ผ
web.xml์ dispatcherServlet ์ค์ ํ์ผ๋ก, servlet-context.xml ํ์ผ ์์น๋ ์ ์ํด๋๋ค.
pom.xml์๋ maven ์ค์ ํ์ผ์ด๋ค.
1๏ธโฃ pom.xml, web.xml ์ค์ ํ์ผ
pom.xml์๋ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ , web.xml์๋ ํ๊ธ ์ธ์ฝ๋ฉ ์ฝ๋๋ฅผ ๋ฃ์ด์ค์ผ ํ๊ธ์ด ๊นจ์ง์ง ์๋๋ค.
<!-- ์คํ๋ง ์ปจํ ์ด๋ ์ธ์ฝ๋ฉ ์ค์ --> <filter> <filter-name>encodingFilter</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
web.xml์ ๋ณต๋ถํ๊ณ ์ ์ฅํ๋ฉด ๋๋ค.
pom.xml์๋ ์์ ์ ๋ฒ์ ์ ๋ง๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.17.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.17.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.17.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.17.RELEASE</version>
<scope>test</scope>
</dependency>
๋ด๊ฐ ์ถ๊ฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ ๊ฒ ๋๋ค!
2๏ธโฃ ํ์ํ ํจํค์ง, ํด๋์ค, jsp ์์ฑํ๊ธฐ
3๏ธโฃ Spring ์ค์ ํ์ผ
Spring ์ค์ ํ์ผ์ธ servlet-context.xml์ dataSource์ mybatis ๋ฑ์ ๋น์ ์ถ๊ฐํด์ค๋ค.
โ Mapper ์ธํฐํ์ด์ค
: Mapping ํ์ผ์ ๊ธฐ์ฌ๋ sql์ ํธ์ถํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ก Mapping ํ์ผ์ ์๋ sql์ ์๋ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํธ์ถ ํ ์ ์๋๋ก ํด์ค๋ค.
4๏ธโฃ MyBatis ์ค์ ํ์ผ ์์ฑํ๊ธฐ(Vo๊ฐ์ฒด์ค์ ) SqlMapConfig.xml , Mapping ํ์ผ ์์ฑ Board.xml
5๏ธโฃ BoardVO, BoardService, BoardDAO ์์ฑ ๋ฐ ๊ตฌํํ๊ธฐ
- BoardVO.java
package com.lec.board.vo;
public class BoardVO {
private int wr_uid;
private String subject;
private String content;
private String name;
private int viewcnt;
private String regdate;
public BoardVO() {
super();
}
public BoardVO(int wr_uid, String subject, String content, String name, int viewcnt, String regdate) {
super();
this.wr_uid = wr_uid;
this.subject = subject;
this.content = content;
this.name = name;
this.viewcnt = viewcnt;
this.regdate = regdate;
}
public int getWr_uid() {
return wr_uid;
}
public void setWr_uid(int wr_uid) {
this.wr_uid = wr_uid;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getViewcnt() {
return viewcnt;
}
public void setViewcnt(int viewcnt) {
this.viewcnt = viewcnt;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
}
๋ณ์๋ช ์ db ํ ์ด๋ธ ์ปฌ๋ผ๋ช ๊ณผ ๋ง์ถฐ์ค๋ค.
- BoardService.java (์ธํฐํ์ด์ค)
package com.lec.board.service;
import java.util.List;
import com.lec.board.vo.BoardVO;
public interface BoardService {
public List<BoardVO> selectList();
public BoardVO selectOne(String wr_uid);
public void updateViewcnt(String wr_uid);
public void insertOne(BoardVO board);
public void updateOne(BoardVO board);
public void deleteOne(String wr_uid);
}
- BoardServiceImple.java (BoardService ๊ตฌํ)
package com.lec.board.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lec.board.dao.BoardDAO;
import com.lec.board.vo.BoardVO;
@Service("boardService")
public class BoardServiceImple implements BoardService {
@Autowired
BoardDAO boardDao;
@Override
public List<BoardVO> selectList() {
List<BoardVO> list = boardDao.selectAll();
return list;
}
@Override
public BoardVO selectOne(String wr_uid) {
BoardVO board = boardDao.select(wr_uid);
return board;
}
@Override
public void updateViewcnt(String wr_uid) {
boardDao.updateCount(wr_uid);
}
@Override
public void insertOne(BoardVO board) {
boardDao.insert(board);
}
@Override
public void updateOne(BoardVO board) {
boardDao.update(board);
}
@Override
public void deleteOne(String wr_uid) {
boardDao.delete(wr_uid);
}
}
- BoardDAO.java (์ธํฐํ์ด์ค)
package com.lec.board.dao;
import java.util.List;
import com.lec.board.vo.BoardVO;
public interface BoardDAO {
public List<BoardVO> selectAll();
public BoardVO select(String wr_uid);
public void updateCount(String wr_uid);
public void insert(BoardVO board);
public void update(BoardVO board);
public void delete(String wr_uid);
}
- BoardDAOJDBC.java (BoardDAO ๊ตฌํ)
package com.lec.board.dao;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.lec.board.vo.BoardVO;
@Repository("boardDao")
public class BoardDAOJDBC implements BoardDAO {
@Autowired
BoardMapper boardMapper;
@Override
public List<BoardVO> selectAll() {
List<BoardVO> list = boardMapper.selectAll();
return list;
}
@Override
public BoardVO select(String wr_uid) {
BoardVO board = boardMapper.selectOne(wr_uid);
return board;
}
@Override
public void updateCount(String wr_uid) {
boardMapper.updateViewcnt(wr_uid);
}
@Override
public void insert(BoardVO board) {
boardMapper.insertOne(board);
}
@Override
public void update(BoardVO board) {
boardMapper.updateOne(board);
}
@Override
public void delete(String wr_uid) {
boardMapper.deleteOne(wr_uid);
}
}
- BoardMapper ์ธํฐํ์ด์ค
package com.lec.board.dao;
import java.util.List;
import com.lec.board.vo.BoardVO;
public interface BoardMapper {
List<BoardVO> selectAll();
BoardVO selectOne(String wr_uid);
void insertOne(BoardVO board);
void updateOne(BoardVO board);
void deleteOne(String wr_uid);
void updateViewcnt(String wr_uid);
}
โ Spring MVC ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ ์ ์ฐจ
1. ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๋ DispatcherServlet๋ฅผ web.xml์ ์ค์
2. ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ Controller ์์ฑ
3. Spring bean์ผ๋ก Controller ๋ฑ๋ก
4. jsp๋ฅผ ์ด์ฉํ view ์์ญ์ ์ฝ๋๋ฅผ ์์ฑ
5. browser ์์์ jsp๋ฅผ ์คํ
6๏ธโฃ ๊ฒ์ํ ๊ธ ๋ชฉ๋ก ์กฐํ
- BoardController
๊ฒ์ํ ๋ชฉ๋ก ์กฐํ ์์ฒญ url์ "/board/list.do"์ด๋ค.
DispathcherServlet์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ url๊ณผ ์์ฒญ ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก HandlerMapping์ ํตํด ๋ชจ๋ธ ๊ฐ์ฒด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์์ ์์ฒญ์ ๋ํด ์ฒ๋ฆฌํ๊ณ , ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ model์ ๋ด์ board/list.jsp ์ ๋ฆฌํดํ๋ค.
list.jsp์์๋ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด๋ฅผ ${list}๋ก ๋ฐ์์ jstl core ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ ์ด๋ธ์ ๋ชฉ๋ก์ ์ถ๋ ฅํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด ํด๋น ๊ธ์ ์กฐํํ ์ ์๋๋ก ํ์ดํผ๋งํฌ๋ฅผ ๋ฌ์๋ค.
7๏ธโฃ ํน์ ๊ธ ์กฐํ
ํน์ ๊ธ ์กฐํ ์์ฒญ url์ "/board/view.do"์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํน์ ๊ธ ์กฐํ๋ฅผ ์ํด wr_uid ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค.
ํน์ ๊ธ์ ํด๋ฆญํ๋ฉด ํด๋น ๊ธ์ ์กฐํํ ์ ์์ด์ผ ํ๋ฉฐ, ์กฐํ์๊ฐ 1 ์ฆ๊ฐํด์ผํ๊ธฐ ๋๋ฌธ์
๋๊ฐ์ง๋ฅผ ์ํํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ์ํ ๊ฒฐ๊ณผ๋ฅผ ModelAndView ๊ฐ์ฒด์ ๋ฐํํ๋ค.
์กฐํ ๊ฒฐ๊ณผ๋ฅผ board์ ๋ด์์ view.jsp์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ view์์๋ ${board.wr_uid} ํ๋ฉด ํด๋น ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๊ธ์ ์ญ์ ํ๊ณ ์ถ์ ๋ ์ญ์ ํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฌ์ฉ์์๊ฒ ํ๋ฒ ๋ ํ์ธํ๋ ํ์ธ์ฐฝ์ ๋์ ์ฌ์ฉ์๊ฐ ํ์ธ ๋ฒํผ์ ๋๋ฌ์ผ ์ญ์ ๊ฐ ๋์ํ๋๋ก ํ๋ค.
8๏ธโฃ ๊ธ ์์ฑ
list, view ํ๋ฉด์์ ์ ๊ท ๋ฑ๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ํ๋๋ ํ๋ฉด์ผ๋ก ์๋ก์ด ๊ธ์ ์์ฑํ ์ ์๋ ํ์ด์ง์ด๋ค.
๊ธ ์์ฑ ํ์ด์ง์์ ๋ฑ๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด writeOk.do๊ฐ ์คํ๋์ด ์์ฑํ ๊ธ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋๋ค.
๊ธ์ ๋ฑ๋กํ ํ์๋ ๋ค์ ๋ฆฌ๋ค์ด๋ ํธํ์ฌ list.do๋ก ์ด๋ํ๋ค.
9๏ธโฃ ๊ธ ์์
๊ธ์ ์์ ํ๊ธฐ ์ํด์ ์์ ํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด
์ด๋ ๊ฒ ์ ๋ชฉ๊ณผ ๋ด์ฉ์ ์์ ํ ์ ์๋ ํ์ด์ง๋ก ๋ฐ๋๋ค.
wr_uid์ name ๋ฑ์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํ๋ค.
์ฐ์ ๊ธ ์์ ํ์ด์ง์์๋ ์๋ ์์ ์ ๊ธ์ด ํ์๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ selectOne ์ ํตํด ํน์ ๊ธ์ ์กฐํํด ํ์ํด์ค๋ค.
๊ธ์ ์์ ํ ํ์ ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด updateOk.do๊ฐ ์คํ๋๋ฉด์ ๊ธ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๊ณ ๋ ํ์
redirect๋ก list๋ก ํ๋ค.
๐ ๊ธ ์ญ์
BoardController์์๋ @PathVariable ์ด๋ ธํ ์ด์ ์ ํตํด ํ๋ผ๋ฏธํฐ๋ฅผ urlํ์์ผ๋ก ๋ฐ์ ์ ์๋๋ก ํด์ค๋ค.
๊ธ ์ญ์ ๋ ํ์ด์ง๊ฐ ๋ฐ๋ก ํ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ธ์ uid๋ฅผ urlํ์์ผ๋ก ๋ฐ๋๋ก ํ๋ค.
์ฌ์ฉ์๊ฐ ํ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ญ์ ๊ฐ ๋๊ณ , ๋ค์ ๋ชฉ๋ก์ผ๋ก ๋์๊ฐ๋๋ก ๋ฆฌ๋ค์ด๋ ํธ ํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋จํ ๊ฒ์ํ์ ์กฐํ, ์์ , ์ญ์ , ๋ฑ๋กํ ์ ์๋ค.
์ด์ ์ฌ๊ธฐ์ ์ ๋ชฉ์ด๋ ์์ฑ์๋ ๋ฐ๋์ ์์ฑํ๋๋ก ์ ํจ์ฑ์ ์ ๊ฒํ๋ค๋๊ฐ,
์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์๋ฌ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ฃผ๊ฑฐ๋ ํ๋ ๋ฑ ํด์
์ ์ ์ถ๊ฐํด ๋๊ฐ ์์ ์ด๋ค!