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

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

by oncerun 2020. 6. 18.
반응형

Mybatis를 이용하기 위해 메이븐에서 라이브러리를 받아야 합니다.

 

그전에는 우리는 생성할 Dao를 @Repository로 지정한 다음 컨테이너에서 스캔하도록 설정했었습니다.

 

@Repository
public class JdbcNoticeDao implements NoticeDao {

......

}

 

이안에는 DB에 맞는 드라이버를 생성하고 커넥션을 얻고 객체에다 데이터를 담아서 리턴하는 아주 긴 코드가 필요했다.

이러한 반복적인 작업을 편리하게 도와주는 Mybatis가 존재한다.

 

먼저 스프링 부트를 이용하므로 Maven에서 Mybatis라이브러리를 의존합니다.

mybatis-spring-boot-starter 추가합니다.

spring은 xml에  spring-boot는 application.properties에 커넥션에 관련된 설정을 해줍니다.

 

 

그런 다음 인터페이스인 NoticeDao에 @Mapper 애노테이션과 실행할 메서드에 필요한 SQL문을 작성합니다.

@Mapper
public interface NoticeDao {
	
	@Select("SELECT * FROM Notice ORDER BY regdate DESC LIMIT 10")
	List<NoticeView> getList() throws ClassNotFoundException, SQLException;

	Notice get(int id);

	int insert(Notice notice);

	int update(Notice notice);

	int delete(int id);
}

 

마이 바티스 스프링 연동 모듈은 다른 빈에 직접 주입할 수 있는 스레드에 안전한 매퍼를 생성할 수 있다.

@Mapper 애노테이션을 지정해주면 repository에 등록되며 mybatis가 @Mapper가 등록된 인터페이스에 접근

쿼리문을 실행해 결괏값을 가져옵니다.

 

 

 

사용자가 요청한 파라미터는 spring에서 어떻게 받아야 할까?

 

@GetMapping("list")
	public String list(HttpServletRequest request) {
		
		String p = request.getParameter("p");
		System.out.println(p);
		
		List<NoticeView> list = null;
		try {
			
			
//			String value = ctx.getBean("hi",String.class);
			list = noticeDao.getList();
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return "/notice/list";
	}

이러한 방식으로 get방식의 p에 대한 값을 얻어올 수 있습니다.

또한 또 다른 방식도 있습니다. 직접적으로 파라미터 값을 입력할 수 있습니다.

@GetMapping("list")
	public String list(String p) {
		

		System.out.println(p);
		
		List<NoticeView> list = null;
		try {
			
			
//			String value = ctx.getBean("hi",String.class);
			list = noticeDao.getList();
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return "/notice/list";
	}

신기합니다.

 

만약 p라고 전달된 파라미터값을 내가 사용할 땐 page라는 변수명으로 변경해서 사용하고 싶을 때 이렇게 코드를 작성합니다.

	@GetMapping("list")
	public String list(@RequestParam("p") String page) {
		
		System.out.println(page);
		
		List<NoticeView> list = null;
		try {
			
			
//			String value = ctx.getBean("hi",String.class);
			list = noticeDao.getList();
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return "/notice/list";
	}

 

*주의 사항 page를 문자열로 받아 정수형으로 변경하는 작업 대신 page 타입을 int로 변경해보자.

만약 int로 타입을 정해주게 되면 빈문자나, null이 오는 경우 에러가 발생할 수 있다.

 

 

수정 코드

 

@GetMapping("list")
	public String list(@RequestParam(name = "p" ,defaultValue ="1") Integer page) {
		
		System.out.println(page);
		
		List<NoticeView> list = null;
		try {
			
			
//			String value = ctx.getBean("hi",String.class);
			list = noticeDao.getList();
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return "/notice/list";
	}

 

p라는 파라미터를 기본값을 1로 설정하고 그렇지 않은 경우 요청된 값을 page변수에 저장한다.

 

 

이름이 같은 class가 IoC컨테이너에 담겼을 경우 어떻게 구분해야 하나?

설정 클래스로 지정한 경우 빈객체로 만들어질 때 클래스의 앞글자를 소문자로 변경해 등록하게 됩니다.

중첩될 경우 에러가 발생합니다.

따라서 컨트롤러에 개별 이름을 지정해 줄 수 있습니다.

 

@Controller("adminNoticeController")
@RequestMapping("/admin/board/notice/")
public class NoticeController {


	@RequestMapping("reg")//post 요청
	public String list() {
		
		
		return "/admin/board/notice/reg";
	}
}
반응형

댓글