🌱 우선은 Dao - DB랑 연결 하는데, 추후 ORM을 통해 연결하는 방법을 배울 예정.
🚩 인터페이스의 장점 :
표준화, 관계가 없는 클래스 구성, 모듈화하기 편하다.
- Legacy라서 이런 문제가 발생한다.
- 예제 들어가기 전
pom.xml
에 추가할 것? 다운로드 할 것이 필요했다.- 👨🏫이 주신
pom.xml
을 복붙 했는데 오류가 났다. (오라클이 없다?)- 해결방법 :
C:\Users\admin\.m2
를 삭제 -> 👨🏫 이 주신 m2를 붙여넣으면 된다.
오류 해결하기
m2
파일 다운 (압축풀기전)C:\Users\admin\.m2
파일 삭제C:\Users\admin\.m2
위치로 (하위폴더로생성x)C:\Users\admin\.m2\repository\com\oracle\ojdbc6\11.2.0.3
위치에 아래처럼 .jar
가 들어가 있으면 완료.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>
service = command 라고 부른다?
package com.oracle.oMVCBoard.dto;
import java.security.Timestamp;
public class BDto {
int bId;
String bName;
String bTitle;
String bContent;
Timestamp bDate;
int bHit;
int bGroup;
int bStep;
int bIndent;
public BDto() {
}
public BDto(int bId, String bTitle, String bName,
String bContent, Timestamp bDate, int bHit,
int bGroup, int bStep, int bIndent) {
this.bId = bId;
this.bName = bName;
this.bTitle = bTitle;
this.bContent = bContent;
this.bDate = bDate;
this.bHit = bHit;
this.bGroup = bGroup;
this.bStep = bStep;
this.bIndent = bIndent;
}
public int getbId() {
return bId;
}
public void setbId(int bId) {
this.bId = bId;
}
public String getbName() {
return bName;
}
public void setbName(String bName) {
this.bName = bName;
}
public String getbTitle() {
return bTitle;
}
public void setbTitle(String bTitle) {
this.bTitle = bTitle;
}
public String getbContent() {
return bContent;
}
public void setbContent(String bContent) {
this.bContent = bContent;
}
public Timestamp getbDate() {
return bDate;
}
public void setbDate(Timestamp bDate) {
this.bDate = bDate;
}
public int getbHit() {
return bHit;
}
public void setbHit(int bHit) {
this.bHit = bHit;
}
public int getbGroup() {
return bGroup;
}
public void setbGroup(int bGroup) {
this.bGroup = bGroup;
}
public int getbStep() {
return bStep;
}
public void setbStep(int bStep) {
this.bStep = bStep;
}
public int getbIndent() {
return bIndent;
}
public void setbIndent(int bIndent) {
this.bIndent = bIndent;
}
}
context 붙여넣기
Servers - context.xml
에 아래 넣기
<Resource
name = "jdbc/OracleDB"
auth = "Container"
type = "javax.sql.DataSource"
username = "scott"
password = "tiger"
driverClassName="oracle.jdbc.driver.OracleDriver"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
url= "jdbc:oracle:thin:@127.0.0.1:1521:xe"
maxActive="50"
maxIdle="10"
/>
package com.oracle.oMVCBoard.dao;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class BDao {
DataSource dataSource;
public BDao() {
try {
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/OracleDB");
} catch (NamingException e) {
System.out.println("생성자 dataSource --> " + e.getMessage());
e.printStackTrace();
}
}
}
package com.oracle.oMVCBoard.command;
import org.springframework.ui.Model;
public interface BCommand {
void execute(Model model);
}
package com.oracle.oMVCBoard;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import com.oracle.oMVCBoard.command.BCommand;
@Controller
public class BController {
private static final Logger logger = LoggerFactory.getLogger(BController.class);
BCommand command = null;
}
list
여기서 실행.
package com.oracle.oMVCBoard.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oMVCBoard.command.BCommand;
import com.oracle.oMVCBoard.command.BListCommand;
@Controller
public class BController {
private static final Logger logger = LoggerFactory.getLogger(BController.class);
BCommand command = null;
@RequestMapping("list")
public String list(Model model) {
logger.info("list start....");
// 실제 MAPPING 할것 적기
command = new BListCommand();
command.execute(model);
return "list";
}
}
콘솔창에서도 각각의 bName과 사이즈 9개가 제대로 나왔다.
화면단
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
<% String context = request.getContextPath(); %>
<link rel="stylesheet" href="<%=context%>/resources/css/board.css" type="text/css">
</head>
<body>
<h1>게시판</h1>
<table>
<tr>
<td>번호</td><td>이름</td><td>제목</td><td>날짜</td> <td>히트</td>
</tr>
<c:forEach items="${boardList }" var="mvc_board">
<tr>
<td>${mvc_board.bId}</td>
<td>${mvc_board.bName}</td>
<td>
<c:forEach begin="1" end="${mvc_board.bIndent}">-</c:forEach>
<a href="content_view?bId=${mvc_board.bId}">${mvc_board.bTitle}</a></td>
<td>${mvc_board.bDate}</td>
<td>${mvc_board.bHit}</td>
</tr>
</c:forEach>
<tr>
<td colspan="5"> <a href="write_view">글작성</a> </td>
</tr>
</table>
</body>
</html>
Dto
: 모든 칼럼 getter, setter
package com.oracle.oMVCBoard.dto;
import java.sql.Timestamp;
public class BDto {
int bId;
String bName;
String bTitle;
String bContent;
Timestamp bDate;
int bHit;
int bGroup;
int bStep;
int bIndent;
public BDto() {
}
public BDto(int bId, String bTitle, String bName,
String bContent, Timestamp bDate, int bHit,
int bGroup, int bStep, int bIndent) {
this.bId = bId;
this.bName = bName;
this.bTitle = bTitle;
this.bContent = bContent;
this.bDate = bDate;
this.bHit = bHit;
this.bGroup = bGroup;
this.bStep = bStep;
this.bIndent = bIndent;
}
public int getbId() {
return bId;
}
public void setbId(int bId) {
this.bId = bId;
}
public String getbName() {
return bName;
}
public void setbName(String bName) {
this.bName = bName;
}
public String getbTitle() {
return bTitle;
}
public void setbTitle(String bTitle) {
this.bTitle = bTitle;
}
public String getbContent() {
return bContent;
}
public void setbContent(String bContent) {
this.bContent = bContent;
}
public Timestamp getbDate() {
return bDate;
}
public void setbDate(Timestamp bDate) {
this.bDate = bDate;
}
public int getbHit() {
return bHit;
}
public void setbHit(int bHit) {
this.bHit = bHit;
}
public int getbGroup() {
return bGroup;
}
public void setbGroup(int bGroup) {
this.bGroup = bGroup;
}
public int getbStep() {
return bStep;
}
public void setbStep(int bStep) {
this.bStep = bStep;
}
public int getbIndent() {
return bIndent;
}
public void setbIndent(int bIndent) {
this.bIndent = bIndent;
}
}
Service를 Dao와 연결해주는 것
package com.oracle.oMVCBoard.command;
import java.util.ArrayList;
import org.springframework.ui.Model;
import com.oracle.oMVCBoard.dao.BDao;
import com.oracle.oMVCBoard.dto.BDto;
public class BListCommand implements BCommand {
@Override
public void execute(Model model) {
// Service 에서 Dao연결
BDao dao = new BDao();
ArrayList<BDto> boardDtoList = dao.boardList();
System.out.println("BListCommand boardDtoList.size() -->" + boardDtoList.size());
model.addAttribute("boardList", boardDtoList);
}
}
👿 화난다... DB에서 commit을 안해서 안떴던 거였다.
🔺🔺🔺 다음부턴 항상 DB넣고 커밋을 때리자.
🔺 전엔 setter로 배웠는데 이번엔 생성자로 사용.
setter를 이용할수도, 생성자를 이용할 수도 있다.
sql 작성, get으로 넣어준다.
🔺 이전(jsp)와 차이점 :
jsp
에선 먼저 Board board = new Board();
처럼 생성하고 바로 값을 넣어줌.
spring
에선 생성자를 만들고 각각 값을 get해준 후 list에 add한다.
🔺 try-catch를 두번 잡는다?? >> 왜일까...
🙄 다른방법도 찾아보기...
package com.oracle.oMVCBoard.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import com.oracle.oMVCBoard.dto.BDto;
public class BDao {
DataSource dataSource;
public BDao() {
try {
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/OracleDB");
} catch (NamingException e) {
System.out.println("생성자 dataSource --> " + e.getMessage());
e.printStackTrace();
}
}
public ArrayList<BDto> boardList() {
ArrayList<BDto> bList = new ArrayList<BDto>();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet rs = null;
System.out.println("BDao boardList Start ... ");
System.out.println("ArrayList<BDto> bList ----------> " + bList);
try {
connection = dataSource.getConnection();
String sql = "SELECT bId, bName, bTitle, bContent, bDate, bHit, "
+ " bGroup, bStep, bIndent "
+ "FROM mvc_board order by bGroup desc, bStep asc";
preparedStatement = connection.prepareStatement(sql);
System.out.println("BDao sql -->" + sql);
rs = preparedStatement.executeQuery();
//
while (rs.next()) {
int bId = rs.getInt("bId");
String bName = rs.getString("bName");
String bTitle = rs.getString("bTitle");
String bContent = rs.getString("bContent");
Timestamp bDate = rs.getTimestamp("bDate");
int bHit = rs.getInt("bHit");
int bGroup = rs.getInt("bGroup");
int bStep = rs.getInt("bStep");
int bIndent = rs.getInt("bIndent");
BDto dto = new BDto (bId, bName, bTitle, bContent,
bDate, bHit, bGroup, bStep, bIndent);
bList.add(dto);
System.out.println("bName ==> " + bName);
}
} catch (Exception e) {
System.out.println("list dataSource -->" + e.getMessage());
e.printStackTrace();
} finally {
try {
if(connection != null) connection.close();
if(preparedStatement != null) preparedStatement.close();
if(rs != null) rs.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return bList;
}
}