본문 바로가기
웹 프로그래밍 기초/자바기반의 웹&앱 응용SW 개발자

자바기반의 웹&앱 응용 SW개발자 양성과정 67일차 -101

by oncerun 2020. 6. 17.
반응형

다오를 인터페이스로 구현합니다.

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;
	}

 

 

 

반응형

댓글