IT 강의 정리/윤재성의 스프링 MVC5

[섹션6][미니프로젝트-상단메뉴구성] 46~47강

Nellie Kim 2022. 11. 8. 11:22
728x90

46. 상단 메뉴 구성하기(Java)

데이터베이스에서 게시판 이름들을 가져와 메뉴를 구성해보자.

상단 메뉴는 모든 요청에 대해 처리해야 하므로, Interceptor에서 처리시켜야 한다.

 

1. 이렇게 쿼리문을 구성해보자.

2. 만든 쿼리문 복사해서 TopMenuMapper인터페이스 생성 & ServletAppcontext에 추가

3. 실제로 데이터베이스에 접속해서 작업을 실행시킬 dao클래스를 만들기 & 만든TopMenuMapper인터페이스 주입받기

4. 만든 dao클래스를 또 service에 주입받기!

5. 인터셉터 만들기 & ServletAppcontext에 추가

이렇게 서비스까지 만들었으니 컨트롤러에서 서비스를 주입받아 사용하면 되는데,

지금 우리는 상단메뉴를 구성해야 하는데, 상단메뉴는 어떤 주소를 요청하든 항상 동작해야 하므로 인터셉터를 사용하자.

인터셉터에서 서비스를 주입받아서 사용하자.

여기서 주의할 점! @Autowired를 통해 자동주입 받으면 500 서버에러가 난다. 인터셉터는 자동주입불가!!

그래서 인터셉터에서 사용할 객체들은 생성자로 주입받아야 한다.

request에 담겨졌기 때문에 모든 jsp가 사용할 수 있게 된다.

인터셉터 만들었으면 ServletAppContext에 등록하기. addInterceptors메소드 오버라이딩.

모든 하위경로에 인터셉터 동작하도록 reg1.addPathPatterns("/**"); 로 작성하기

ServletAppContext 코드

// Spring MVC 프로젝트에 관련된 설정을 하는 클래스
@Configuration
// Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
@EnableWebMvc
// 스캔할 패키지를 지정한다.
@ComponentScan("kr.co.softcampus.controller")
@ComponentScan("kr.co.softcampus.dao")
@ComponentScan("kr.co.softcampus.service")

@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer{
	
	@Value("${db.classname}")
	private String db_classname;
	
	@Value("${db.url}")
	private String db_url;
	
	@Value("${db.username}")
	private String db_username;
	
	@Value("${db.password}")
	private String db_password;
	
	@Autowired
	private TopMenuService topMenuService;
	
	// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다.
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/", ".jsp");
	}
	
	// 정적 파일의 경로를 매핑한다.
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}
	
	// 데이터베이스 접속 정보를 관리하는 Bean
	@Bean
	public BasicDataSource dataSource() {
		BasicDataSource source = new BasicDataSource();
		source.setDriverClassName(db_classname);
		source.setUrl(db_url);
		source.setUsername(db_username);
		source.setPassword(db_password);
		
		return source;
	}
	
	// 쿼리문과 접속 정보를 관리하는 객체
	@Bean
	public SqlSessionFactory factory(BasicDataSource source) throws Exception{
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
		factoryBean.setDataSource(source);
		SqlSessionFactory factory = factoryBean.getObject();
		return factory;
	}
	
	// 쿼리문 실행을 위한 객체(Mapper 관리)
	@Bean
	public MapperFactoryBean<BoardMapper> getBoardMapper(SqlSessionFactory factory) throws Exception{
		MapperFactoryBean<BoardMapper> factoryBean = new MapperFactoryBean<BoardMapper>(BoardMapper.class);
		factoryBean.setSqlSessionFactory(factory);
		return factoryBean;
	}
	
	@Bean
	public MapperFactoryBean<TopMenuMapper> getTopMenuMapper(SqlSessionFactory factory) throws Exception{
		MapperFactoryBean<TopMenuMapper> factoryBean = new MapperFactoryBean<TopMenuMapper>(TopMenuMapper.class);
		factoryBean.setSqlSessionFactory(factory);
		return factoryBean;
	}
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.addInterceptors(registry);
		
		TopMenuInterceptor topMenuInterceptor = new TopMenuInterceptor(topMenuService);
		
		InterceptorRegistration reg1 = registry.addInterceptor(topMenuInterceptor);
		reg1.addPathPatterns("/**");
	}
}

 

 

6. top_menu.jsp에서 출력하기

아래의 코드를 수정하기.

<ul class="navbar-nav">
    <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>
</ul>

<c:forEach> 를 사용해 items의 수만큼 반복해서 <li>태그 만들어서 사용하도록 수정. 

<ul class="navbar-nav">
    <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>
</ul>

실행후 페이지소스보기 하면 아래와 같이 잘 주입되었다.

 

47. 상단 메뉴 구성하기(Xml)

데이터베이스, 인터셉터의 작업이 조금 다르다.

 

 

출처 : [인프런] 윤재성의 만들면서 배우는 Spring MVC 5