티스토리 뷰

<게시판 구현>

 

#게시판 테이블 생성 (MySQL)

create table trip (
	tno int primary key auto_increment,
    tripdate varchar(30) not null,
    writer varchar(30) not null,
    title varchar(200) not null,
    content varchar(1000),
    hit int default 0,
    regdate timestamp default now() -- 시간타입 :기본값 지금시간
);

 

# 파일들 기본 구성

*mapper 파일을 포함한 모든 xml 파일은 한곳에 몰아서 외부에 넣을것.

-먼저 root-context.xml (데이터베이스 설정파일) 에  우리가 만들 xml 파일들을 읽어올 수 있도록

 경로를 지정해주기.

 

* 맵퍼 인터페이스와 , 맵퍼 구현 xml  파일 생성

- 맵퍼 파일들 java, xml 은  꼭 동일한 이름으로 만들어주자.

- TripMapper.xml 파일 즉 맵퍼.xml 파일은 만들고 끝이 아니라 

  마이바티스에서 읽을 수 있도록 root-context.xml 에서 경로 설정을 해줘야 함.

		<!-- 매퍼파일의 위치 -->
		<property name="mapperLocations" value="classpath:/sqlmap/*.xml" />

 

 

*TripVO 생성

-lombok을 사용했기 때문에 어노테이션을 통해서 자동으로 생성자랑 겟터,셋터, toString을 만들도록 처리해줌.

package com.coding404.myweb.command;

import java.sql.Timestamp;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TripVO {

	private int tno;
	private String tripdate;
	private String writer;
	private String title;
	private String content;
	private int hit;
	private Timestamp regdate;
	
}

*NoticeController

@Controller
@RequestMapping("/trip")
public class NoticeController {

	@Autowired
	@Qualifier("tripService")
	private TripService tripService;
    
    //게시글 조회(select)
    @RequestMapping("/notice_list")
	public String notice_list(Model model) {
		
		/*
		 * service, mapper 영역에 getList 함수를 선언하고
		 * 등록번호 역순으로 데이터를 조회해서 가지고 나옵니다.
		 * model에 담아서
		 * 화면에서는 반복문으로 처리.
		 */
		
		ArrayList<TripVO> list = tripService.getList();
		model.addAttribute("list",list);
		
		return "trip/notice_list";
        
        //글등록
		@RequestMapping(value="/registForm", method = RequestMethod.POST)
		public String registForm(TripVO vo, RedirectAttributes ra) {

		int result = tripService.noticeRegist(vo);
		String msg = result == 1 ? "문의사항이 정상 등록되었습니다" : "문의 등록에 실패했습니다";
		ra.addFlashAttribute("msg", msg);
		
		return "redirect:/trip/notice_list";
		
		}
        
	}

 

#서비스 계층

* TripService.java  (인터페이스)

public interface TripService {
	
	public int noticeRegist(TripVO vo);
	public ArrayList<TripVO> getList();
}

*TripServiceImpl.java (인터페이스 구현)

@Service("tripService")
public class TripServiceImpl implements TripService{

	@Autowired
	private TripMapper tripMapper;

	@Override
	public int noticeRegist(TripVO vo) {
		return tripMapper.noticeRegist(vo);
	}

	@Override
	public ArrayList<TripVO> getList() {
		return tripMapper.getList();
		
	}
	
}

# Mapper 계층 (Mybatis)

*TripMapper.java (메서드 정의)

@Mapper
public interface TripMapper {
	
	public int noticeRegist(TripVO vo);
	public ArrayList<TripVO> getList();
}

*TripMapper.xml (mapper 구현)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
  <mapper namespace="com.coding404.myweb.trip.service.TripMapper">
  
  	<insert id="noticeRegist" parameterType="TripVO">
  		insert into trip(tripdate, writer, title, content)
  		values(#{tripdate},#{writer}, #{title}, #{content})
  	</insert>
  
  	<select id="getList" resultType="TripVO">
  		select * from trip order by tno desc;
  	</select>
  
  </mapper>

위에서  parameterType 와 resultType 의 값으로 오는 TripVO 은 원래 풀경로를 써주어야 하지만.

마이바티스의 추가 속성인 configLocation 을 이용해서 풀경로를 alias (TripVO) 로 대체해서 

TripVO 만 적어주었다.

 

root-context.xml (데이터베이스 설정파일)

	<!-- 마이바티스설정 sqlSessionFactory 빈으로 생성 -->
	<!-- classpath:/  자바/리소스 경로를 가르킵니다 -->
	<bean class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 데이터베이스 정보 전달 -->
		<property name="dataSource" ref="ds" />
		<!-- 마이바티스 설정파일 경로 -->
		<property name="configLocation" value="classpath:/mybatis-config/mybatis-config.xml" />
		<!-- 매퍼파일의 위치 -->
		<property name="mapperLocations" value="classpath:/sqlmap/*.xml" />
	</bean>
	
	<!-- 마이바티스 관련 어노테이션을 찾아서 설정으로 등록 (모든 인터페이스를 등록) -->
	<mybatis-spring:scan base-package="com.coding404.myweb.*"/>

*confit 속성을 구현하는 xml 파일 

java/resources 하위에 파일을 만들어 준다.

mybatis-config.xml

상단부에  DOCTYPE 부분 꼭 넣어줘야 함.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- 마이바티스 부연 설정 -->
  <configuration>
  	<typeAliases>
  		<typeAlias type="com.coding404.myweb.command.TripVO" alias="TripVO"/>
  	</typeAliases>
  </configuration>

 

 

notice_list.jsp 페이지

select 한 데이터 출력 부분

				<c:forEach var="content" items="${list }" >
					<tr>
						<th scope="col">번호: ${content.tno }</th>
						<th scope="col">제목: ${content.title }</th>
						<th scope="col">조회수: ${content.hit }</th>
						<th scope="col">작성일: ${content.regdate }</th>
					</tr>
				</c:forEach>

 

결과

 

 

#JSTL 사용시 주의 사항

<c:forEach var="content" items="${list }" varStatus="num" >

-위에처럼 변수의 값을 줄 때 쌍따옴표로 감싸주지 않으면 오류가 뜸. 주의하기.

- varstatus 사용법

<td>${num.count}</td>

 .count  라는 인덱스를 쓴다는 것을 알아두기. 

 

보통 게시판의 글에대한 번호를 올려줄 때는 데이터베이스의 primary 키 값(tno) 을 쓰지않음 

그래서 위에처럼 varStatus의  count 인덱스를 사용해서 화면에 보여줌.

 

* <td><fmt:formatDate value="${content.regdate }" pattern="yyyy-MM-dd"/></td> 

formatDate 태그를 사용해서 원하는 형식으로 날짜를 표현 할 수 있음.

맨 상단부에 jstl 태그를 쓰기위해서 

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 

꼭 기재해주기.

 

 

 

 

<기억할것>

  	<select id="getList" resultType="TripVO">
  		select * from trip order by tno desc;
  	</select>

resultType 는 

원래 jdbc 에서 셀렉트 구문 실행시

resultSet 이거를 대신하는 것임.

댓글