상단메뉴를 클릭하면 각 게시판에 맞는 게시판 메인 페이지가 나오도록 하자.
board_info_table에서 idx와 name을 가져오기 위해, TopMenuMapper라는 매퍼를 만들어 정보를 가져오자.
public interface TopMenuMapper {
@Select("select board_info_idx, board_info_name " +
"from board_info_table " +
"order by board_info_idx")
public List<BoardInfoBean> getTopMenuList();
}
BoardInfoBean들을 리스트로 반환한다.
ServletAppContext에 이 매퍼를 등록하자.
@Bean
public MapperFactoryBean<TopMenuMapper> getTopMenuMapper(SqlSessionFactory factory) throws Exception{
MapperFactoryBean<TopMenuMapper> factoryBean = new MapperFactoryBean<TopMenuMapper>(TopMenuMapper.class);
factoryBean.setSqlSessionFactory(factory);
return factoryBean;
}
등록이 끝났으면 dao와 service를 생성해서 정보를 가져오고 처리하자.
TopMenuDao를 생성한다.
@Repository
public class TopMenuDao {
@Autowired
private TopMenuMapper topMenuMapper;
public List<BoardInfoBean> getTopMenuList(){
List<BoardInfoBean> list = topMenuMapper.getTopMenuList();
return list;
}
}
@Repository : @Component와 동일하지만 역할을 명시하기 위함이다.
TopMenuService도 등록한다.
@Service
public class TopMenuService {
@Autowired
private TopMenuDao topMenuDao;
public List<BoardInfoBean> getTopMenuList(){
List<BoardInfoBean> list = topMenuDao.getTopMenuList();
return list;
}
}
dao와 service를 scan할 수 있게 ServletAppContext에 등록하자.
@ComponentScan("kr.co.choboard.dao")
@ComponentScan("kr.co.choboard.service")
위 구문을 클래스 위에 써주면 두 패키지를 스캔하게 되고 bean을 자동으로 주입하게 된다.
TopMenu는 웹 사이트의 모든 곳에서 사용하므로 interceptor를 이용해 처리하자.
TopMenuService를 이용하는 TopMenuInterceptor를 선언하자.
모든 요청에 대해 topMenuList를 가져오고 request영역에 topMenuList란 이름으로 attribute를 등록한다.
public class TopMenuInterceptor implements HandlerInterceptor{
@Autowired
private TopMenuService topMenuService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
List<BoardInfoBean> list = topMenuService.getTopMenuList();
request.setAttribute("topMenuList", list);
return true;
}
}
이 인터셉터를 다시 ServletAppContext에 등록하자.
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
TopMenuInterceptor topMenuInterceptor = new TopMenuInterceptor();
InterceptorRegistration reg1 = registry.addInterceptor(topMenuInterceptor);
reg1.addPathPatterns("/**");
}
addInterceptors를 치면 자동완성이 뜬다. topMenuInterceptor를 등록해주고, 경로는 모든 경로인 /**로 하자.
이제 jsp를 변경해주자.
<c:forEach var='obj' items='${topMenuList}'>
<li class="nav-item">
<a href="${root }board/main?board_info_idx=${obj.board_info_idx}" class="nav-link">${obj.board_info_name }</a>
</li>
</c:forEach>
<!--------------------------경계선------------------------->
<li class="nav-item">
<a href="${root}board/main" class="nav-link">자유게시판</a>
</li>
<li class="nav-item">
<a href="${root}board/main" class="nav-link">정보게시판</a>
</li>
<li class="nav-item">
<a href="${root}board/main" class="nav-link">맛집게시판</a>
</li>
<li class="nav-item">
<a href="${root}board/main" class="nav-link">비밀게시판</a>
</li>
경계썬을 기준으로 아래는 원래 코드이고 위가 변경된 코드이다. jstl의 tag를 이용해 topMenuList로 들어온 각각의 BoardInfoBean의 idx와 name을 페이징에 활용한다.
이제 코드를 실행해보면.... 오류가 뜬다.
이유는 interceptor 때문이다. interceptor는 autowired를 이용한 자동 주입이 안 된다.
따라서 생성자에서 직접 주입을 해야한다.
private TopMenuService topMenuService;
public TopMenuInterceptor(TopMenuService topMenuService) {
this.topMenuService = topMenuService;
}
topMenuService 위에 있던 Autowired를 지우고 이렇게 수정하자.
그리고 ServletAppContext에서 interceptor 생성자에 service를 주입한다.
autowired를 이곳에서 써주고 interceptor에 주입하자.
@Autowired
private TopMenuService topMenuService;
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
TopMenuInterceptor topMenuInterceptor = new TopMenuInterceptor(topMenuService);
InterceptorRegistration reg1 = registry.addInterceptor(topMenuInterceptor);
reg1.addPathPatterns("/**");
}
이제 오류없이 코드가 돌아갈 것이다.
자유게시판을 클릭했더니 위와같이 주소가 제대로 뜬 것을 확인할 수 있다.
겪은 오류들
1. db오류가 떴는데 접속 sid 정보가 잘못되었다고 했다. url이 orcl이 아닌 xe였고, 고쳤더니 해결되었다.
db.url = jdbc:oracle:thin:@localhost:1521:orcl
<!-- 오류 전, 오류 수정 후->
db.url = jdbc:oracle:thin:@localhost:1521:xe
2. mapper의 select문 오류
평범하게 sql을 쓰는 것 처럼 구문 맨 끝에 ;를 붙였더니 오류가 떴다.
그리고 각 줄이 끝날때 공백을 한 칸 포함시켜야 한다. 공백이 없을 경우
select *from tablewhere idx1=idx2
이런식으로 수행되는 것 과 같다. 따라서 꼭 공백을 포함시켜 select * from table where idx 이렇게 실행하자.
@Select("select board_info_idx, board_info_name " +
"from board_info_table " +
"order by board_info_idx")
'프로젝트 > 게시판미니프로젝트' 카테고리의 다른 글
[프로젝트] 회원가입 - 아이디 중복 확인, 회원 가입 정보 저장 (0) | 2020.05.08 |
---|---|
[프로젝트] 회원가입 관리 (0) | 2020.05.07 |
[프로젝트] 데이터베이스 테이블 & Mybatis 초기 설정 (0) | 2020.05.06 |
[프로젝트] 상단 메뉴 기본 구조 설정 (0) | 2020.05.06 |
[프로젝트] Spring 프로젝트 초기 설정 (0) | 2020.05.05 |