728x90

Mapper

Mapper에서

BoardMapper, TopMenuMapper, UserMapper를 생성 후

 

 

MyBatis Mapper 인터페이스를 스프링 애플리케이션 컨텍스트에 빈으로 등록하여, 나중에 스프링의 의존성 주입을 통해 해당 Mapper 인터페이스를 사용할 수 있도록 하는 것이다.

이를 통해 SQL 쿼리를 Java 메서드로 쉽게 매핑하고, 데이터베이스와 상호작용하는 코드를 간결하게 작성할 수 있다.

 

ServletAppContext

    @Bean
    public MapperFactoryBean<BoardMapper> board_mapper(SqlSessionFactory factory) throws Exception {

       MapperFactoryBean<BoardMapper> fac =
             new MapperFactoryBean<BoardMapper>(BoardMapper.class);

       fac.setSqlSessionFactory(factory);
       return fac;
    }

    @Bean
    public MapperFactoryBean<TopMenuMapper> top_Mapper(SqlSessionFactory factory) throws Exception {

        MapperFactoryBean<TopMenuMapper> fac =
                new MapperFactoryBean<TopMenuMapper>(TopMenuMapper.class);

        fac.setSqlSessionFactory(factory);
        return fac;
    }

    @Bean
    public MapperFactoryBean<UserMapper> user_mapper(SqlSessionFactory factory) throws Exception {

        MapperFactoryBean<UserMapper> fac =
                new MapperFactoryBean<UserMapper>(UserMapper.class);

        fac.setSqlSessionFactory(factory);
        return fac;
    }


}

해당 과정과 같이 DB에 Data가 들어갈 수 있게 단계를 적용하기 위해서

 

굳이 Model(Service or DAO)를 거쳐서 매핑작업을 하는가? 하면 유지보수를 원활히 하게 하기 위함이있다. "약한 결속력"에 의함!

 

아래와 같이 패키지와 클래스, 인터페이스를 준비한다.

TopMenuMapper

package kr.bit.mapper;

import kr.bit.beans.BoardInfo;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface TopMenuMapper {

    @Select("select board_info_idx, board_info_name from board_info_table order by board_info_idx;")
    List<BoardInfo> getTopMenuList();
    // 함수 호출시 위 쿼리문이 실행됨 -> 쿼리문 결과값들이 /List에 저장됨
}

 

TopMenuDao

에서 TopMenuMapper를 @Autowired를 통해 주입받는다.

package kr.bit.dao;

import kr.bit.beans.BoardInfo;
import kr.bit.mapper.TopMenuMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class TopMenuDao {

    @Autowired
    private TopMenuMapper topMenuMapper;

    public List<BoardInfo> getTopMenuList() {
        List<BoardInfo> topMenuList = topMenuMapper.getTopMenuList();
        return topMenuList;
                // 1,2,3,4, 1팀,2팀,3팀,4팀

    }
}

 

Service 패키지 생성

 

 

 

ServletAppcontext에서 @ComponentScan에 등록해준다

@ComponentScan은 Spring 프레임워크에서 사용되는 애너테이션으로, 주로 스프링 컨텍스트가 빈(bean)으로 등록할 컴포넌트들을 검색하고 자동으로 인식하기 위해 사용된다.

 

 

TopMenuService

package kr.bit.service;

import kr.bit.beans.BoardInfo;
import kr.bit.dao.TopMenuDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TopMenuService {
    
    @Autowired
    private TopMenuDao topMenuDao; 
    
    public List<BoardInfo> getTopMenuList(){
        List<BoardInfo> topMenuList = topMenuDao.getTopMenuList();
        return topMenuList; 
    }
}

// 상단에 팀명을 띄우고 싶을 때( 상단메뉴는 어떤 주소를 눌러도 다 동작이 되야한다 -> 무엇을 요청하던 Interceptor를 거쳐야함)
// 뭘 요청하던 topmenu를 통과해야함

/java/kr.bit/

interceptor 패키지 추가

 

TopInterceptor

package kr.bit.interceptor;

import kr.bit.beans.BoardInfo;
import kr.bit.beans.User;
import kr.bit.service.TopMenuService;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

public class TopInterceptor implements HandlerInterceptor {

    private TopMenuService topMenuService;

//    @Resource(name = "loginBean")
//    private User loginBean;

    public TopInterceptor(TopMenuService topMenuService) {
        this.topMenuService = topMenuService;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        List<BoardInfo> team = topMenuService.getTopMenuList(); //select .. 1,2,1팀,2팀
        request.setAttribute("team", team);

        return true;
    }
}

 

 

ServletAppContext에 아래 코드 추가

public void addInterceptors(InterceptorRegistry re) {
    WebMvcConfigurer.super.addInterceptors(re);

    TopMenuInterceptor top = new TopMenuInterceptor(topMenuService);
    
    InterceptorRegistration re1 = re.addInterceptor(top); // TopMenuInterceptor등록
    re1.addPathPatterns("/**"); // 모든 경로로 매핑해도 다 뜨도록, 컨트롤러 전에 preHandle
}

 


상단에 팀명 띄우기

1팀 버튼을 눌렀을 때, 주소창과 화면

top_menu.jsp

추가된 부분

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value='/' var="root"/>

<nav class="navbar navbar-expand-md bg-dark text-white fixed-up shadow-lg">
	<a class=navbar-brand" href="${root }main">Board Project</a>
	<div class="container-fluid">
		<button class="navbar-toggler" type="button" data-toggle="collapse"
			data-target="#navbarNav">
			<span class="navbar-toggler-icon"></span>
		</button>
		<div class="collapse navbar-collapse" id="navbarNav">
			<ul class="navbar-nav">
			<c:forEach var="obj" items="${team }">
				<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>

			<ul class="navbar-nav ml-auto">
			
				<li class="nav-item">
				<a class="nav-link" href="${root }user/modify">Modify</a>
				</li>
				
				<li class="nav-item">
				<a class="nav-link" href="${root }user/logout">Log Out</a>
				</li>
				
				<li class="nav-item">
				<a class="nav-link" href="${root }user/login">Log In</a>
				</li>
				
				<li class="nav-item">
				<a class="nav-link" href="${root }user/join">Join Us</a>
				</li>
				
			</ul>
		</div>
	</div>
</nav>
728x90

+ Recent posts