반응형
다오를 인터페이스로 구현합니다.
public interface NoticeDao {
List<NoticeView> getList() throws ClassNotFoundException, SQLException;
Notice get(int id);
int insert(Notice notice);
int update(Notice notice);
int delete(int id);
}
JDBC를 이용해 데이터베이스를 관리하다 Mybatis로 변경할 일이 생겼습니다.
그럼 Service를 구현하는 곳에서 Dao 객체를 변경해야 합니다.
프로젝트의 크기가 거대하다면 소스코드의 변경에 대한 작업이 상당히 큰 비중을 차지할 수 돼있습니다.
그러하기에 변경될 수 있는 부품들을 외부 설정으로 변경할 수 있도록 코드를 작성합니다.
package com.newlecture.web.controller;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.newlecture.web.dao.NoticeDao;
import com.newlecture.web.entity.NoticeView;
@Controller
@RequestMapping("/notice/")
public class NoticeController {
@Autowired
private NoticeDao noticeDao; //생성되는 객체가 변경되어야함
@GetMapping("list")
public String list() throws ClassNotFoundException, SQLException {
List<NoticeView> list = noticeDao.getList();
return "notice/list";
}
@GetMapping("detail")
public String detail() {
return "notice/detail";
}
}
그전에 애노테이션으로 빈 객체를 Ioc에 담아주는 작업을 해야 합니다.
@Repository
public class JdbcNoticeDao implements NoticeDao{
@Override
public List<NoticeView> getList() throws ClassNotFoundException, SQLException {
int page = 1;
List<NoticeView> list = new ArrayList<NoticeView>();
int index = 0;
String sql = "SELECT * FROM Notice ORDER BY regdate DESC LIMIT 10 OFFSET ?";// WHERE NUM BETWEEN 1 AND 10";
String url = "jdbc:mysql://dev.notepubs.com:9898/newlecture?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC";
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection(url, "newlecture", "111");
PreparedStatement st = con.prepareStatement(sql);
st.setInt(1, (page-1)*10); // 1->0,2->10,3->20,30,40,...
ResultSet rs = st.executeQuery();
while (rs.next()) {
NoticeView noticeView = new NoticeView(
rs.getInt("ID"),
rs.getString("TITLE"),
rs.getString("writerId"),
rs.getString("CONTENT"),
rs.getDate("REGDATE"),
rs.getInt("HIT"),
rs.getString("FILES"),
rs.getBoolean("PUB")
//rs.getString("WRITER_NAME"),
//rs.getInt("CMT_COUNT")
);
System.out.println(noticeView);
list.add(noticeView);
}
rs.close();
st.close();
con.close();
return list;
}
@Repository 애노테이션으로 IoC컨테이너에 객체를 생성해 둡니다.
@Autowired
private NoticeDao noticeDao;
@Autowired는
직접적으로 xml파일에 설정하지 않고 애노테이션 설정으로 생성될 객체를 지정해 줄 수 있습니다.
자동으로 IoC에서 NoticeDao타입의 jdbcNoticeDao 객체를 찾아 생성해주어 참조시킵니다.
@Contorller는 view가 존재하는 경우 매핑해 사용하는 것으로 배웠습니다.
다만 구현한 메서드들 중 몇 개만 직접적으로 body값으로 웹에 출력해야 한다면 어떻게 해야 할까요
@ResponseBody는 부단이 없고 직접적으로 출력을 하도록 하는 애너테이션입니다.
@ResponseBody
@GetMapping("list")
public List<NoticeView> list() {
List<NoticeView> list = null;
try {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(JdbcNoticeDao.class);
noticeDao = ctx.getBean(NoticeDao.class);
// String value = ctx.getBean("hi",String.class);
list = noticeDao.getList();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
반응형
'웹 프로그래밍 기초 > 자바기반의 웹&앱 응용SW 개발자' 카테고리의 다른 글
자바기반의 웹&앱 응용 SW개발자 양성과정 68일차 -103 (0) | 2020.06.18 |
---|---|
자바기반의 웹&앱 응용 SW개발자 양성과정 68일차 -102 (0) | 2020.06.18 |
자바기반의 웹&앱 응용 SW개발자 양성과정 67일차 -100 (0) | 2020.06.17 |
자바기반의 웹&앱 응용 SW개발자 양성과정 67일차 -99 (0) | 2020.06.17 |
자바기반의 웹&앱 응용 SW개발자 양성과정 66일차 -98 (0) | 2020.06.16 |
댓글