이번 주는 하반기 공채가 무척 많이 올라와 정신 없이 바쁜 일주일을 보냈습니다 🤣
처음 쓰는 자기소개서는 무척이나 어렵고, 방향을 잡기가 어려웠는데요 !
KB IT's Your Life에서는 원티드 전문 컨설턴트님과 함께 취업 컨설팅을 진행한다는 사실 ! ( 컨설턴트님들 경력이 정말 빠방합니다 ..)

원래는 교육이 다 끝난 후 서류를 제출하며 본격적인 취업 시장에 뛰어드려했으나, 취업 컨설턴트님 권유로 하반기 서류를 하나하나 제출하기 시작했습니다 ! 실제로, 컨설팅을 받으니 직접적으로 많은 도움이 되었습니다. (tmi 처음으로 서류합격 메일을 받아봤어요 ㅎㅎ ) 다음에 기회가 된다면, 컨설팅 관련 내용을 담아 포스팅 해보겠습니다 :)
오늘은 게시판 작성 코드에 대해 자세히 적어볼게요

✔ 게시판 작성 순서
전체적으로 MVC 패턴으로 처음 코드를 짤 때, 순서가 헷갈렸는데요 . 게시판을 예시로 순서를 한번 나열해보겠습니다.
1. 데이터베이스 연동하기
2. VO 작성하기
3. mapper 작성하기
4. Service 코드 작성하기
5. Controller 작성하기
6. JSP와 연결하기 !
오늘 작성해볼 코드는 2단계부터 5단계까지 살펴볼 예정입니다 Let's Start ~~ 🏍
✔ 코드 구조 살펴보기

✔ VO 작성하기

위의 데이터베이스 바탕으로 VO 코드를 작성해보겠습니다 !
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Board {
private long bno;
private String title;
private String content;
private String writer;
private String createDate;
private String modifyDate;
}
✔ mapper 작성하기
그 후, 우리가 게시판에서 작성할 내용을 BoardMapper 인터페이스에 정리해볼게요 !
@Mapper
public interface BoardMapper {
List<Board> selectAll();
Board selectByBno(long bno);
int inserBoard(Board board);
int updateBoard(Board board);
int deleteBoard(long board);
}
BoardMapper 인터페이스만 보아도 우리가 작성할 기능들을 알 수 있습니다 !
- selectAll() : 전체 게시글 검색
- 리턴 타입 : List<Board>
- selectByBno(): 게시물 상세 내용
- 리턴 타입 : Board
- 매개 변수: bno (long 타입)
- insertBoard(): 게시물 작성
- 리턴 타입 : int
- 매개 변수: board
- updateBoard(): 게시물 수정
- 리턴 타입 : int
- 매개 변수: board
- deleteBoard(): 게시물 삭제
- 리턴 타입: int
- 매개 변수: bno
이제, BoardMapper.xml 을 작성해봅시다 !
MyBatis의 Mapper XML 파일은 XML 형식으로 SQL 쿼리와 매핑 정보를 정의하는데 사용됩니다.

1. XML 파일 구조
<?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.multi.mvc.board.mapper.BoardMapper">
...
</mapper>
- namespace: 해당 매퍼의 고유 이름 공간을 정의합니다. 이 이름은 Java 인터페이스와 매핑됩니다.
2. SQL 쿼리 정의하기
2.1. SELECT 쿼리
<select id="selectAll" resultType="com.multi.mvc.board.vo.Board">
select * from board order by bno desc;
</select>
<select id="selectByBno" resultType="com.multi.mvc.board.vo.Board" parameterType="long">
select * from board where bno=#{bno}
</select>
- id: 쿼리를 호출할 때 사용할 고유 식별자입니다.
- resultType: 쿼리 결과를 매핑할 Java 클래스의 경로를 지정합니다.
- parameterType: 메서드에 전달되는 매개변수의 타입을 정의합니다. 여기서는 long 타입을 사용하고 있습니다.
2.2. INSERT 쿼리
<insert id="insertBoard">
<selectKey keyProperty="bno" resultType="long" order="AFTER">
select last_insert_id() as bno;
</selectKey>
insert into board (bno, title, content, writer, create_date, modify_date)
values (default, #{title}, #{content}, #{writer}, now(), default);
</insert>
- selectKey: 새로운 레코드가 삽입된 후 생성된 키를 가져오는 데 사용됩니다. keyProperty는 결과를 저장할 객체의 속성을 지정합니다.
2.3. UPDATE 쿼리
<update id="updateBoard" parameterType="com.multi.mvc.board.vo.Board">
update board set title=#{title}, content=#{content}, modify_date=now()
where bno=#{bno}
</update>
- parameterType: 업데이트할 Board 객체를 매개변수로 지정합니다. 이 객체에서 필요한 속성을 추출하여 SQL 쿼리에 매핑합니다.
2.4. DELETE 쿼리
<delete id="deleteBoard" parameterType="long">
delete from board where bno=#{bno}
</delete>
- parameterType: 삭제할 게시글 번호를 매개변수로 받습니다.
3. BoardMapper.xml 전체 코드
<?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.multi.mvc.board.mapper.BoardMapper">
<select id="selectAll" resultType="com.multi.mvc.board.vo.Board" >
select * from board order by bno desc
</select>
<select id="selectByBno" resultType="com.multi.mvc.board.vo.Board"
parameterType="long">
select * from board where bno = #{bno}
</select>
<insert id="insertBoard">
<selectKey keyProperty="bno" resultType="long" order="AFTER">
select last_insert_id() as bno;
</selectKey>
INSERT INTO board
(bno, title, content, writer, create_date, modify_date)
VALUES
(default, #{title}, #{content}, #{writer}, now(), default);
</insert>
<update id="updateBoard" parameterType="com.multi.mvc.board.vo.Board">
update board set
title=#{title}, content=#{content}, modify_date = current_timestamp
where bno = #{bno}
</update>
<update id="deleteBoard" parameterType="long">
delete from board where bno = #{bno}
</update>
</mapper>
✔ Service 코드 작성하기
1. 클래스 정의 및 어노테이션
@Log4j
@Service
public class BoardService {
@Setter(onMethod_ = @Autowired)
private BoardMapper mapper;
}
- @Service 어노테이션을 통해 이 클래스가 서비스 레이어의 컴포넌트임을 나타냅니다.
- @Autowired를 사용하여 BoardMapper를 자동 주입합니다.
2. 게시글 목록 조회
public List<Board> getAllList() {
return mapper.selectAll();
}
- getAllList 메소드는 모든 게시글을 조회하여 리스트로 반환합니다. BoardMapper의 selectAll 메소드를 호출합니다.
3. 게시글 개별 조회
public Board getBoard(long bno) {
return mapper.selectByBno(bno);
}
- getBoard 메소드는 게시글 번호(bno)를 기준으로 특정 게시글을 조회합니다.
4. 게시글 작성
public Board write(Board board) {
int result = mapper.insertBoard(board);
System.out.println("@@ : " + board);
return getBoard(board.getBno());
}
- write 메소드는 새로운 게시글을 데이터베이스에 삽입합니다. 삽입 후, 게시글을 조회하여 반환합니다.
5. 게시글 수정
public Board update(Board board) {
int result = mapper.updateBoard(board);
if(result > 0) {
return mapper.selectByBno(board.getBno());
} else {
return null;
}
}
- update 메소드는 게시글 정보를 수정하고, 성공적으로 수정되면 수정된 게시글을 반환합니다.
6. 게시글 삭제
public Board delete(long bno) {
Board board = getBoard(bno);
int result = mapper.deleteBoard(bno);
if(result > 0) {
return board;
} else {
return null;
}
}
- delete 메소드는 게시글을 삭제하고, 삭제된 게시글 정보를 반환합니다.
📌 Service 전체 코드
package com.multi.mvc.board.service;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
import com.multi.mvc.board.vo.Board;
import com.multi.mvc.board.mapper.BoardMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Log4j
@Service
public class BoardService{
@Setter(onMethod_ = @Autowired)
private BoardMapper mapper;
public List<Board> getAllList() {
return mapper.selectAll();
}
public Board getBoard(long bno) {
return mapper.selectByBno(bno);
}
public Board write(Board board) {
int result = mapper.insertBoard(board);
System.out.println("@@ : " + board);
return getBoard(board.getBno());
}
public Board update(Board board) {
int result = mapper.updateBoard(board);
if(result > 0){
return mapper.selectByBno(board.getBno());
}else{
return null;
}
}
public Board delete(long bno) {
Board board = getBoard(bno);
int result = mapper.deleteBoard(bno);
if(result > 0){
return board;
}else{
return null;
}
}
}
✔ Controller 작성하기
1. 클래스 정의 및 어노테이션
@Controller
@Log4j
@RequestMapping("/board")
public class BoardController {
@Setter(onMethod_ = @Autowired)
private BoardService service;
}
- @Controller 어노테이션을 통해 이 클래스가 웹 요청을 처리하는 컨트롤러임을 나타냅니다.
- @RequestMapping("/board")는 모든 요청이 /board 경로로 시작함을 정의합니다.
- BoardService를 자동 주입하여 서비스 레이어와의 의존성을 설정합니다.
2. 게시글 목록 조회
@GetMapping("/list")
public String list(Model model) {
List<Board> list = service.getAllList();
model.addAttribute("list", list);
return "board/boardList";
}
- list 메소드는 GET 요청으로 /board/list 경로에 매핑됩니다.
- 서비스에서 모든 게시글을 조회하여 모델에 추가한 후, boardList 뷰로 이동합니다.
3. 게시글 상세 조회
@GetMapping("/view")
public String view(Model model, long bno) {
Board board = service.getBoard(bno);
model.addAttribute("board", board);
return "board/boardView";
}
- view 메소드는 특정 게시글을 조회하여 boardView 뷰로 전달합니다.
4. 게시글 작성 페이지
@GetMapping("/write")
public String writePage() {
return "board/boardWrite";
}
- writePage 메소드는 게시글 작성 페이지로 이동합니다.
5. 게시글 작성 처리
@PostMapping("/write")
public String write(Model model, Board board) {
Board result = service.write(board);
if(result == null) {
return "redirect:/board/list";
}
return "redirect:/board/view?bno=" + result.getBno();
}
- write 메소드는 POST 요청으로 작성된 게시글을 처리합니다.
- 작성 후, 게시글 목록으로 리다이렉트하거나 작성된 게시글 상세 페이지로 이동합니다.
6. 게시글 수정 페이지
@GetMapping("/update")
public String update(@RequestParam("bno") long bno, Model model) {
Board board = service.getBoard(bno);
model.addAttribute("board", board);
return "board/boardUpdate";
}
- update 메소드는 게시글 수정 페이지로 이동하며, 수정할 게시글 정보를 모델에 추가합니다.
7. 게시글 수정 처리
@PostMapping("/update")
public String update(Board board) {
Board result = service.update(board);
if(result == null) {
return "redirect:/board/list";
}
return "redirect:/board/view?bno=" + result.getBno();
}
- 수정된 게시글 정보를 처리하고, 성공적으로 수정되면 게시글 상세 페이지로 리다이렉트합니다.
8. 게시글 삭제
@RequestMapping("/delete")
public String delete(@RequestParam("bno") long bno) {
service.delete(bno);
return "redirect:/board/list";
}
- delete 메소드는 게시글을 삭제하고, 삭제 후 게시글 목록으로 리다이렉트합니다.
📌 Controller 전체 코드
package com.multi.mvc.board.controller;
import com.multi.mvc.board.service.BoardService;
import com.multi.mvc.board.vo.Board;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@Controller
@Log4j
@RequestMapping("/board")
public class BoardController {
@Setter(onMethod_ = @Autowired)
private BoardService service;
// /board/list
@GetMapping("/list")
public String list(Model model) {
List<Board> list = service.getAllList();
model.addAttribute("list", list);
return "board/boardList";
}
@GetMapping("/view")
public String view(Model model, long bno) {
Board board = service.getBoard(bno);
model.addAttribute("board", board);
return "board/boardView";
}
// /board/write
@GetMapping("/write")
public String writePage(){
return "board/boardWrite";
}
@PostMapping("/write")
public String write(Model model, Board board) {
Board result = service.write(board);
if(result == null){
return "redirect:/board/list";
}
return "redirect:/board/view?bno=" + result.getBno();
}
@GetMapping("/update")
public String update(@RequestParam("bno") long bno, Model model) {
Board board = service.getBoard(bno);
model.addAttribute("board", board);
return "board/boardUpdate";
}
@PostMapping("/update")
public String update(Board board) {
Board result = service.update(board);
if(result == null){
return "redirect:/board/list";
}
return "redirect:/board/view?bno=" + result.getBno();
}
@RequestMapping("/delete")
public String delete(@RequestParam("bno") long bno) {
service.delete(bno);
return "redirect:/board/list";
}
}
💛 전체코드 GitHub
https://github.com/mimmmji/BoardMVC/tree/main
GitHub - mimmmji/BoardMVC: Spring과 myBatis, JSP를 이용한 게시판 구현
Spring과 myBatis, JSP를 이용한 게시판 구현 . Contribute to mimmmji/BoardMVC development by creating an account on GitHub.
github.com
💡 마무리
대장정의 게시판 마무리가 끝났습니다 !
며칠 전 KB에서 하는 특강을 듣는데, 코드를 반복해서 치는게 중요하다고 해요 -,, 코드를 이해하는 것도 중요하지만, 만약 이해하기 어렵다면 외우는 것도 하나의 방법이 될 수 있다고 말씀해주셨어요.
이 포스팅을 하는 지금 저는 게시판 코드를 3번째 반복중인데요 ..🤣
반복해서 작성하다보니 확실히 코드가 이해가 가는 것 같아요 ㅎㅎ !
이제 곧 프로젝트 기간입니다 ! 곧 프로젝트 관련 포스팅으로 뵙게 될 수 있을 것 같아요. 설레는 마음을 가지고 이번주도 시작해보겠습니다 우리 모두 아자아자 !

'[KB IT's Your Life] Today I Learnd' 카테고리의 다른 글
| [KB IT's Your Life] 8주차 종합실무프로젝트💡 (8) | 2024.09.18 |
|---|---|
| [KB IT's Your Life] 7주차 컴포넌트 백엔드: Spring Security💡 (4) | 2024.09.11 |
| [KB IT's Your Life] 5주차 컴포넌트 백엔드: Rest 실습 프로젝트💡 (0) | 2024.08.26 |
| [KB IT's Your Life] 4주차 컴포넌트 백엔드: MyBatis실습 프로젝트💡 (0) | 2024.08.18 |
| [KB IT's Your Life] 3주차 컴포넌트 백엔드2 💡 (6) | 2024.08.12 |