MVC ํจํด
๐จ๐ผ : MVC ํจํด์ด๋?
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ ์ค๊ณ๋ฐฉ์ ์ ๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋๊ฒ ๋ค.
๐จ๐ผ : ์ฌ๊ธฐ์ MVC2 ๋,
๋ชจ๋ธ(Model), ๋ทฐ(View), ์ปจํธ๋กค๋ฌ(Controller)๋ก ๋ถ๋ฆฌํ์ฌ ๋ ํจ์จ์ ์ผ๋ก ๊ตฌ์กฐํํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
๋ทฐ(View)๊ฐ HTML/CSS/JavaScript๋ก ๊ตฌ์ฑ๋ ์น ํ์ด์ง๋ฅผ ๋ํ๋ด๊ณ ,
๋ชจ๋ธ(Model)์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ฉฐ,
์ปจํธ๋กค๋ฌ(Controller)๊ฐ ์ฌ์ฉ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์ ์ ํ ์๋ต์ ๋ฐํํ๋ค.
๐จ๐ผ : MVC2 ์ ์ ๋ฐ์ ์ธ ํ๋ฆ์
Client โถ Controller โถ Service โถDAO โถ DTO โถ DB
์๋ธ๋ฆฟ Servlet / ์ปจํธ๋กค๋ฌ Controller
๐จ๐ผ : ํ๋์ฉ ์์๋ณด๋๋ก ํ์.
๋จผ์ Client ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด
๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ชจ๋ ์์ฒญ์ Controller๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ค. (์์ฒญ ๋ถ๊ธฐ)
๐จ๐ผ : ์ฌ๊ธฐ์ ๋จผ์ , ์๋ธ๋ฆฟ์ ์์์ผํ๋๋ฐ
์๋ธ๋ฆฟ์์ด๋,
ํด๋ผ์ด์ธํธ HTTP์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๋์ ์น ์ฝํ ์ธ ๋ฅผ ์์ฑํ๋ ์ญํ ์ ํ๋ค.
๐จ๐ผ : MVC ํจํด์์ ์๋ธ๋ฆฟ์ Controller๋ก ์ด์ฉํ๊ธฐ๋ํ๋ค.
์๋ธ๋ฆฟ์ ์๋ฐ ํ์ค์์ ์ง์ํ๋ ๊ธฐ๋ฅ์ด๊ณ ,
์ปจํธ๋กค๋ฌ (์ฃผ๋ก MVC ์ผ๋ถ๋ถ์ผ๋ก ์ฌ์ฉ) ๋ ์๋ธ๋ฆฟ์ ์ข ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
์ฆ, ์ปจํธ๋กค๋ฌ๋ ์๋ธ๋ฆฟ๊ณผ ๊ฐ์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
๐จ๐ผ : ๊ทธ๋ฆฌ๊ณ ์๋ธ๋ฆฟ์ ์ฌ๋ฌ๊ฐ๊ฐ ์กด์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถํ๊ธฐ ์ํด์
URL-Mapping ์ ์งํํด์ค์ผํ๋๋ฐ
์ด๋, @WebServlet("/HelloWorld") ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ๋ค.
( web.xml ํ์ผ์ ์์ ํ ํ์ ์์ด ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์ง์ URL ํจํด์ ๋งคํ )
๐จ๐ผ : ์๋ธ๋ฆฟ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ !
๐จ๐ผ : @webServlet("*.???") ์
์์ผ๋์นด๋ ํจํด์ผ๋ก .main์ผ๋ก ๋๋๋ ๋ชจ๋ URL ์์ฒญ์ ํด๋น ์๋ธ๋ฆฟ(์ปจํธ๋กค๋ฌ)๊ฐ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
์ฆ, *.main ์ผ๋ก ๋๋๋ ์์ฒญ๋ค์ ์ ๋ถ mainController ๋ก ๋ชจ์ธ๋ค.
@WebServlet("*.main")
public class mainController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
protected void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
๐จ๐ผ : ์ฌ๊ธฐ์ request ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญํ ์ ๋ณด,
response ๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ ๋ ์ ๋ณด๋ค์ ๋ด๊ณ ์๋ค.
(๋ด์ฅ๊ฐ์ฒด ์ ๋๋ค. was ๊ฐ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ๊ฐ์ฒด)
์์ธํ ๋ฉ์๋๋ ์๋์์ ํ์ธ ๊ฐ๋ฅํ๋ค.
https://hyejux.tistory.com/686
๐จ๐ผ : ์์ฒญ๋ URI , PATH ๊ฐ์ ์ป์ด๋ด command ์ ๋ฃ๊ณ ์๋์ ๊ฐ์ด ์์ฒญ์ ๋ถ๊ธฐํด์ค๋ค.
(command ์ ๋ณด์ ๋ง๊ฒ ์์ฒญ์ ๋ณด๋ด์ฃผ๋ ๊ฒ์ด๋ค.)
command ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ฐพ์ service์ ๋ณด๋ธ๋ค.
String uri = request.getRequestURI();
String path = request.getContextPath();
String command = uri.substring(path.length());
//String getRequestURI() : ์น ์๋ฒ๋ก ์์ฒญ ์, ์์ฒญ์ ์ฌ์ฉ๋ URL ๋ก๋ถํฐ URI ๊ฐ์ ๋ฆฌํดํ๋ค.
//String getContextPath() : ํด๋น JSP ํ์ด์ง๊ฐ ์ํ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ์ฝํ
์คํธ ๊ฒฝ๋ก๋ฅผ ๋ฆฌํดํ๋ค.
if(command.equals("/main/home.main")) {
service = new MypageServiceImpl();
service.checkCheckin(request, response);
} else if(command.equals("/main/dohome.main")) {
service = new MypageServiceImpl();
service.doCheckin(request, response);
}
Service ๋ ์ด์ด
๐จ๐ผ : Service ๋ ์ด์ด ๋ ์ปจํธ๋กค๋ฌ์ ์์ฒญ์ ๋ฐ์์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
๐จ๐ผ : Service , ServiceImpl ๋
Service ๋ ์ฃผ๋ก interface ๋ก ๋ง๋ค๊ณ
ServiceImpl ์ ํตํด ๊ตฌํํด์ค๋ค.
public interface Boardservice {
void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
void getList (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
@Override
public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String writer = request.getParameter("writer");
String title = request.getParameter("title");
String content = request.getParameter("content");
BoardDAO dao = BoardDAO.getInstance();
System.out.println("impl");
dao.regist(writer, title, content);
// ๋ชฉ๋ก ์ด๋ -- ํ๋ฆผ
request.getRequestDispatcher("board_list.jsp").forward(request, response);
// ๋ชฉ๋ก ํ๋ฉด redirect ๋ก ํ์์ ๋๊ฐ
//response.sendRedirect("list.board");
}
@Override
public void getList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BoardDAO dao = BoardDAO.getInstance();
ArrayList<BoardDTO> list = dao.getList();
//requset ์ ์ ์ฅ ํฌ์๋๋ก ๋๊ฐ
request.setAttribute("list", list); //board_list
request.getRequestDispatcher("board_list.jsp").forward(request, response);
}
JDBC, DAO , DTO (+ Mapper (Mybatis) )
๐จ๐ผ : ์ด์ DB ์ ์ฐ๋๋์ด ๋ฐ์ดํฐ ์ด๋์ ์ํค๊ธฐ ์ํด์๋ JDBC๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
๐จ๐ผ : JDBC (Java Database Connectivity) Java์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ ์ ์๋๋ก ํ๋ Java API
DB์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ฐ์ ธ์ค๊ณ ๋นผ๋ด๊ธฐ ์ํด DTO์ DAO๋ฅผ ์ด๋ค.
JDBC ๋ row level๋ถํฐ ORM( ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋งคํํ๋ ๊ฒ)์ ์์ฑํ ์ ์๋ ์ฅ์ ์ด ์๋ค.
DTO ( Data Transfer Object ) ๋ DB์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด
DTO ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์์ฑ์๋ค์ด ๋ชจ์ฌ์๋ค.
public class BoardDTO {
private int bno;
private String writer;
private String title;
private String content;
private Timestamp regdate;
private int hit;
public BoardDTO() {
}
public BoardDTO(int bno, String writer, String title, String content, Timestamp regdate, int hit) {
super();
this.bno = bno;
this.writer = writer;
this.title = title;
this.content = content;
this.regdate = regdate;
this.hit = hit;
}
DAO ( Data Access Object ) ๋ DB์ ์ ๊ทผํด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ (CRUD ๋ฑ)๋ฅผ ์ํ ๊ฐ์ฒด
DAO
public class UserDAO {
//DAO๋ ๋ถํ์ํ๊ฒ ์ฌ๋ฌ ๊ฐ ๋ง๋ค ํ์๊ฐ ์์ผ๋ฏ๋ก
//๊ฐ์ฒด๊ฐ 1๊ฐ๋ง ์์ฑ๋๋๋ก singletonํ์์ผ๋ก ์ค๊ณ
//1. ๋ ์์ ์ ๊ฐ์ฒด๋ฅผ 1๊ฐ๋ง ์์ฑํ๊ณ , private์ ๋ถ์
private static UserDAO instance = new UserDAO();
//2. ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ก ์์ฑ์์๋ private๋ฅผ ๋ถ์
private UserDAO(){
//์ปค๋ฅ์
ํ์ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ป์ด ์ด
try {
InitialContext init = new InitialContext();//์์์ค์ ๊ฐ์ฒด
ds = (DataSource)init.lookup("java:comp/env/jdbc/oracle");
} catch (Exception e) {
System.out.println("์ปค๋ฅ์
ํ ์๋ฌ");
}
}
//3. ๊ฐ์ฒด ์์ฑ์ ์๊ตฌํ ๋ getter๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ 1๋ฒ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
public static UserDAO getInstance() {
return instance;
}
//์ปค๋ฅ์
ํ ๊ฐ์ฒด์ ๋ณด
private DataSource ds;
public int findUser(String id) {
int result = 0;
String sql = "SELECT COUNT(*) FROM USERS WHERE ID = ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) { // ์ ์ ๊ฐ ์๋ค๋ ๋ป
result = rs.getInt(1);
}
}catch (Exception e ) {
e.printStackTrace();
}finally {
JdbcUtil.close(conn, pstmt, null);
}
return result;
}
public void insertUser(String id, String pw, String name, String email, String gender) {
String sql = "INSERT INTO USERS(ID, PW, NAME, EAMIL, GENDER) VALUES(?,?,?,?,?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = ds.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pw);
pstmt.setString(3, name);
pstmt.setString(4, email);
pstmt.setString(5, gender);
pstmt.executeUpdate(); //์คํ
}catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtil.close(conn, pstmt, null);
}
}
JDBC ์์ธํ ์ ๋ณด๋ ์ฌ๊ธฐ๋ก
๐จ๐ผ : ํ์ง๋ง JDBC ์ ๋จ์ ์ ๋ง์ ์ฝ๋ ์ค๋ณต์ด ์๊ธด๋ค. ใ ใ
์ด๋ ์ฝ๋ ์ค๋ณต์ ์ค์ฌ์ฃผ๋ Mapper ๊ฐ ์๋ค.
- SQL ๋ฌธ๊ณผ ๊ฐ์ฒด(Object)์ ํ๋๋ฅผ ๋งคํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒดํ
- ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ์ ๊ฐ์ฒด์ ํ๋๋ฅผ ๋งตํ & RowMapper ์ฌํ์ฉ
- JdbcTemplate๊ฐ JDBC์์ ๋ฐ๋ณต์ ์ผ๋ก ํด์ผ ํ๋ ๋ง์ ์์ ๋ค์ ๋์ ํด์ค
๐จ๐ผ : ๋ํ์ ์ผ๋ก Mybatis ๊ฐ ๊ทธ์ ํด๋นํ๋ค.
์ฌ๊ธฐ์ Mybatis ๋ฅผ ์ฌ์ฉํ๋ฉด DAO๊ณ์ธต์ ๋์ ํ๊ฒ๋๊ณ ,
interface ๊ตฌํ์ด ์๋ xmlํ์ผ๋ก ๊ตฌํ์ ๋์ฒดํ๊ฒ๋๋ค.
1) mapper interface ์์ฑ
Mybatis๊ฐ Dao์ ์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋, ๊ฐ๋ฐ์๊ฐ ์์ฑํ Mybatis Mapperํ์ผ(.xml)์ ์ฐธ๊ณ ํด ๋ง๋ญ๋๋ค.
public interface FreeBoard {
public String now();
//...์๋ต
}
2) mapper๊ตฌํ์ฒด ์์ฑ
<?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="FreeBoard์ ํ๋ค์(ํจํค์งํฌํจ๋ช
)">
<select id="๋ฉ์๋๋ช
" resultType="returnํ์
ํ ๋ค์" parameterType="ํ๋ผ๋ฏธํฐํ์
ํ๋ค์">
์ํ๋ ์ฟผ๋ฆฌ๋ฌธ (;์ ์ธํ๊ธฐ)
</select>
</mapper>
๋ง์ด๋ฐํฐ์ค์ ๋ํ ์์ธํ ์ ๋ณด๋ ์ฌ๊ธฐ๋ก !
forward , redirect
๐จ๐ผ : JSP ์์ ํน์ ํ์ด์ง๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์๋ค.
forward ์ redirect ์ด๋ค.
๐จ๐ผ : forward :
request ๊ฐ, response ๊ฐ ์ ์ง๋๋ค.
์ด๋๋ url ํ๋ฉด์ด ๋ณด์ด์ง ์๋๋ค.
//์๋ฐ์์ forward ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
RequestDispatcher dp = request.getRequestDispatcher("/actionTag/forward_ex04.jsp");//์ด๋ํ url ์ฃผ์
dp.forward(request, response);
๐จ๐ผ : redirect
request ๊ฐ, response ๊ฐ ์ ์ง๋์ง์๋๋ค (์๋ก ๋ง๋ค์ด์ง)
์ด๋๋ url ํ๋ฉด์ ๋ณด์ธ๋ค.
response.sendRedirect("sendd_ex03.jsp");
/*
ํ
์ด๋ธ ๋ณ DTO ์์ฑ
controller ๊ตฌํ
service ๊ตฌํ
mapper ๊ตฌํ (data)
database ํ์ธ
*/