com.demo.domin생성
BoardInfoVO생성
package com.demo.domain;
public class BoardinfoVO {
//
// -- 보드정보 테이블(번호, 게시판 이름)
//
// create table board_info(
// info_idx int AUTO_INCREMENT, -- 게시판 정보 번호
// board_name varchar(500) not null, -- 게시판 이름
// primary key(info_idx)
// );
private int info_idx;
private String board_name;
//게터 세터 생성
public int getInfo_idx() {
return info_idx;
}
public void setInfo_idx(int info_idx) {
this.info_idx = info_idx;
}
public String getBoard_name() {
return board_name;
}
public void setBoard_name(String board_name) {
this.board_name = board_name;
}
}
UserVO 생성
package com.demo.domain;
public class UserVO {
// -- 사용자 테이블
// create table user(
// user_idx int AUTO_INCREMENT,
// name varchar(50) not null,
// user_id varchar(100) not null,
// user_pw varchar(100) not null,
// primary key(user_idx)
// );
//
private int user_idx;
private String name;
private String user_id;
private String user_pw;
//게터 세터 생성
public int getUser_idx() {
return user_idx;
}
public void setUser_idx(int user_idx) {
this.user_idx = user_idx;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getUser_pw() {
return user_pw;
}
public void setUser_pw(String user_pw) {
this.user_pw = user_pw;
}
}
BoardVO생성
package com.demo.domain;
import java.util.Date;
public class BoardVO {
//
// -- 보드 테이블
// create table board(
// board_idx int AUTO_INCREMENT,
// title varchar(500) not null,
// content text not null,
// content_file varchar(500) not null,
// writer_idx int , -- user_idx 참조 (외래키)
// info_idx int, -- info_idx 참조 (외래키)
// regDate datetime,
// primary key(board_idx)
// );
private int board_idx; //글번호
private String title; //제목
private String content; //글내용
private String content_file; //이미지 파일 이름
private int writer_idx; //글쓴이
private int info_idx; //게시판이름
private Date regDate; //작성날짜
//게터 세터 생성
public int getBoard_idx() {
return board_idx;
}
public void setBoard_idx(int board_idx) {
this.board_idx = board_idx;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getContent_file() {
return content_file;
}
public void setContent_file(String content_file) {
this.content_file = content_file;
}
public int getWriter_idx() {
return writer_idx;
}
public void setWriter_idx(int writer_idx) {
this.writer_idx = writer_idx;
}
public int getInfo_idx() {
return info_idx;
}
public void setInfo_idx(int info_idx) {
this.info_idx = info_idx;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
}
pom.xml에서 db연결을 위한 라이브러리 추가(test하단에 추가)
<!-- database -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- commons-dbcp2 : 커넥션 풀 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- log4jdbc-log4j2-jdbc4 : SQL 실행 시 로그 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
root-context.xml 추가
<!-- 데이터소스에 DB연결 정보를 입력 -->
<bean id="dataSource"
class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mini?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
<!-- MyBatis sql세션팩토리 객체(데이터 소스 주입) 위의 datasource가 주입 됨 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations"
value="classpath:/mappers/**/*.xml" />
</bean>
<!-- sql팩토리 주입하여 sql메서드 실행 객체 -->
<bean id="sqlSessionTemplate"
class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
데이터베이스 스키마 생성했으므로 이름 변경이 필요함 -> mini
mappers 폴더
설정하고 실행해본다. 오류나는지?
boardMapper.xml 복사해서 menuMapper.xml생성
<!-- 전체 메뉴 리스트 출력 -->
<select id="menuList" resultType="com.demo.domain.BoardinfoVO">
SELECT info_idx,board_name
FROM board_info
ORDER BY info_idx
</select>
menuDAO생성
package com.demo.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.demo.domain.BoardinfoVO;
@Repository
public class MenuDAO {
@Autowired
private SqlSessionTemplate sqlTemplate;
//전체 메뉴 리스트
public List<BoardinfoVO> getMenuList() {
return sqlTemplate.selectList("menu.menuList");
}
}
menuService
package com.demo.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.demo.dao.MenuDAO;
import com.demo.domain.BoardinfoVO;
@Service
public class MenuService {
@Autowired
private MenuDAO menuDao;
//전체 메뉴 리스트
public List<BoardinfoVO> getMenuList(){
return menuDao.getMenuList();
}
}
servlet-context.xml 에 어노테이션 인식을 위한 추가 설정
에러나는지 확인하기
com.demo.interceptor
package com.demo.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import com.demo.service.MenuService;
public class MenuInterceptor implements HandlerInterceptor{
//@AutoWired 는 필드 주입방법임
private MenuService menuService;
// 좀 더 권장하는 방법이긴함
//생성자 주입 () 아무것도 안적어도 스프링 프레임 워크에서 자동으로 입력됨
public MenuInterceptor(MenuService menuService) {
this.menuService = menuService;
}
//prehandle override
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 인터셉터는 요청에 먼저 실행되어 작업을 하고 만약 리턴이 false가 되면 요청을 취소한다.
request.setAttribute("topMenuList", menuService.getMenuList());//메뉴리스트를 topmenulist에 담아줌
return true;
}
}
preHandle은 실행되기 전에 작업을 한다.
menulist를 가져와서 request에 담아서 전달하는 역할을 한다.
이 작업을 하는 인터셉터를 만들었고, 해당 인터셉터를 등록해야하는데
등록은 servlet -context에 등록한다.
servlet-context.xml 하단에 아래의 내용 추가
<!--인터셉터 객체 등록-->
<beans:bean id="MenuInterceptor" class="com.demo.interceptor.MenuInterceptor">
<beans:constructor-arg>
<beans:bean class="com.demo.service.MenuService"></beans:bean>
</beans:constructor-arg>
</beans:bean>
<!--인터셉터 설정-->
<interceptors>
<interceptor>
<mapping path="/**"/>
<beans:ref bean="MenuInterceptor"/>
</interceptor>
</interceptors>
또는 상세하게
<!--인터셉터 설정-->
<interceptors>
<interceptor>
<mapping path="/"/>
<mapping path="/board/*"/>
<mapping path="/user/*"/>
<beans:ref bean="MenuInterceptor"/>
</interceptor>
</interceptors>
해당 인터셉터는 service객체가 필요하다.
그래서 bean service 객체를 가져와서 생성자에 넣어서 등록을 했음.
mapping 주소
/**/ 모든 주소에 MenuInterceptor를 실행하라는 뜻임
인터셉터란? https://popo015.tistory.com/115
menu.jsp
반복문 사용으로 메뉴 불러오기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="root" value="${pageContext.request.contextPath}"/>
<!-- 상단 메뉴 부분 -->
<nav
class="navbar navbar-expand-md bg-dark navbar-dark fixed-top shadow-lg">
<a class="navbar-brand" href="${root}/">🚀busanIT</a>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navMenu">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navMenu">
<ul class="navbar-nav">
<c:forEach var="menu" items="${topMenuList}">
<li class="nav-item"><a href="${root}/board/main?info_idx=${menu.info_idx}" class="nav-link">${menu.board_name}</a>
</li>
</c:forEach>
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item"><a href="${root}/user/login" class="nav-link">로그인</a>
</li>
<li class="nav-item"><a href="${root}/user/join" class="nav-link">회원가입</a>
</li>
<li class="nav-item"><a href="${root}/user/modify" class="nav-link">정보수정</a>
</li>
<li class="nav-item"><a href="${root}/user/logout" class="nav-link">로그아웃</a>
</li>
</ul>
</div>
</nav>
'BACKEND > Spring' 카테고리의 다른 글
게시판 만들기 2 - 아이디 중복 검사 (0) | 2023.10.27 |
---|---|
게시판 만들기 2 - 유효성 검사 (0) | 2023.10.27 |
게시판 만들기 2 - 테이블 만들기(DB) (0) | 2023.10.26 |
게시판 만들기 2 - BoardController, board(read,modify,write,delete.jsp)페이지 생성 (0) | 2023.10.26 |
게시판 만들기 2 - context path, user(login,logout,modify,join.jsp) (1) | 2023.10.26 |