v5
★ LAB · BOARD

최소 게시판

회원과 게시판 — 실습

📍 지금 어디를 만지고 있나요?
브라우저
회원과 게시판
DB

사전 준비

이번 실습의 목표

글 쓰기와 목록 보기까지만. 의도적으로 인가 없음 — 다음 차시의 동기.

1
테이블 생성 + 도메인 작성
-- MySQL Workbench 에서
CREATE TABLE myboard (
    num     INT          PRIMARY KEY AUTO_INCREMENT,
    title   VARCHAR(100) NOT NULL,
    writer  VARCHAR(50)  NOT NULL,
    content TEXT         NOT NULL
);

// com/smhrd/domain/Board.java
@Data @AllArgsConstructor @NoArgsConstructor
public class Board {
    private int    num;
    private String title;
    private String writer;
    private String content;
}
CHECKPOINT
  • MySQL SHOW COLUMNS FROM myboard; 로 4 컬럼 확인 — created_at, view_count 같은 컬럼이 없는지 다시 본다.
  • Board 클래스에 빨간 줄(컴파일 오류)이 없는가?
2
Mapper / Service / Controller
// com/smhrd/mapper/BoardMapper.java
@Mapper
public interface BoardMapper {
    List<Board> selectList();
    Board selectOne(int num);
    void insert(Board b);
}

<!-- BoardMapper.xml -->
<mapper namespace="com.smhrd.mapper.BoardMapper">
  <select id="selectList" resultType="com.smhrd.domain.Board">
    SELECT num, title, writer, content FROM myboard ORDER BY num DESC
  </select>
  <select id="selectOne" parameterType="int"
          resultType="com.smhrd.domain.Board">
    SELECT num, title, writer, content FROM myboard WHERE num = #{num}
  </select>
  <insert id="insert" parameterType="com.smhrd.domain.Board"
          useGeneratedKeys="true" keyProperty="num">
    INSERT INTO myboard(title, writer, content)
    VALUES(#{title}, #{writer}, #{content})
  </insert>
</mapper>

// BoardController
@Controller @RequestMapping("/board")
public class BoardController {
    @Autowired BoardService service;

    @GetMapping("/list")
    public String list(Model model) {
        model.addAttribute("boards", service.selectList());
        return "board/list";
    }
    @GetMapping("/view")
    public String view(@RequestParam int num, Model model) {
        model.addAttribute("board", service.selectOne(num));
        return "board/view";
    }
    @PostMapping("/write")
    public String write(Board b, HttpSession session) {
        Member u = (Member) session.getAttribute("loginUser");
        b.setWriter(u.getId());
        service.insert(b);
        return "redirect:/board/list";
    }
}
CHECKPOINT
  • Mapper namespace 가 인터페이스의 풀 클래스명 (com.smhrd.mapper.BoardMapper) 과 일치하는가?
  • SELECT 절에 num, title, writer, content 4 컬럼만 있는가?
3
JSP + 실행
<!-- write.jsp -->
<form action="/board/write" method="post">
    <input name="title" required />
    <textarea name="content"></textarea>
    <button>저장</button>
</form>

<!-- list.jsp -->
<c:forEach var="b" items="${boards}">
    <tr>
        <td>${b.num}</td>
        <td><a href="/board/view?num=${b.num}">${b.title}</a></td>
        <td>${b.writer}</td>
    </tr>
</c:forEach>

Run on Server 로 실행하고 글 1 개를 작성한다.

CHECKPOINT
  • MyBatis SQL 로그에 INSERT INTO myboard(title, writer, content) 가 찍혔는가?
  • MySQL 에서 SELECT * FROM myboard; 결과가 1 행 — 4 컬럼만 채워졌는가?
  • 목록 화면에 ${b.writer} 가 로그인 ID 로 보이는가?

실습 완료 체크리스트

myboard 테이블이 4 컬럼만 (num, title, writer, content)
Board 클래스가 4 필드만
Mapper namespace = com.smhrd.mapper.BoardMapper
폼의 name 과 Board 필드명이 일치
인가 없음 = 다음 차시의 동기 (의도된 위험)