멀티캠퍼스

[2026.05.28] - TIL 39일차 JSP MVC 게시판 CRUD 구조 정리

buckwheat 2026. 5. 28. 23:17

 

목차
1 MVCBOARD 테이블
2 JDBCTemplate
3 MVCBoardDto
4 MVCBoardDao
5 JSP MVC 게시판 구조
6 mycontroller.jsp
7 boardlist.jsp
8 boarddetail.jsp
9 boardinsert.jsp
10 boardupdate.jsp
11 result.jsp
12 forward와 redirect
13 command 방식
14 JSP MVC 게시판 CRUD 흐름 정리

 

1 MVCBOARD 테이블

1) MVCBOARD 테이블의 역할

    (1) 게시글 저장 테이블
    MVCBOARD 테이블은 MVC 방식 게시판의 게시글 정보를 저장하는 테이블이다.
    게시글 번호, 작성자, 제목, 내용, 작성일을 하나의 행으로 저장한다.

    (2) MVC 게시판 실습용 테이블
    이 테이블은 글 목록 조회, 상세 조회, 글 작성, 글 수정, 글 삭제 기능을 구현하기 위해 사용된다.
    JSP 화면에서 요청이 발생하면 Controller를 거쳐 DAO가 MVCBOARD 테이블에 접근한다.

2) MVCBOARD 컬럼

    (1) SEQ
    SEQ는 게시글 번호이다.
    PRIMARY KEY로 설정되어 게시글 하나를 구분하는 고유한 값으로 사용된다.

    (2) WRITER
    WRITER는 작성자 이름을 저장하는 컬럼이다.
    NOT NULL이 설정되어 있어 글 작성 시 반드시 값이 들어가야 한다.

    (3) TITLE
    TITLE은 게시글 제목을 저장하는 컬럼이다.
    NOT NULL이 설정되어 있어 제목 없이 글을 저장할 수 없다.

    (4) CONTENT
    CONTENT는 게시글 내용을 저장하는 컬럼이다.
    NOT NULL이 설정되어 있어 내용 없이 글을 저장할 수 없다.

    (5) REGDATE
    REGDATE는 게시글 작성일을 저장하는 컬럼이다.
    글 작성 시 SYSDATE를 사용하면 현재 날짜가 자동으로 저장된다.

3) SEQ_MVCBOARD

    (1) 시퀀스
    SEQ_MVCBOARD는 게시글 번호를 자동으로 생성하기 위한 시퀀스이다.
    새 글이 등록될 때 SEQ_MVCBOARD.NEXTVAL을 사용해 새로운 번호를 만든다.

    (2) 사용하는 이유
    게시글 번호는 중복되면 안 된다.
    시퀀스를 사용하면 개발자가 직접 번호를 계산하지 않아도 DB가 자동으로 번호를 만들어준다.

2 JDBCTemplate

1) JDBCTemplate의 역할

    (1) 공통 JDBC 클래스
    JDBCTemplate은 DB 연결, 자원 해제, commit, rollback 코드를 모아둔 공통 클래스이다.
    여러 DAO에서 반복되는 JDBC 코드를 줄이기 위해 사용한다.

    (2) DAO 코드 단순화
    DAO는 SQL 실행에 집중해야 한다.
    DB 연결과 종료 처리를 JDBCTemplate에 맡기면 DAO 코드가 더 깔끔해진다.

2) getConnection

    (1) Driver 등록
    Class.forName을 사용해 Oracle JDBC Driver를 등록한다.
    Java 프로그램이 Oracle DB와 통신할 수 있도록 준비하는 단계이다.

    (2) DB 연결
    DriverManager.getConnection을 사용해 Oracle DB에 연결한다.
    연결에 성공하면 SQL 실행에 필요한 Connection 객체를 얻는다.

    (3) 자동 커밋 해제
    con.setAutoCommit(false)는 자동 커밋을 끄는 설정이다.
    INSERT, UPDATE, DELETE 실행 후 직접 commit 또는 rollback을 처리하기 위해 사용한다.

3) close 메소드

    (1) Connection close
    Connection은 DB와 연결된 통로이다.
    사용이 끝나면 반드시 닫아서 DB 연결 자원을 반환해야 한다.

    (2) Statement close
    Statement 또는 PreparedStatement는 SQL 실행에 사용되는 객체이다.
    SQL 실행이 끝난 뒤 close해야 한다.

    (3) ResultSet close
    ResultSet은 SELECT 결과를 담는 객체이다.
    조회 결과를 모두 사용한 뒤 close해야 한다.

4) commit과 rollback

    (1) commit
    commit은 DB 변경 내용을 최종 저장하는 기능이다.
    INSERT, UPDATE, DELETE가 성공했을 때 호출한다.

    (2) rollback
    rollback은 DB 변경 내용을 취소하는 기능이다.
    작업이 실패했거나 적용된 행이 없을 때 호출한다.

3 MVCBoardDto

1) MVCBoardDto의 역할

    (1) DTO
    MVCBoardDto는 MVCBOARD 테이블의 한 행 데이터를 Java 객체로 담는 클래스이다.
    게시글 번호, 작성자, 제목, 내용, 작성일을 하나의 객체로 관리한다.

    (2) DTO를 사용하는 이유
    DB에서 가져온 게시글 데이터를 여러 변수로 따로 관리하면 복잡하다.
    MVCBoardDto 객체 하나로 묶으면 DAO, Controller, JSP 사이에서 데이터를 쉽게 전달할 수 있다.

2) 필드

    (1) seq
    seq는 게시글 번호를 저장하는 필드이다.
    MVCBOARD 테이블의 SEQ 컬럼과 연결된다.

    (2) writer
    writer는 작성자를 저장하는 필드이다.
    MVCBOARD 테이블의 WRITER 컬럼과 연결된다.

    (3) title
    title은 게시글 제목을 저장하는 필드이다.
    MVCBOARD 테이블의 TITLE 컬럼과 연결된다.

    (4) content
    content는 게시글 내용을 저장하는 필드이다.
    MVCBOARD 테이블의 CONTENT 컬럼과 연결된다.

    (5) regdate
    regdate는 게시글 작성일을 저장하는 필드이다.
    MVCBOARD 테이블의 REGDATE 컬럼과 연결된다.

3) 생성자와 메소드

    (1) 기본 생성자
    기본 생성자는 값 없이 객체를 만들 때 사용한다.
    객체를 먼저 만든 뒤 setter로 값을 넣을 수 있다.

    (2) 매개변수 생성자
    매개변수 생성자는 게시글 정보를 한 번에 받아 객체를 만들 때 사용한다.
    글 작성이나 수정 요청 데이터를 DTO로 묶을 때 사용할 수 있다.

    (3) getter와 setter
    getter는 필드 값을 읽을 때 사용하고, setter는 필드 값을 변경할 때 사용한다.
    private 필드를 외부에서 안전하게 다루기 위해 사용한다.

4 MVCBoardDao

1) MVCBoardDao의 역할

    (1) DAO
    MVCBoardDao는 MVCBOARD 테이블에 직접 접근하는 클래스이다.
    게시글 조회, 작성, 수정, 삭제 SQL을 실행한다.

    (2) DB 처리 담당
    JSP나 Controller가 직접 SQL을 처리하지 않고 DAO에게 DB 작업을 맡긴다.
    이렇게 하면 화면 흐름과 DB 처리 코드가 분리된다.

2) selectAll

    (1) 전체 게시글 조회
    selectAll은 MVCBOARD 테이블의 전체 게시글을 조회한다.
    ORDER BY SEQ DESC를 사용해 게시글 번호가 큰 최신 글부터 출력되도록 한다.

    (2) List 사용
    게시글은 여러 개가 조회될 수 있으므로 List<MVCBoardDto>에 담아 반환한다.
    ResultSet에서 한 행씩 읽어 MVCBoardDto 객체로 만들고 List에 추가한다.

3) selectOne

    (1) 선택 게시글 조회
    selectOne은 게시글 번호 SEQ를 기준으로 게시글 하나를 조회한다.
    상세 페이지나 수정 페이지에서 특정 게시글 정보를 가져올 때 사용한다.

    (2) PreparedStatement 사용
    WHERE SEQ=? 조건에 게시글 번호를 넣어 조회한다.
    사용자가 선택한 글 하나만 정확히 가져올 수 있다.

4) insert

    (1) 글 작성
    insert는 새 게시글을 MVCBOARD 테이블에 추가하는 메소드이다.
    작성자, 제목, 내용을 DTO에서 꺼내 INSERT문에 넣는다.

    (2) 자동 번호와 작성일
    게시글 번호는 SEQ_MVCBOARD.NEXTVAL로 자동 생성한다.
    작성일은 SYSDATE를 사용해 현재 날짜로 저장한다.

    (3) 결과 처리
    executeUpdate 결과가 0보다 크면 글 작성 성공이다.
    성공하면 commit하고 실패하면 rollback한다.

5) update

    (1) 글 수정
    update는 기존 게시글의 제목과 내용을 수정하는 메소드이다.
    SEQ를 기준으로 수정할 게시글을 찾는다.

    (2) 수정 대상
    작성자와 작성일은 수정하지 않고 제목과 내용만 수정한다.
    WHERE SEQ=? 조건을 사용해 특정 게시글 하나만 수정한다.

    (3) 결과 처리
    수정된 행이 있으면 commit하고, 없으면 rollback한다.
    결과값은 Controller에서 성공 또는 실패 판단에 사용된다.

6) delete

    (1) 글 삭제
    delete는 게시글 번호를 기준으로 게시글을 삭제하는 메소드이다.
    DELETE FROM MVCBOARD WHERE SEQ=? SQL을 실행한다.

    (2) 삭제 기준
    SEQ는 PRIMARY KEY이므로 특정 게시글 하나를 정확히 찾을 수 있다.
    상세 페이지에서 삭제 버튼을 누르면 해당 글 번호가 Controller로 전달된다.

    (3) 결과 처리
    삭제된 행이 있으면 commit하고, 없으면 rollback한다.
    삭제 성공 시 목록 페이지로 이동하고, 실패 시 상세 페이지로 돌아가게 만들 수 있다.

5 JSP MVC 게시판 구조

1) 기존 JSP 게시판과의 차이

    (1) 기존 방식
    기존 JSP 게시판은 mylist.jsp, myinsert_res.jsp, mydelete.jsp 같은 각 JSP가 직접 DAO를 호출했다.
    즉, 화면 페이지와 처리 페이지가 각각 DB 작업을 직접 담당하는 구조였다.

    (2) MVC 방식
    MVC 방식에서는 모든 요청을 mycontroller.jsp가 먼저 받는다.
    mycontroller.jsp가 command 값을 보고 어떤 기능을 실행할지 결정한다.

    (3) 핵심 차이
    기존 방식은 JSP마다 처리 로직이 흩어져 있다.
    MVC 방식은 Controller 하나에 요청 처리 흐름을 모아 관리한다.

2) MVC 게시판의 역할 분리

    (1) View
    boardlist.jsp, boarddetail.jsp, boardinsert.jsp, boardupdate.jsp, result.jsp는 View 역할을 한다.
    사용자가 보는 화면을 담당한다.

    (2) Controller
    mycontroller.jsp는 Controller 역할을 한다.
    사용자의 요청을 받아 DAO를 호출하고, 결과에 따라 어떤 JSP로 이동할지 결정한다.

    (3) Model
    MVCBoardDao와 MVCBoardDto는 Model 역할을 한다.
    DAO는 DB 작업을 담당하고, DTO는 데이터를 담아 전달한다.

6 mycontroller.jsp

1) mycontroller.jsp의 역할

    (1) Controller
    mycontroller.jsp는 MVC 게시판의 중심 Controller이다.
    모든 요청을 command 값으로 구분해서 알맞은 기능을 실행한다.

    (2) 요청 흐름 제어
    사용자가 목록, 상세, 작성, 수정, 삭제 중 어떤 요청을 했는지 확인한다.
    이후 DAO를 호출하거나 특정 View JSP로 이동시킨다.

2) command 값

    (1) command
    command는 사용자가 어떤 기능을 요청했는지 구분하는 값이다.
    request.getParameter("command")로 받아온다.

    (2) 사용하는 이유
    모든 요청이 mycontroller.jsp로 들어오기 때문에 요청 종류를 구분할 기준이 필요하다.
    command 값이 boardlist인지 boardinsert인지에 따라 실행할 코드가 달라진다.

3) boardlist

    (1) 전체 목록 요청
    command가 boardlist이면 DAO의 selectAll을 호출한다.
    전체 게시글 목록을 조회해 List<MVCBoardDto>로 받는다.

    (2) request에 저장
    조회 결과를 request.setAttribute("allList", list)에 저장한다.
    이렇게 저장한 데이터는 forward된 boardlist.jsp에서 사용할 수 있다.

    (3) forward
    pageContext.forward("boardlist.jsp")로 목록 화면으로 이동한다.
    forward는 request 객체를 유지하기 때문에 allList 값을 그대로 사용할 수 있다.

4) boardinsertform

    (1) 글 작성 화면 요청
    command가 boardinsertform이면 글 작성 화면으로 이동한다.
    이때는 DB 조회가 필요하지 않다.

    (2) redirect
    response.sendRedirect("boardinsert.jsp")를 사용해 작성 화면으로 이동한다.
    단순히 새 페이지로 이동하는 요청이므로 redirect를 사용했다.

5) boardinsert

    (1) 글 작성 처리
    command가 boardinsert이면 form에서 넘어온 writer, title, content 값을 받는다.
    받은 값을 MVCBoardDto 객체로 묶는다.

    (2) insert 호출
    dao.insert(dto)를 호출해 DB에 새 게시글을 저장한다.
    결과가 0보다 크면 글 작성 성공으로 판단한다.

    (3) result.jsp로 이동
    성공 또는 실패 메시지와 이동할 url을 request에 저장한다.
    이후 result.jsp로 forward해서 결과 화면을 보여준다.

6) boarddetail

    (1) 상세 조회 요청
    command가 boarddetail이면 seq 값을 받아 특정 게시글을 조회한다.
    목록에서 제목을 클릭했을 때 실행된다.

    (2) selectOne 호출
    dao.selectOne(seq)를 호출해 게시글 하나를 가져온다.
    조회 결과를 request.setAttribute("dto", res)에 저장한다.

    (3) 상세 화면 이동
    boarddetail.jsp로 forward한다.
    boarddetail.jsp는 request에 저장된 dto를 꺼내 상세 내용을 출력한다.

7) boardupdateform

    (1) 수정 화면 요청
    command가 boardupdateform이면 수정할 게시글 번호를 받는다.
    수정 화면에는 기존 제목과 내용이 먼저 보여야 하므로 DB 조회가 필요하다.

    (2) 기존 데이터 조회
    dao.selectOne(seq)를 호출해 기존 게시글 정보를 가져온다.
    조회 결과를 request에 dto라는 이름으로 저장한다.

    (3) 수정 화면 이동
    boardupdate.jsp로 forward한다.
    boardupdate.jsp는 dto 값을 이용해 기존 제목과 내용을 form에 보여준다.

8) boardupdate

    (1) 수정 처리
    command가 boardupdate이면 수정 form에서 넘어온 title, content, seq 값을 받는다.
    이 값들로 MVCBoardDto 객체를 만든다.

    (2) update 호출
    dao.update(dto)를 호출해 DB의 제목과 내용을 수정한다.
    수정 성공 시 result.jsp에서 성공 메시지를 보여준다.

    (3) 수정 후 이동
    수정 성공 후 boardupdateform으로 다시 이동하도록 url을 만든다.
    이렇게 하면 수정된 내용을 다시 수정 화면에서 확인할 수 있다.

9) boarddelete

    (1) 삭제 처리
    command가 boarddelete이면 삭제할 게시글 번호 seq를 받는다.
    dao.delete(seq)를 호출해 해당 게시글을 삭제한다.

    (2) 성공 시 이동
    삭제 성공 시 게시글 목록으로 이동하도록 url을 boardlist로 설정한다.
    삭제된 글이 목록에서 사라졌는지 확인할 수 있다.

    (3) 실패 시 이동
    삭제 실패 시 기존 상세 페이지로 돌아가도록 url을 boarddetail과 seq로 설정한다.
    삭제할 게시글이 없거나 실패했을 때 사용자가 다시 확인할 수 있다.

7 boardlist.jsp

1) boardlist.jsp의 역할

    (1) 목록 화면
    boardlist.jsp는 게시글 전체 목록을 보여주는 View 페이지이다.
    직접 DAO를 호출하지 않고 Controller가 request에 담아준 allList를 사용한다.

    (2) request 데이터 사용
    request.getAttribute("allList")로 게시글 목록을 꺼낸다.
    이 값은 mycontroller.jsp에서 selectAll을 실행한 뒤 저장한 데이터이다.

2) 목록 출력

    (1) 게시글이 없는 경우
    list.size()가 0이면 등록된 글이 없다는 메시지를 출력한다.
    사용자가 빈 게시판 상태를 알 수 있게 한다.

    (2) 게시글이 있는 경우
    for문으로 List<MVCBoardDto>를 반복한다.
    각 게시글의 번호, 작성자, 제목, 작성일을 테이블 행으로 출력한다.

    (3) 제목 클릭
    제목은 a 태그로 구성되어 있다.
    클릭하면 mycontroller.jsp?command=boarddetail&seq=게시글번호로 이동한다.

3) 글쓰기 버튼

    (1) 글쓰기 이동
    글쓰기 버튼을 누르면 mycontroller.jsp?command=boardinsertform으로 이동한다.
    Controller는 이 요청을 받아 boardinsert.jsp로 이동시킨다.

    (2) Controller를 거치는 이유
    View가 직접 boardinsert.jsp로 이동할 수도 있지만, MVC 흐름에서는 Controller를 거쳐 이동하는 방식이 더 일관적이다.
    모든 요청의 시작점을 Controller로 모으는 연습이다.

8 boarddetail.jsp

1) boarddetail.jsp의 역할

    (1) 상세 화면
    boarddetail.jsp는 게시글 하나의 상세 내용을 보여주는 View 페이지이다.
    게시글 번호, 작성자, 작성일, 제목, 내용을 출력한다.

    (2) dto 사용
    request.getAttribute("dto")로 Controller가 전달한 게시글 객체를 꺼낸다.
    이 dto에는 selectOne으로 조회한 게시글 정보가 담겨 있다.

2) 상세 내용 출력

    (1) 번호와 작성자
    dto.getSeq와 dto.getWriter로 게시글 번호와 작성자를 출력한다.
    사용자는 어떤 글인지 기본 정보를 확인할 수 있다.

    (2) 작성일
    dto.getRegdate로 작성일을 출력한다.
    글이 등록된 날짜를 확인할 수 있다.

    (3) 제목과 내용
    dto.getTitle과 dto.getContent로 제목과 내용을 출력한다.
    내용은 textarea에 readonly를 설정해 수정하지 못하고 읽기만 가능하게 한다.

3) 수정과 삭제 버튼

    (1) 수정 버튼
    수정 버튼을 누르면 mycontroller.jsp?command=boardupdateform&seq=게시글번호로 이동한다.
    Controller는 해당 게시글을 다시 조회한 뒤 수정 화면으로 forward한다.

    (2) 삭제 버튼
    삭제 버튼을 누르면 mycontroller.jsp?command=boarddelete&seq=게시글번호로 이동한다.
    Controller는 해당 번호를 기준으로 게시글 삭제를 처리한다.

9 boardinsert.jsp

1) boardinsert.jsp의 역할

    (1) 글 작성 화면
    boardinsert.jsp는 새 게시글을 입력하는 View 페이지이다.
    작성자, 제목, 내용을 입력받는 form을 제공한다.

    (2) DB 작업 없음
    boardinsert.jsp는 화면만 담당한다.
    실제 DB INSERT는 form이 mycontroller.jsp로 제출된 뒤 Controller와 DAO에서 처리된다.

2) form 태그

    (1) action
    form의 action은 mycontroller.jsp이다.
    사용자가 등록 버튼을 누르면 입력값이 Controller로 전송된다.

    (2) method
    method는 post이다.
    글 작성처럼 데이터를 서버에 보내 저장하는 요청은 POST 방식이 적합하다.

    (3) hidden command
    hidden input의 name은 command이고 value는 boardinsert이다.
    화면에는 보이지 않지만 form 전송 시 함께 전달되어 Controller가 글 작성 요청임을 알 수 있게 한다.

3) 입력값

    (1) writer
    writer는 작성자 이름을 입력받는 값이다.
    Controller에서 request.getParameter("writer")로 받을 수 있다.

    (2) title
    title은 게시글 제목을 입력받는 값이다.
    Controller에서 request.getParameter("title")로 받을 수 있다.

    (3) content
    content는 게시글 내용을 입력받는 값이다.
    textarea의 name이 content이므로 Controller에서 같은 이름으로 값을 받을 수 있다.

10 boardupdate.jsp

1) boardupdate.jsp의 역할

    (1) 수정 화면
    boardupdate.jsp는 기존 게시글을 수정하는 View 페이지이다.
    Controller가 전달한 dto를 사용해 기존 게시글 정보를 화면에 보여준다.

    (2) 수정 가능 항목
    이 실습에서는 제목과 내용만 수정할 수 있다.
    번호, 작성자, 작성일은 화면에 출력만 하고 수정하지 않는다.

2) hidden input

    (1) command hidden
    command 값은 boardupdate로 설정되어 있다.
    form이 제출되면 Controller가 수정 처리 요청으로 인식한다.

    (2) seq hidden
    seq 값은 화면에는 보이지 않지만 수정 처리에 반드시 필요하다.
    어떤 게시글을 수정할지 구분하는 기준이 되기 때문이다.

3) 기존 값 출력

    (1) 제목 value
    제목 input의 value에 dto.getTitle 값을 넣는다.
    사용자는 기존 제목을 보고 수정할 수 있다.

    (2) 내용 textarea
    textarea 안에 dto.getContent 값을 넣는다.
    사용자는 기존 내용을 확인한 뒤 필요한 부분을 수정할 수 있다.

4) 수정 요청

    (1) 수정 버튼
    수정 버튼을 누르면 form 데이터가 mycontroller.jsp로 POST 전송된다.
    command, seq, title, content가 함께 전달된다.

    (2) 목록 버튼
    목록 버튼을 누르면 mycontroller.jsp?command=boardlist로 이동한다.
    수정하지 않고 목록으로 돌아갈 때 사용한다.

11 result.jsp

1) result.jsp의 역할

    (1) 결과 화면
    result.jsp는 글 작성, 수정, 삭제 후 결과 메시지를 보여주는 공통 View 페이지이다.
    성공 또는 실패 메시지를 출력하고 확인 버튼을 제공한다.

    (2) 공통 처리
    글 작성 성공, 글 작성 실패, 글 수정 성공, 글 삭제 성공처럼 여러 결과를 하나의 JSP에서 처리한다.
    같은 alert 또는 결과 화면 코드를 여러 페이지에 반복하지 않아도 된다.

2) msg와 url

    (1) msg
    msg는 사용자에게 보여줄 결과 메시지이다.
    mycontroller.jsp에서 request.setAttribute("msg", msg)로 저장한다.

    (2) url
    url은 확인 버튼을 눌렀을 때 이동할 주소이다.
    mycontroller.jsp에서 request.setAttribute("url", url)로 저장한다.

    (3) 확인 버튼
    확인 버튼을 누르면 mycontroller.jsp와 url 값을 합쳐 이동한다.
    예를 들어 url이 ?command=boardlist이면 목록 요청으로 이동한다.

12 forward와 redirect

1) forward

    (1) forward의 개념
    forward는 서버 내부에서 다른 JSP로 요청과 응답 객체를 유지한 채 이동하는 방식이다.
    사용자의 브라우저 주소는 크게 바뀌지 않고, 서버 안에서 화면만 넘겨준다.

    (2) request 유지
    forward는 request 객체가 유지된다.
    그래서 request.setAttribute로 저장한 값을 이동한 JSP에서 getAttribute로 꺼낼 수 있다.

    (3) 사용 상황
    조회 결과를 JSP로 전달해야 할 때 forward를 사용한다.
    boardlist, boarddetail, boardupdateform처럼 데이터를 request에 담아 화면으로 넘기는 경우에 적합하다.

2) redirect

    (1) redirect의 개념
    redirect는 클라이언트에게 새로운 주소로 다시 요청하라고 보내는 방식이다.
    브라우저가 새 요청을 보내기 때문에 request와 response 객체가 유지되지 않는다.

    (2) request 유지 안 됨
    redirect는 새로운 요청이므로 이전 request에 저장한 값은 사라진다.
    그래서 request.setAttribute 값을 다음 페이지에서 사용할 수 없다.

    (3) 사용 상황
    단순히 다른 페이지로 이동할 때 사용할 수 있다.
    boardinsertform에서 boardinsert.jsp로 이동하는 것처럼 별도 전달 데이터가 필요 없는 경우에 사용할 수 있다.

13 command 방식

1) command 방식의 개념

    (1) command 방식
    command 방식은 요청마다 command라는 값을 함께 보내고, Controller가 이 값을 기준으로 기능을 분기하는 방식이다.
    하나의 Controller에서 여러 요청을 처리할 수 있다.

    (2) 사용하는 이유
    모든 요청을 mycontroller.jsp로 모으면 요청 흐름을 한 곳에서 관리할 수 있다.
    목록, 상세, 작성, 수정, 삭제 요청이 각각 어떤 DAO를 호출하고 어떤 JSP로 이동하는지 한 파일에서 확인할 수 있다.

2) GET 방식 command

    (1) URL에 command 전달
    a 태그나 location.href를 사용할 때 URL 뒤에 ?command=boardlist처럼 값을 붙인다.
    사용자가 링크나 버튼을 눌렀을 때 Controller가 어떤 요청인지 알 수 있다.

    (2) 예시 흐름
    mycontroller.jsp?command=boarddetail&seq=1은 1번 게시글 상세 조회 요청이다.
    command는 기능을 의미하고, seq는 필요한 추가 데이터이다.

3) POST 방식 command

    (1) hidden input 사용
    form 전송에서는 hidden input으로 command 값을 함께 보낸다.
    사용자는 보지 못하지만 서버에는 command 값이 전달된다.

    (2) 사용하는 이유
    글 작성이나 글 수정처럼 form 데이터를 POST로 보낼 때도 Controller가 요청 종류를 알아야 한다.
    hidden command를 사용하면 form 안에 요청 종류를 함께 담을 수 있다.

4) command 방식의 장점

    (1) 요청 관리 집중
    여러 JSP에 처리 로직이 흩어지지 않고 Controller에 모인다.
    어떤 요청이 어떤 흐름으로 처리되는지 파악하기 쉽다.

    (2) MVC 구조 이해
    View는 화면을 담당하고, Controller는 요청 처리를 담당한다.
    command 방식은 이 역할 분리를 연습하기 좋은 구조이다.

14 JSP MVC 게시판 CRUD 흐름 정리

1) 전체 조회

    (1) 요청
    index.html에서 글 목록 링크를 클릭하면 mycontroller.jsp?command=boardlist로 이동한다.
    Controller는 command가 boardlist인지 확인한다.

    (2) 처리
    Controller는 dao.selectAll을 호출해 전체 게시글 목록을 조회한다.
    조회 결과를 request에 allList라는 이름으로 저장한다.

    (3) 화면
    boardlist.jsp로 forward한다.
    boardlist.jsp는 allList를 꺼내 테이블 형태로 게시글 목록을 출력한다.

2) 상세 조회

    (1) 요청
    목록에서 제목을 클릭하면 mycontroller.jsp?command=boarddetail&seq=게시글번호로 이동한다.
    seq 값으로 어떤 게시글을 볼지 전달한다.

    (2) 처리
    Controller는 seq를 int로 변환한 뒤 dao.selectOne을 호출한다.
    조회된 게시글 객체를 request에 dto라는 이름으로 저장한다.

    (3) 화면
    boarddetail.jsp로 forward한다.
    boarddetail.jsp는 dto를 꺼내 게시글 상세 내용을 출력한다.

3) 글 작성

    (1) 작성 화면 요청
    목록에서 글쓰기 버튼을 누르면 mycontroller.jsp?command=boardinsertform으로 이동한다.
    Controller는 boardinsert.jsp로 이동시킨다.

    (2) 작성 처리 요청
    boardinsert.jsp에서 작성자, 제목, 내용을 입력하고 등록 버튼을 누른다.
    form은 mycontroller.jsp로 POST 요청을 보내며 hidden command로 boardinsert를 함께 전달한다.

    (3) DB 처리
    Controller는 writer, title, content를 받아 MVCBoardDto 객체로 만든다.
    dao.insert를 호출해 MVCBOARD 테이블에 새 글을 저장한다.

    (4) 결과 화면
    성공 또는 실패 메시지와 이동 URL을 request에 저장한다.
    result.jsp로 forward해서 결과를 보여준다.

4) 글 수정

    (1) 수정 화면 요청
    상세 페이지에서 수정 버튼을 누르면 mycontroller.jsp?command=boardupdateform&seq=게시글번호로 이동한다.
    Controller는 기존 게시글 정보를 조회한다.

    (2) 수정 화면 출력
    Controller는 조회한 dto를 request에 저장하고 boardupdate.jsp로 forward한다.
    boardupdate.jsp는 기존 제목과 내용을 form에 보여준다.

    (3) 수정 처리 요청
    사용자가 제목과 내용을 수정한 뒤 수정 버튼을 누른다.
    form은 command=boardupdate, seq, title, content를 mycontroller.jsp로 전송한다.

    (4) DB 수정
    Controller는 전달된 값을 DTO로 묶고 dao.update를 호출한다.
    DB에서 해당 게시글의 제목과 내용이 수정된다.

    (5) 결과 화면
    수정 결과 메시지와 이동 URL을 request에 저장한다.
    result.jsp에서 결과를 보여준다.

5) 글 삭제

    (1) 삭제 요청
    상세 페이지에서 삭제 버튼을 누르면 mycontroller.jsp?command=boarddelete&seq=게시글번호로 이동한다.
    Controller는 seq 값을 받아 삭제 대상을 확인한다.

    (2) DB 삭제
    Controller는 dao.delete(seq)를 호출한다.
    DB에서 해당 게시글 번호를 가진 행을 삭제한다.

    (3) 결과 화면
    삭제 성공 시 목록으로 이동하는 URL을 저장한다.
    삭제 실패 시 다시 상세 페이지로 돌아갈 수 있는 URL을 저장한다.

6) 오늘 실습의 핵심

    (1) JSP에서 MVC 흐름 적용
    오늘 실습은 JSP 게시판을 MVC 방식으로 바꿔보는 과정이다.
    JSP가 직접 DB 작업을 처리하는 것이 아니라 Controller가 요청을 받고 DAO를 호출한다.

    (2) Controller 중심 구조
    mycontroller.jsp가 모든 요청의 중심이 된다.
    command 값에 따라 목록, 상세, 작성, 수정, 삭제 기능을 분기한다.

    (3) View 역할 분리
    boardlist.jsp, boarddetail.jsp, boardinsert.jsp, boardupdate.jsp, result.jsp는 화면 출력에 집중한다.
    DB 작업은 DAO가 담당하고, 요청 흐름은 Controller가 담당한다.

    (4) request.setAttribute 활용
    Controller는 DAO에서 받은 데이터를 request에 저장한다.
    forward된 JSP는 request.getAttribute로 데이터를 꺼내 화면에 출력한다.

    (5) forward와 redirect 구분
    데이터를 전달해야 할 때는 forward를 사용한다.
    단순 페이지 이동에는 redirect를 사용할 수 있다.

    (6) CRUD 완성
    MVC 구조 안에서 게시글 전체 조회, 상세 조회, 작성, 수정, 삭제 기능을 구현했다.
    이 구조는 이후 Servlet Controller 기반 MVC 패턴으로 확장할 수 있다.