Spring Mvc 게시판 | Webjjang Spring 00-04 무조건 게시판 만들기 – 프로젝트 흐름 이해 / 게시판리스트 보이기(웹짱과 함께하는 스프링) 인기 답변 업데이트

당신은 주제를 찾고 있습니까 “spring mvc 게시판 – Webjjang Spring 00-04 무조건 게시판 만들기 – 프로젝트 흐름 이해 / 게시판리스트 보이기(웹짱과 함께하는 스프링)“? 다음 카테고리의 웹사이트 you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: you.tfvp.org/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 웹짱이영환쌤 이(가) 작성한 기사에는 조회수 16,530회 및 좋아요 121개 개의 좋아요가 있습니다.

spring mvc 게시판 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 Webjjang Spring 00-04 무조건 게시판 만들기 – 프로젝트 흐름 이해 / 게시판리스트 보이기(웹짱과 함께하는 스프링) – spring mvc 게시판 주제에 대한 세부정보를 참조하세요

웹짱과 함께하는 스프링
0. 무조건 따라해서 설치부터 게시판까지 만들기
00-04 무조건 게시판 만들기 – 프로젝트 흐름 이해 / 게시판리스트 보이기

spring mvc 게시판 주제에 대한 자세한 내용은 여기를 참조하세요.

Spring MVC를 활용한 게시판 구축하기

스프링 MVC의 특징을 중심으로 간단하게 만드는 게시판이기 때문에 페이징 기능과 검색 기능은 생략했다. 1. 스프링 MVC 프로젝트 생성. 스프링 MVC …

+ 더 읽기

Source: imbf.github.io

Date Published: 12/26/2021

View: 5166

Spring MVC – 게시판 만들기 feat.입문편 – 21st Alchemist

스프링에서 제공하는 MVC 프레임워크를 이용해 게시판을 만들어 보자. * 서비스 되는 게시판이 아닌 학습용 예제에 맞는 게시판이다.

+ 여기에 보기

Source: lhoris.tistory.com

Date Published: 11/4/2022

View: 1536

Spring 게시판 만들기 기초 -1 – 기발개발

next 선택 후 spring MVC Project 선택. 프로젝트이름은 아무렇게나 지으면 된다. 이 후 project setting 창에서는 패키지를 3단까지 …

+ 여기에 표시

Source: brilliantdevelop.tistory.com

Date Published: 12/25/2021

View: 414

[Spring _MVC ①] CRUD 게시판 구현 개발환경 설정 (STS …

[Spring _MVC ①] CRUD 게시판 구현 개발환경 설정 (STS / MVC 패턴 / Mybatis / 스프링 입문 / 백엔드 / 웹개발). 비전공자 기록광 2021. 4. 18. 23:18.

+ 여기에 보기

Source: datamoney.tistory.com

Date Published: 2/20/2021

View: 9376

[Spring] Spring MVC 구조 자유게시판 만들기 – (3) – 영보로그

[Spring] Spring MVC 구조 자유게시판 만들기 – (3). 영보로그 2020. 11. … 저번 게시물에 이어서 마지막으로 게시판 총 완성을 시켜보겠습니다.

+ 여기에 자세히 보기

Source: qh5944.tistory.com

Date Published: 1/11/2021

View: 8983

Spring MVC 간단한 게시판 만들기

간단한 사용자 관리 프로젝트를 만들어보고,. 예전에 jsp공부할 때 만들었던 jdbc 게시판을 응용해. Spring MVC 버전으로 게시판을 만들어볼 예정이다 …

+ 여기에 더 보기

Source: hyejin.tistory.com

Date Published: 9/7/2021

View: 2997

Spring MVC 패턴 스프링 게시판 만들기 – 코딩맛집

이번에는 Spring MVC 패턴을 이용하여 게시판을 만들어보도록 하겠습니다. 우선 로직과 파일의 폴더 구성은 아래와 같습니다.

+ 여기에 보기

Source: coding-restaurant.tistory.com

Date Published: 1/6/2022

View: 993

국비 교육 78일차 – spring mvc 게시판 만들기, mvc 프로젝트 셋팅

드디어 스프링으로 mvc 게시판을 만들어 봤다. 이제 이걸 토대로 2차 팀 프로젝트를 진행하게 될 것 같다. 파일 구성은 이렇게 되어 있다.

+ 더 읽기

Source: angehende-ingenieur.tistory.com

Date Published: 5/27/2022

View: 7318

[스프링 프레임워크]게시판 만들기 #1 : 프로젝트 생성 및 셋팅

Pachage Explorer 오른쪽 클릭 -> New -> Spring Legacy Project; Project name 입력 후 Templates은 Spring MVC Project 선택; Top Level Package …

+ 여기를 클릭

Source: hyunipad.tistory.com

Date Published: 3/4/2022

View: 4742

[STS Spring] 게시판 만들기 — 01. Spring MVC Project 생성

복습을 목적으로 간단한 게시판 만들기 … STS 우클릭 – Spring Legacy Project 선택; 2. Spring MVC Project 선택. 이미 프로젝트를 생성하고 캡쳐 …

+ 여기에 자세히 보기

Source: mycodearchive.tistory.com

Date Published: 7/2/2021

View: 4452

주제와 관련된 이미지 spring mvc 게시판

주제와 관련된 더 많은 사진을 참조하십시오 Webjjang Spring 00-04 무조건 게시판 만들기 – 프로젝트 흐름 이해 / 게시판리스트 보이기(웹짱과 함께하는 스프링). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

Webjjang Spring 00-04 무조건 게시판 만들기 - 프로젝트 흐름 이해 / 게시판리스트 보이기(웹짱과 함께하는 스프링)
Webjjang Spring 00-04 무조건 게시판 만들기 – 프로젝트 흐름 이해 / 게시판리스트 보이기(웹짱과 함께하는 스프링)

주제에 대한 기사 평가 spring mvc 게시판

  • Author: 웹짱이영환쌤
  • Views: 조회수 16,530회
  • Likes: 좋아요 121개
  • Date Published: 2020. 7. 15.
  • Video Url link: https://www.youtube.com/watch?v=2PP68nc-wWQ

Spring MVC를 활용한 게시판 구축하기

INSERT INTO BOARD(title, content, writer, password, regDate, cnt) VALUES (${title}, ${content}, ${writer}, #{password}, SYSDATE, 0); SELECT NVL(MAX(seq), 0) FROM BOARD UPDATE BOARD SET title = #{title}, content = #{content}, writer = ${writer} WHERE seq = #{seq} AND password = #{password} UPDATE BOARD SET cnt = cnt + 1 WHERE seq = #{seq} DELETE FROM BOARD WHERE seq = #{seq} AND password = #{password} DELETE FROM BOARD

게시판 만들기 feat.입문편

스프링에서 제공하는 MVC 프레임워크를 이용해 게시판을 만들어 보자.

* 서비스 되는 게시판이 아닌 학습용 예제에 맞는 게시판이다.

보통 필자는 게시판을 만드는 프로세스는 다음과 같이 진행한다.

DB에 게시판 테이블 생성하기 테이블 컬럼 값들을 DTO(VO) 객체 클래스에 매핑 CRUD 만들기 SQL문 쿼리 작성하기 MyBatis Mapper 작성(xml) DAO 인터페이스 만들기 DAO implements 메서드 구현 Service 인터페이스 만들기 Service implements 메서드 구현 Controller 클래스 만들기 View 역할의 게시판 페이지 board_list.jsp 코드 작성

그러나 이번 포스팅에서 진행할 프로세스는 게시판 목록 페이지 구현을 위해서

‘최소한’의 작업만 진행할 것이기에 저 프로세스에서 간략화 된 작업만 진행 할 것이다.

예제 소스 파일 다운로드

example.zip

1. DB에 게시판 테이블 생성하기 (오라클 11g)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 — 게시판 테이블 만들기 CREATE TABLE board ( bno number not null primary key –게시물번호 ,title varchar2( 200 ) not null –게시물제목 ,content varchar2( 4000 ) –게시물내용 ,writer varchar2( 50 ) not null –게시물작성자 ,regdate date default sysdate –게시물작성일자 ,viewcnt number default 0 –게시물조회수 ); — 테이블 데이터 삭제 DELETE FROM board; — 게시물 레코드 1000개 삽입하기 declare i number : = 1 ; begin while i < = 1000 loop insert into board (bno,title,content,writer) values (( select nvl(max(bno) + 1 , 1 ) from board) , '제목' | | i, '내용' | | i, 'kim' ); i : = i + 1 ; end loop; end; / select count( * ) from board; select * from board; -- commit commit; Colored by Color Scripter cs 2. 테이블 컬럼 값들을 DTO(VO) 객체 클래스에 매핑 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 package com.example.spring01.model.dto; import java.util.Date; public class BoardDTO { //Field private int bno; //게시물번호 private String title; //게시물제목 private String content; //게시물내용 private String writer; //게시물작성자 private Date regdate; //게시물작성일자 private int viewcnt; //게시물조회수 //Constructor public BoardDTO() {} public BoardDTO( int bno, String title, String content, String writer, Date regdate, int viewcnt) { super (); this .bno = bno; this .title = title; this .content = content; this .writer = writer; this .regdate = regdate; this .viewcnt = viewcnt; } //getter & setter public int getBno() { return bno; } public void setBno( int bno) { this .bno = bno; } 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 getWriter() { return writer; } public void setWriter( String writer) { this .writer = writer; } public Date getRegdate() { return regdate; } public void setRegdate(Date regdate) { this .regdate = regdate; } public int getViewcnt() { return viewcnt; } public void setViewcnt( int viewcnt) { this .viewcnt = viewcnt; } //toString @Override public String toString () { return "BoardDTO [bno=" + bno + ", title=" + title + ", content=" + content + ", writer=" + writer + ", regdate=" + regdate + ", viewcnt=" + viewcnt + "]" ; } } Colored by Color Scripter cs 3. CRUD 만들기 - SQL문 쿼리 작성하기 (여기선 게시판 목록 불러오는 쿼리만 작성하겠다.) 1 2 select bno,title,writer,regdate,viewcnt from board order by bno desc cs 4. boardMapper.xml 작성하기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 < ?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 = "board" > < select id = "boardList" resultType = "com.board.example.dto.BoardDTO" > select bno,title,writer,regdate,viewcnt from board order by bno desc Colored by Color Scripter cs

5. DAO 인터페이스 만들기

1 2 3 4 5 6 7 8 9 10 11 package com.board.example.dao; import java.util.List; import com.board.example.dto.BoardDTO; public interface BoardDAO { // 게시물 목록 보기 public List < BoardDTO > boardList() throws Exception; } Colored by Color Scripter cs

6. DAO implements 메서드 구현하기

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package com.board.example.dao; import java.util.List; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Repository; import com.board.example.dto.BoardDTO; @Repository public class BoardDAOImpl implements BoardDAO { @Inject SqlSession sqlSession; @Override public List < BoardDTO > boardList() throws Exception { return sqlSession.selectList( “board.boardList” ); } } Colored by Color Scripter cs

7. Service 인터페이스 만들기

1 2 3 4 5 6 7 8 9 10 11 package com.board.example.service; import java.util.List; import com.board.example.dto.BoardDTO; public interface BoardService { // 게시물 목록 조회 public List < BoardDTO > boardList() throws Exception; } Colored by Color Scripter cs

8. Service implements 메서드 구현

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package com.board.example.service; import java.util.List; import javax.inject.Inject; import org.springframework.stereotype.Service; import com.board.example.dao.BoardDAO; import com.board.example.dto.BoardDTO; @Service public class BoardServiceImpl implements BoardService { @Inject BoardDAO boardDao; @Override public List < BoardDTO > boardList() throws Exception { return boardDao.boardList(); } } Colored by Color Scripter cs

9. Controller 클래스 만들기

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package com.board.example.controller; import java.util.List; import javax.inject.Inject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.board.example.dto.BoardDTO; import com.board.example.service.BoardService; @Controller @RequestMapping( “/board/*” ) public class BoardController { @Inject BoardService boardService; // 과거 ModelAndView를 활용한 방법 // @RequestMapping(“list.do”) // public ModelAndView boardMenu() throws Exception { // List list = boardService.boardList(); // ModelAndView mav = new ModelAndView(); // mav.setViewName(“board/board_list”); // mav.addObject(“list”, list); // return mav; // board/board_list.jsp로 이동 // } // 현재 자주 쓰는 Model 클래스를 DI 하는 방법 @RequestMapping( “list.do” ) public String boardList(Model model) throws Exception { List < BoardDTO > list = boardService.boardList(); // list 변수에 결과 값을 담는다 model.addAttribute( “list” , list); // model에 데이터 값을 담는다 return “board/board_list” ; // board/board_list.jsp로 이동 } } Colored by Color Scripter cs

위 Controller에서 두가지 구현 방법을 명시해놨는데

ModelAndView는 @RequestMapping 나오기 전의 방법이고 아래 코드보다 많은 코드를 필요로 하는 것을 볼 수 있다.

그 과정에서 메서드 안에서 ModelAndView 클래스를 new 하는 과정도 있고 아래 코드보다 조금 번거로운 면이 있다.

필자는 아래 소스코드를 선호하며 파라미터로 Model 클래스를 주입하는 것이 스프링과 좀 더 어울리지 않나 생각한다.

* String으로 jsp 파일 이름을 리턴하고 Model 클래스를 의존주입하며 모델 안에 데이터를 담아 값을 넘기는 방식

10. View 역할의 게시판 페이지 board_list.jsp 코드 작성

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <% @ page language = "java" contentType = "text/html; charset=UTF-8" pageEncoding = "UTF-8" %> <% @ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %> < !DOCTYPE html > < html > < head > < meta charset = "UTF-8" > < title >Insert title here < body > <% @ include file = "../include/menu.jsp" %> < h2 >board_list 페이지입니다. < table border = "1" > < tr > < th >번호 < th >제목 < th >글쓴이 < th >작성일자 < th >조회수 < c:forEach var = "row" items = "${list}" > < tr > < td >${row.bno} < td >${row.title} < td >${row.writer} < td > < fmt:formatDate value = "${row.regdate}" pattern = "yyyy-MM-dd HH:mm:ss" / > < td >${row.viewcnt} Colored by Color Scripter cs

* 별첨 (home.jsp와 menu.jsp 파일 소스코드 첨부)

home.jsp

1 2 3 4 5 6 7 8 9 10 11 12 13 <% @ page language = "java" contentType = "text/html; charset=UTF-8" pageEncoding = "UTF-8" %> < !DOCTYPE html > < html > < head > < title >Home < body > <% @ include file = "include/menu.jsp" %> < h1 >Hello world! < P > The time on the server is ${serverTime}. Colored by Color Scripter cs

menu.jsp

1 2 3 4 5 6 7 8 9 10 11 <% @ page language = "java" contentType = "text/html; charset=UTF-8" pageEncoding = "UTF-8" %> <% @ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %> < c:set var = "path" value = "${pageContext.request.contextPath}" / > < div style = "text-align: center;" > < a href = "${path}/" >main < a href = "${path}/board/list.do" >게시판 < hr > Colored by Color Scripter cs

View 출력 화면 (메뉴에 게시판을 클릭했을때 모습)

이렇게 게시판 리스트 값을 DB에서 가져와 테이블 형태로 뷰 화면에 출력하는 것을 완료하였다.

지금은 아주 기본적으로 DB에서 정보를 가져와 테이블로 출력하는 아주아주 기본적인 작업만 진행한 상태다.

게시판이라고 할 수 있는 상태가 아니다.

이외에 목록을 클릭했을때 해당 게시물에 대한 컨텐츠 내용을 출력할 수 있게 구현해야 하며

게시글 작성, 게시글 삭제, 게시글 수정, 게시글 목록 페이징 처리 등…..

앞으로 작업해야 할 일들이 많다.

이제 그 기능들을 차츰차츰 구현해 나가보자.

Spring 게시판 만들기 기초 -1

spring plugin을 설치 한 후의 내용이다.

spring legecy MVC프로젝트 만들기

new-other를 클릭한 후 spring을 검색, spring legecy 프로젝트 선택

next 선택 후 spring MVC Project 선택. 프로젝트이름은 아무렇게나 지으면 된다.

이 후 project setting 창에서는 패키지를 3단까지 쓰면 된다. 여기서 작성한 패키지에

HomeController가 위치하게 된다. 적당히 com.study.home으로 작성하자.

com.study.home에 HomeController가 있는 것을 확인할 수 있다.

프로젝트 세팅

1. 프로젝트 properties

spring legecy프로젝트는 기본적으로 빌드를 Maven으로 한다. Maven은 빌드된 파일을 배포할 때 jre가 아닌 jdk를

필요로 한다. 그래서 프로젝트 java build-path에는 jre가 아닌 jdk가 있어야 한다.

프로젝트 우클릭-properties- Java-Build-path에서 기존의 JRE System Library가 jre로 되어있다면 jdk로 바꿔주자.(1.8로)

이번엔 properties-Project Facets에 가서

Dynamic Web Module은 3.1, Java는 1.8, Javascript는 1.0으로 하고 체크해주자.

그리고 오른쪽의 Runtimes에서 Apache Tomcat 9.0 체크하자.

이상을 다 끝냈으면 Apply and Close를 누러 설정을 저장하자.

2. pom.xml

pom.xml은 메이븐설정으로 메이븐은 pom.xml에 명시 된 dependency가 현재 프로젝트 라이브러리에 있는지

확인한 후 없다면 mvn repository에서 해당 라이브러리를 다운받아 프로젝트 라이브러리에 추가한다.

다음은 기본 게시판을 만드는데 필요한 lib를 위해 pom.xml이다. 만들어진 프로젝트에 복사하자.

pom.xml

4.0.0 com.study home study4_1 war 1.0.0-BUILD-SNAPSHOT 1.8 4.3.28.RELEASE 1.9.6 1.7.30 org.springframework spring-context ${org.springframework-version} commons-logging commons-logging org.springframework spring-webmvc ${org.springframework-version} org.springframework spring-orm ${org.springframework-version} org.aspectj aspectjrt ${org.aspectj-version} org.aspectj aspectjweaver 1.9.7 org.slf4j slf4j-api ${org.slf4j-version} org.slf4j jcl-over-slf4j ${org.slf4j-version} runtime org.slf4j slf4j-log4j12 ${org.slf4j-version} runtime log4j log4j 1.2.15 javax.mail mail javax.jms jms com.sun.jdmk jmxtools com.sun.jmx jmxri runtime javax.inject javax.inject 1 javax.servlet javax.servlet-api 3.1.0 provided javax.servlet.jsp javax.servlet.jsp-api 2.3.3 provided javax.servlet jstl 1.2 commons-beanutils commons-beanutils 1.9.4 org.apache.commons commons-collections4 4.4 org.apache.commons commons-dbcp2 2.7.0 org.apache.commons commons-lang3 3.11 commons-logging commons-logging 1.2 org.apache.commons commons-pool2 2.8.1 org.mybatis mybatis 3.5.6 org.mybatis mybatis-spring 2.0.6 com.oracle.database.jdbc ojdbc8 19.6.0.0 com.oracle.database.nls orai18n 19.6.0.0 junit junit 4.7 test maven-eclipse-plugin 2.9 org.springframework.ide.eclipse.core.springnature org.springframework.ide.eclipse.core.springbuilder true true org.apache.maven.plugins maven-compiler-plugin 3.8.1 ${java-version} ${java-version} -Xlint:all true true org.codehaus.mojo exec-maven-plugin 1.6.0 org.test.int1.Main

3. web.xml

Project Facet에서 Dynamic Web module을 3.1로 바꿔줬기 때문에 web.xml의 DTD도 3.1로 바꿔준다.

Spring 프로젝트가 처리하는 과정에서의 encoding을 전부 UTF-8로 해줄거다.

또한 스프링에서 제공하는 파일들의 설정파일 위치를 /WEB-INF/classes/spring 폴더로 지정하자.

그리고 spring 설정파일의 이름을 바꿀 것이다. 이를 위해 web.xml을 다음과 같이 작성하자.(복사하자)

web.xml

encoding org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encoding /* contextConfigLocation /WEB-INF/classes/spring/context-*.xml org.springframework.web.context.ContextLoaderListener appServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/classes/spring/mvc-servlet.xml 1 appServlet /

web.xml에서 작성한대로 스프링 설정파일을 위치시켜야 한다.

프로젝트 생성 시 처음 생성되는 spring설정파일들이다.

servlet-context.xml ===> mvc-servlet.xml로,

root-context.xml ===> context-main.xml로 변경해준다.

이후 java Resource – src/main/resources 우클릭 new other 후 folder를 생성해준다. 폴더의 이름은 spring.

이 폴더에다가 아까 이름을 변경한 mvc-servlet.xml, context-main.xml을 이동시킨다.

WEB-INF/spring 폴더는 이제 필요없으므로 삭제한다.

4. mvc-servlet.xml , context-main.xml

mvc-servlet.xml

com.study의 하위패키지를 스캔. @Controller만 찾아서 빈등록하도록 설정,그 외에는 기본값.

아래 내용을 복사하자.

context-main.xml

com.study의 하위패키즈를 스캔해서 @Controller을 제외한 몇 가지 @을 빈으로 등록하자.

또 mybatis 관련 설정도 하자. 이 때 mybatis 설정 값을 직접 입력하지 않고 properties를 이용해

입력하도록 properties에 관한 빈도 추가하자.

아래내용을 복사한다.

mybatis 설정값에 관한 appconfig.properties를 만들자.

spring 폴더 우클릭-new-other file 선택 후 이름을 appconfig.properties라고 짓자.

appconifg를 다음과 같이 작성하자.

# appconfig.properties # file encoding is UTF-8 # JDBC information jdbc.driverClassName=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@you.tfvp.org:1521:xe jdbc.username=jsp jdbc.password=oracle jdbc.defaultAutoCommit=true jdbc.maxTotal=4 jdbc.minIdle=4 jdbc.validationQuery=SELECT 1 FROM dual

5. mybatis 파일들

context-main.xml에서 기입한 mybatis 설정대로 mybatis 관련 파일을 만들면 된다.

src/main/resource폴더밑에 mybatis폴더를 만들고

우클릭 new-other-xml File을 선택한다. 파일이름은 mybatis-config.xml로 한다.

mybatis-config.xml 파일 내용은 다음과 같다.

이번엔 mybatis 폴더 안에 또 mapper라는 폴더를 만들자.

(이클립스에 따라 폴더안에 폴더가 mybatis.mapper 형태로 보일수도

mybatis/mapper 형태로 보일수도 있다. 상관없다. 중요한건 mybatis폴더안에 mapper 폴더를 만드는 거다.)

그리고 mybatis/mapper 폴더안에 new-other-mybatis XML Mapper파일을 하나 만들고 freeBoard.xml이라 하자.

(freeBoard.xml 내용은 나중에 작성한다)

그 다음으로 DB의 데이터를 담을 FreeBoardVO를 만들자. 패키지는 com.study.free.vo이다.

FreeBoardVO.java

package com.study.free.vo; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; public class FreeBoardVO { private int boNo; /*글 번호*/ private String boTitle; /*글 제목*/ private String boCategory; /*글 분류 코드*/ private String boWriter; /*작성자명*/ private String boPass; /*비밀번호*/ private String boContent; /*글 내용*/ private int boHit; /*조회수*/ private String boRegDate; /*등록 일자*/ private String boModDate; /*수정 일자*/ private String boDelYn; /*삭제 여부*/ @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } public int getBoNo() { return boNo; } public void setBoNo(int boNo) { this.boNo = boNo; } public String getBoTitle() { return boTitle; } public void setBoTitle(String boTitle) { this.boTitle = boTitle; } public String getBoCategory() { return boCategory; } public void setBoCategory(String boCategory) { this.boCategory = boCategory; } public String getBoWriter() { return boWriter; } public void setBoWriter(String boWriter) { this.boWriter = boWriter; } public String getBoPass() { return boPass; } public void setBoPass(String boPass) { this.boPass = boPass; } public String getBoContent() { return boContent; } public void setBoContent(String boContent) { this.boContent = boContent; } public int getBoHit() { return boHit; } public void setBoHit(int boHit) { this.boHit = boHit; } public String getBoRegDate() { return boRegDate; } public void setBoRegDate(String boRegDate) { this.boRegDate = boRegDate; } public String getBoModDate() { return boModDate; } public void setBoModDate(String boModDate) { this.boModDate = boModDate; } public String getBoDelYn() { return boDelYn; } public void setBoDelYn(String boDelYn) { this.boDelYn = boDelYn; } }

여기까지 했으면 모든 준비는 끝났다.

(여기까지의 과정은 구글드라이브 anything_start 압축파일에 있다. import하자)

——————————————————————————————————————————–

이제 요청을 처리할 Controller와

DB에 연결해서 쿼리문을 수행할 InterfaceDao와 mybatis-mapper파일(freeBoard.xml : 이미 만들어 놨다 내용은없지만),

그리고 화면을 보여줄 JSP만 만들면 된다.

(간단한 게시판을 만드는 버전에서 Service는 필요없다.)

com.study.free.dao에 interface를 만들자. 중요한건 @Mapper를 꼭 적용하자.

IFreeBoardDao.java

package com.study.free.dao; import java.util.List; import org.apache.ibatis.annotations.Mapper; import com.study.free.vo.FreeBoardVO; @Mapper public interface IFreeBoardDao { public List getBoardList(); }

이제 IFreeBoardDao 대신 쿼리문을 실행할 mybatis-mapper파일인 freeBoard.xml을 작성하자.

먼저 namespace에 com.study.free.dao.IFreeBoard를 입력해 IFreeBoardDao의 mapper라는걸 명시해주자.

그리고 getBoardList()메소드에 대한 select쿼리문을 작성한다.

freeBoard.xml

이제 DB관련부분을 끝났다. 요청을 받아 처리할 Controller를 만들자.

com.study.free.web 패키지에 FreeController를 만들자.

꼭 @Controller를 붙이고 IfreeBoardDao에 @Inject하자.

그리고 각각의 요청을 처리할 @RequestMapping이 붙은 메소드를 작성하면 된다.

@RequestMapping의 url은 마음대로 해도 되지만 “/free/freeList.wow”로 하겠다.

FreeController

package com.study.free.web; import java.util.List; import java.util.Locale; import javax.inject.Inject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.study.free.dao.IFreeBoardDao; import com.study.free.vo.FreeBoardVO; @Controller public class FreeController { @Inject IFreeBoardDao freeBoardDao; @RequestMapping(“/free/freeList.wow”) public String freeList(Model model) { List freeBoardList=freeBoardDao.getBoardList(); model.addAttribute(“freeBoardList”,freeBoardList); return “free/freeList”; } }

마지막으로 freeList.jsp를 만들면 된다. Controller에서 “free/freeList”로 return했으므로

“/WEB-INF/views/free/freeList.jsp” 에 위치하는 freeList.jsp를 만들자.

model에 담긴 List를 보여주기 위해 테이블을 만들고

안의

태그가 반복되니까 를 써주자.

또 제목을 클릭하면 해당 글 상세페이지로 가야되니까 태그에 href속성에

파라미터로 boNo=${freeBoard.boNo}를 준다.

또 list에서 글쓰기 버튼 하나 만들어주자.

freeList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% request.setCharacterEncoding("UTF-8"); %> 글쓰기

글번호 제목 글 분류 작성자 등록일
${freeBoard.boNo } ${freeBoard.boTitle } ${freeBoard.boCategory } ${freeBoard.boWriter } ${freeBoard.boRegDate }

지금까지 잘 따라했다면 파일들은 다음과 같습니다.

이제 프로젝트를 서버에 올리고 localhost:8080/home/free/freeList.wow로 요청해봅시다.

(※스프링 프로젝트를 만들면 기본적으로 contextPath는 ‘home’으로 설정되어 있습니다.)

다음과 같이 화면이 잘 나온다면 됩니다.

———————————————————————————————————————————–

이제 남은건 List뿐만 아니라 나머지 화면들도 만들어 주기만 하면 됩니다.

화면 하나당 우리가 할 일은 다음과 같습니다.

FreeController에 메소드 추가, RequestMapping붙이고 안에 내용 작성( jsp에서의 요청에 맞는 url값 처리)

IFreeBoardDao에 메소드추가

freeBoard.xml에 메소드 추가 후 쿼리문 작성

/WEB-INF/views/free 폴더에 jsp 작성 (form태그 및 a태그를 이동하고 싶은 페이지에 맞게 작성)

기본적인 CRUD를 구성은 다음과 같습니다. 원래는 비밀번호가지고 여러가지를 했지만

기본CRUD에서는 아무조건없이 다 업데이트되고 다 볼 수 있습니다.

List: 테이블에서 여러개의 데이터 보여주기 (del_yn이 ‘N’인 것만 보여줍시다.)

view: 테이블에서 where조건절로 1개 데이터 자세히 보여주기. 사용자 입력x only 구경

edit : 테이블에서 where조건절로 1개 데이터 자세히 보여주기, 사용자가 입력 가능. form태그 있음

modify : edit(form태그)에서 넘어온 파라미터를 DB에서 update

delete : edit에서 넘어온 파라미터(글번호 있음)가지고 DB에서 *_del_yn을 ‘Y’로 업데이트

form : form태그에서 사용자가 여러 데이터 입력

regist : form에서 온 데이터가지고 DB에 insert

완성된 파일들은 다음과 같습니다.

IFreeBoardDao

package com.study.free.dao; import java.util.List; import org.apache.ibatis.annotations.Mapper; import com.study.free.vo.FreeBoardVO; @Mapper public interface IFreeBoardDao { public List getBoardList(); public FreeBoardVO getBoard(int boNo); public int updateBoard(FreeBoardVO freeBoard); public int deleteBoard(FreeBoardVO freeBoard); public int insertBoard(FreeBoardVO freeBoard); }

freeBoard.xml

UPDATE free_board SET bo_title=#{boTitle} ,bo_category=#{boCategory} ,bo_content=#{boContent} ,bo_mod_date=sysdate WHERE bo_no=#{boNo} UPDATE free_board SET bo_del_yn=’Y’ WHERE bo_no=#{boNo} INSERT INTO free_board ( bo_no, bo_title, bo_category , bo_writer , bo_pass, bo_content , bo_hit , bo_reg_date , bo_mod_date , bo_del_yn ) VALUES( seq_free_board.nextval,#{boTitle} , #{boCategory}, #{boWriter}, #{boPass}, #{boContent}, 0, sysdate, null, ‘N’ )

FreeController

package com.study.free.web; import java.util.List; import java.util.Locale; import javax.inject.Inject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import com.study.free.dao.IFreeBoardDao; import com.study.free.vo.FreeBoardVO; @Controller public class FreeController { @Inject IFreeBoardDao freeBoardDao; @RequestMapping(“/free/freeList.wow”) public String freeList(Model model) { List freeBoardList=freeBoardDao.getBoardList(); model.addAttribute(“freeBoardList”,freeBoardList); return “free/freeList”; } @RequestMapping(“/free/freeView.wow”) public String freeView(Model model,int boNo) { FreeBoardVO freeBoard=freeBoardDao.getBoard(boNo); model.addAttribute(“freeBoard”,freeBoard); return “free/freeView”; } @RequestMapping(“/free/freeEdit.wow”) public String freeEdit(Model model,int boNo) { FreeBoardVO freeBoard=freeBoardDao.getBoard(boNo); model.addAttribute(“freeBoard”,freeBoard); return “free/freeEdit”; } @RequestMapping(“/free/freeModify.wow”) public String freeModify(@ModelAttribute(“freeBoard”)FreeBoardVO freeBoard) { freeBoardDao.updateBoard(freeBoard); return “free/freeModify”; } @RequestMapping(“/free/freeDelete.wow”) public String freeDelete(@ModelAttribute(“freeBoard”)FreeBoardVO freeBoard) { freeBoardDao.deleteBoard(freeBoard); return “free/freeDelete”; } @RequestMapping(“/free/freeForm.wow”) public String freeForm() { return “free/freeForm”; } @RequestMapping(“/free/freeRegist.wow”) public String freeEdit(@ModelAttribute(“freeBoard”)FreeBoardVO freeBoard) { freeBoardDao.insertBoard(freeBoard); return “free/freeRegist”; } }

freeList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% request.setCharacterEncoding("UTF-8"); %> 글쓰기

글번호 제목 글 분류 작성자 등록일
${freeBoard.boNo } ${freeBoard.boTitle } ${freeBoard.boCategory } ${freeBoard.boWriter } ${freeBoard.boRegDate }

freeView.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% request.setCharacterEncoding("UTF-8"); %>

글번호 ${freeBoard.boNo }
제목 ${freeBoard.boTitle }
분류 ${freeBoard.boCategory }
작성자 ${freeBoard.boWriter }
비밀번호 ${freeBoard.boPass }
내용
등록일 ${freeBoard.boRegDate }
삭제여부 ${freeBoard.boDelYn }
수정

freeEdit.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% request.setCharacterEncoding("UTF-8"); %>

글번호 ${freeBoard.boNo }
제목
작성자 ${freeBoard.boWriter }
비밀번호
분류
내용
최근등록일자 ${freeBoard.boModDate eq null ? freeBoard.boRegDate : freeBoard.boModDate }

freeModif.y.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% request.setCharacterEncoding("UTF-8"); %> 수정했음

freeDelete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% request.setCharacterEncoding("UTF-8"); %> 삭제했음

freeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% request.setCharacterEncoding("UTF-8"); %>

제목
작성자
비밀번호
분류
내용

freeRegist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% request.setCharacterEncoding("UTF-8"); %> 등록함

[Spring _MVC ①] CRUD 게시판 구현 개발환경 설정 (STS / MVC 패턴 / Mybatis / 스프링 입문 / 백엔드 / 웹개발)

반응형

Spring 으로 MVC 패턴의 기본 CRUD 게시판을 만드는 실습을 하려 한다.

▶ JSP로 CRUD 게시판 만들기

2021.02.04 – [IT 독학/WEB] – [JSP ②] JSP 실습 – CRUD게시판 구현하기 ( jdbc연결 / sql 파일 생성 / / 웹개발 기초 / 웹개발 독학 )

▶ JSP로 MVC 패턴의 게시판 만들기

2021.02.12 – [IT 독학/WEB] – [JSP_MVC ①] MVC 패턴으로 CRUD 게시판 구현하기 ( dto / dao / 웹개발 기초 / 웹개발 독학 / 백엔드 / 웹 프로그래밍)

▶ Servlet으로 MVC 패턴의 게시판 만들기

2021.03.17 – [IT 독학/WEB] – [Servlet ①] 기본 게시판 구현하기 ( 서블릿 / mvc 패턴 / servlet interface 이용 / 웹개발 기초 / 웹개발 독학 / 백엔드 / 웹 프로그래밍)

앞서 스프링의 간단한 이론과 프로젝트 만드는 법, 개발환경 준비하는 법에 대해 블로깅해놨다.

▶ 스프링 개념

2021.04.01 – [IT 독학/WEB] – Spring Framework (스프링 개념 / 스프링 기초 / 스프링 입문 / 프레임워크 개념 / 웹개발 / 웹기초 / 웹독학 / 백엔드 개발자 / 프로그래밍)

▶ maven 프로젝트 만들기

2021.04.02 – [IT 독학/WEB] – Maven 프로젝트 만드는 방법 (이클립스 스프링 다운 / STS 설치 / 스프링 입문 / 백엔드)

▶ 웹 프로젝트 만들기

2021.04.18 – [IT 독학/WEB] – MVC 웹 프로젝트 만드는 방법 두가지 (STS / MVC 패턴 / 스프링 입문 / 백엔드 / 웹개발)

▶ Mybatis

2021.04.05 – [IT 독학/WEB] – Mybatis ( Mybatis 실습 / Java DB 연결 / 웹개발 / 웹독학 / 백엔드 개발자 / 프로그래밍)

참고해보면 좋을 것 같다.

스프링 기본 게시판 구현 실습

1. 웹 프로젝트 생성

File > New > Spring Legacy Project > Spring MVC Project

2. pom.xml에 필요한 라이브러리 추가

mvnrepository.com/

위에서 검색해

ojdbc, mybatis, mybatis-spring, common-dbcp, spring-orm 을 추가해줬다.

spring-orm의 버전은 springframework의 버전을 가져오는 걸로 했다.

ojdbc6을 추가해주며 repository도 같이 가져와 준다.

프로퍼티즈 위에 넣어줬다.

그리고 자바 버전도 변경해줬다.

pom.xml 뿐만 아니라 프로퍼티에서도 바꿔줬다.

일단 기본적인 세팅을 해줬다.

3. applicationContext 으로 이름 변경 및 위치 변경

이건 안해도 되는데 개인적으로 applicationContext로 모델 관리하는 걸로 공부해서 헷갈릴까봐 바꿔준거다.

4. web.xml 에서 위치변경, servlet 매핑 url-pattern 변경, 필터 추가

여기에 인코딩 필터도 추가해줬다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 < filter > < filter-name > encodingFilter < / filter-name > < filter-class > org.springframework.web.filter.CharacterEncodingFilter < / filter-class > < init-param > < param-name > encoding < / param-name > < param-value > UTF-8 < / param-value > < / init-param > < init-param > < param-name > forceEncoding < / param-name > < param-value > true < / param-value > < / init-param > < / filter > < filter-mapping > < filter-name > encodingFilter < / filter-name > < url-pattern > /* < / url-pattern > < / filter-mapping > Colored by Color Scripter cs

5. 게시판 CRUD 기능을 사용할 DB 테이블 생성

WEB-INF > spring 안에 sql 파일을 만드려고 하는데 안뜬다. 그럼 그냥 파일로 만들어 놓고 오라클로 돌려서 넣어주면 된다.

이게 안되니

그냥 파일을 만들어 넣어줬다.

이렇게 파일을 찾아서 오라클 (sqldeveloper)로 열어주면 된다.

자기 계정에 테이블을 만들어주고 데이터도 하나 넣어주고 커밋, 저장까지 해주고 닫아준다.

6. Dto, Dao, Biz 생성

6-1. BoardDto.java

객체 기본, 매개변수 생성자, getter&setter 만들어줬다.

6-2. BoardBiz.java / BoardBizImpl.java

CRUD 메서드 미리 적어줬다.

6-3. BoardDao.java / BoardDaoImpl.java

7. mybatis와 연결할 파일 설정

자세한 내용은 블로그에 올린 mybatis실습에 있다.

xml 파일을 만들어 mapper에 관한 mybatis 정보를 붙여넣었다.

db.properties는 db 정보를 적어줬다.

그리고 config.xml 을 만들어 mybatis 기본 설정을 해줬다.

간단히 Dto 별칭과 mapper 위치 정도만 적어준다.

db.properties는 applicationContext.xml 에서 해준다.

8. applicationContext.xml 에 bean 설정 정보 적어줌

db.properties의 정보도 가져오고 mybatis 정보도 가져와 적어준다.

xml 네임스페이스도 추가해줬다,

여기까지가 기본 설정이다.

기본 설정만 굉장히 많다.

그 다음은 CRUD 게시판 구현의 CR 기능을 실습해보겠다.

2021.05.02 – [IT 독학/WEB] – [Spring _MVC ②] CRUD 게시판 구현 C R 기능 (STS / MVC 패턴 / Mybatis / 스프링 입문 / 백엔드 / 웹개발)

반응형

[Spring] Spring MVC 구조 자유게시판 만들기

qh5944.tistory.com/97?category=418956

저번 게시물에 이어서 마지막으로 게시판 총 완성을 시켜보겠습니다.

개념 정리

fList의 인덱스 번호 (varStatus=”s”)

fList.get(0) => sList.get(0)

${sList[s.index]}

– 여러개의 ArrayList가 들어와도 동시에 출력이 가능하게 함

# download

– 헤더 → 데이터 전송전에 보내는 내용 : 다운로드창을 보여준다 (파일명,파일크기)

– 헤더 → response

– request : 사용자가 요청값 전송 → 사용자 정보(IP)

– response : 응답 (Cookie,Header,HTML)

코드

# DB에 테이블에 컬럼 추가 SQL문

1 2 3 ALTER TABLE spring_board ADD filename VARCHAR2( 1000 ); ALTER TABLE spring_board ADD filesize VARCHAR2( 1000 ); ALTER TABLE spring_board ADD filecount NUMBER DEFAULT 0 ; cs

# applicaition-datasource.xml

경로 : WEB-INF – config – applicaition-datasource.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 < ?xml version = "1.0" encoding = "UTF-8" ? > < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:context = "http://www.springframework.org/schema/context" xmlns:p = "http://www.springframework.org/schema/p" xmlns:tx = "http://www.springframework.org/schema/tx" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd" > < bean id = "ds" class = "org.apache.commons.dbcp.BasicDataSource" p:driverClassName = "oracle.jdbc.driver.OracleDriver" p:url = "jdbc:oracle:thin:@211.238.142.181:1521:XE" p:username = "hr" p:password = "happy" / > < bean id = "ssf" class = "org.mybatis.spring.SqlSessionFactoryBean" p:dataSource-ref = "ds" / > < bean id = "bmapper" class = "org.mybatis.spring.mapper.MapperFactoryBean" p:sqlSessionFactory-ref = "ssf" p:mapperInterface = "com.sist.dao.BoardMapper" / > < bean id = "rmapper" class = "org.mybatis.spring.mapper.MapperFactoryBean" p:sqlSessionFactory-ref = "ssf" p:mapperInterface = "com.sist.dao.ReplyMapper" / > < / beans > Colored by Color Scripter cs

# application-context.xml

경로 : WEB-INF – config -applicaition-context.xml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 < ?xml version = "1.0" encoding = "UTF-8" ? > < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xmlns:mvc = "http://www.springframework.org/schema/mvc" xmlns:p = "http://www.springframework.org/schema/p" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd" > < context:component-scan base-package = "com.sist.*" / > < mvc:annotation-driven > < mvc:message-converters > < bean class = "org.springframework.http.converter.StringHttpMessageConverter" > < property name = "supportedMediaTypes" > < list > < value > text/html;charset=UTF-8 < / value > < / list > < / property > < / bean > < / mvc:message-converters > < / mvc:annotation-driven > < bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix = "/" p:suffix = ".jsp" / > < bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" / > < / beans > Colored by Color Scripter cs

# ReplyVO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 package com.sist.dao; import java.util. * ; public class ReplyVO { private int no; private int bno; private String id; private String name; private String msg; private Date regdate; private String dbday; public int getNo() { return no; } public void setNo( int no) { this .no = no; } public int getBno() { return bno; } public void setBno( int bno) { this .bno = bno; } public String getId() { return id; } public void setId( String id) { this .id = id; } public String getName() { return name; } public void setName( String name) { this .name = name; } public String getMsg() { return msg; } public void setMsg( String msg) { this .msg = msg; } public Date getRegdate() { return regdate; } public void setRegdate(Date regdate) { this .regdate = regdate; } public String getDbday() { return dbday; } public void setDbday( String dbday) { this .dbday = dbday; } } Colored by Color Scripter cs

# ReplyDAO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 package com.sist.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util. * ; @Repository public class ReplyDAO { @Autowired private ReplyMapper mapper; public List < ReplyVO > replyListData( int bno) { return mapper.replyListData(bno); } } Colored by Color Scripter cs

# ReplyMapper

1 2 3 4 5 6 7 8 9 10 11 12 package com.sist.dao; import org.apache.ibatis.annotations.Select; import java.util. * ; public interface ReplyMapper { // 목록 읽기 @Select( “SELECT no,bno,id,name,msg,TO_CHAR(regdate,’YYYY-MM-DD HH24:MI:SS’) as dbday ” + “FROM spring_reply ” + “WHERE bno=#{bno} ” + “ORDER BY no DESC” ) public List < ReplyVO > replyListData( int bno); } Colored by Color Scripter cs

실행 화면

list.jsp 실행

시험삼아 넣어본 심청이의 게시물

detail.jsp

심청이 게시물 상세페이지

insert.jsp

list.jsp에서 [새글] 누르고 나오는 글쓰기 화면

파일 업로드도 가능하다.

다시 list.jsp

새 글이 업데이트 된게 보이네요

delete.jsp

상세페이지에서 삭제를 누르고 글쓸 때 사용했던 비밀번호를 치고 삭제

정상적으로 삭제된 화면.

Spring MVC 간단한 게시판 만들기

728×90

간단한 사용자 관리 프로젝트를 만들어보고,

예전에 jsp공부할 때 만들었던 jdbc 게시판을 응용해

Spring MVC 버전으로 게시판을 만들어볼 예정이다.

최종 결과 화면으로

글 작성, 수정, 삭제, 조회가 가능한 게시판을 만들어볼 예정이다.

Board 테이블

board_seq 시퀀스를 생성해 게시글을 작성할 때마다 자동으로 1씩 wr_uid가 증가하도록 했다.

기본키는 wr_uid

0️⃣ MVC 프로젝트 생성하기

new – > Spring legacy project -> Spring mvc project 패키지명 설정

❗ 패키지명 작성할 때는 예를 들어 com.lec.board다 하면 마지막 세번째 즉 board가 컨텍스트 이름이 되기 때문에

설정 잘해주기!

이런식의 Sping MVC 프로젝트가 생성되었다면

src/main/java는 웹 root

servlet-context.xml은 스프링 설정파일

web.xml은 dispatcherServlet 설정파일로, servlet-context.xml 파일 위치도 정의해둔다.

pom.xml에는 maven 설정파일이다.

1️⃣ pom.xml, web.xml 설정파일

pom.xml에는 필요한 라이브러리를 추가해주고, web.xml에는 한글 인코딩 코드를 넣어줘야 한글이 깨지지 않는다.

encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter /*

web.xml에 복붙하고 저장하면 된다.

pom.xml에는 자신의 버전에 맞게 라이브러리 추가해주면 된다.

org.hibernate.validator

hibernate-validator

6.2.0.Final

org.springframework

spring-webmvc

5.2.17.RELEASE

org.mybatis

mybatis

3.4.6

org.mybatis

mybatis-spring

1.3.2

org.springframework

spring-aop

5.2.17.RELEASE

org.aspectj

aspectjweaver

1.9.5

runtime

com.oracle.database.jdbc

ojdbc6

11.2.0.4

org.springframework

spring-jdbc

5.2.17.RELEASE

javax.annotation

javax.annotation-api

1.3.2

junit

junit

4.12

test

org.springframework

spring-test

5.2.17.RELEASE

test

내가 추가했던 라이브러리는 이렇게 된다!

2️⃣ 필요한 패키지, 클래스, jsp 생성하기

value.properties 생성

3️⃣ Spring 설정 파일

Spring 설정 파일인 servlet-context.xml에 dataSource와 mybatis 등의 빈을 추가해준다.

dataSource 설정 MyBatis 설정 Mapper 인터페이스 설정

❗ Mapper 인터페이스

: Mapping 파일에 기재된 sql을 호출하기 위한 인터페이스로 Mapping 파일에 있는 sql을 자바 인터페이스를 통해 호출 할 수 있도록 해준다.

4️⃣ MyBatis 설정 파일 작성하기(Vo객체설정) SqlMapConfig.xml , Mapping 파일 작성 Board.xml

SqlMapConfig.xml board.xml

5️⃣ BoardVO, BoardService, BoardDAO 작성 및 구현하기

– BoardVO.java

package com.lec.board.vo; public class BoardVO { private int wr_uid; private String subject; private String content; private String name; private int viewcnt; private String regdate; public BoardVO() { super(); } public BoardVO(int wr_uid, String subject, String content, String name, int viewcnt, String regdate) { super(); this.wr_uid = wr_uid; this.subject = subject; this.content = content; this.name = name; this.viewcnt = viewcnt; this.regdate = regdate; } public int getWr_uid() { return wr_uid; } public void setWr_uid(int wr_uid) { this.wr_uid = wr_uid; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getViewcnt() { return viewcnt; } public void setViewcnt(int viewcnt) { this.viewcnt = viewcnt; } public String getRegdate() { return regdate; } public void setRegdate(String regdate) { this.regdate = regdate; } }

변수명은 db 테이블 컬럼명과 맞춰준다.

– BoardService.java (인터페이스)

package com.lec.board.service; import java.util.List; import com.lec.board.vo.BoardVO; public interface BoardService { public List selectList(); public BoardVO selectOne(String wr_uid); public void updateViewcnt(String wr_uid); public void insertOne(BoardVO board); public void updateOne(BoardVO board); public void deleteOne(String wr_uid); }

– BoardServiceImple.java (BoardService 구현)

package com.lec.board.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.lec.board.dao.BoardDAO; import com.lec.board.vo.BoardVO; @Service(“boardService”) public class BoardServiceImple implements BoardService { @Autowired BoardDAO boardDao; @Override public List selectList() { List list = boardDao.selectAll(); return list; } @Override public BoardVO selectOne(String wr_uid) { BoardVO board = boardDao.select(wr_uid); return board; } @Override public void updateViewcnt(String wr_uid) { boardDao.updateCount(wr_uid); } @Override public void insertOne(BoardVO board) { boardDao.insert(board); } @Override public void updateOne(BoardVO board) { boardDao.update(board); } @Override public void deleteOne(String wr_uid) { boardDao.delete(wr_uid); } }

– BoardDAO.java (인터페이스)

package com.lec.board.dao; import java.util.List; import com.lec.board.vo.BoardVO; public interface BoardDAO { public List selectAll(); public BoardVO select(String wr_uid); public void updateCount(String wr_uid); public void insert(BoardVO board); public void update(BoardVO board); public void delete(String wr_uid); }

– BoardDAOJDBC.java (BoardDAO 구현)

package com.lec.board.dao; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.lec.board.vo.BoardVO; @Repository(“boardDao”) public class BoardDAOJDBC implements BoardDAO { @Autowired BoardMapper boardMapper; @Override public List selectAll() { List list = boardMapper.selectAll(); return list; } @Override public BoardVO select(String wr_uid) { BoardVO board = boardMapper.selectOne(wr_uid); return board; } @Override public void updateCount(String wr_uid) { boardMapper.updateViewcnt(wr_uid); } @Override public void insert(BoardVO board) { boardMapper.insertOne(board); } @Override public void update(BoardVO board) { boardMapper.updateOne(board); } @Override public void delete(String wr_uid) { boardMapper.deleteOne(wr_uid); } }

– BoardMapper 인터페이스

package com.lec.board.dao; import java.util.List; import com.lec.board.vo.BoardVO; public interface BoardMapper { List selectAll(); BoardVO selectOne(String wr_uid); void insertOne(BoardVO board); void updateOne(BoardVO board); void deleteOne(String wr_uid); void updateViewcnt(String wr_uid); }

❗ Spring MVC 기반 웹 애플리케이션 작성 절차

1. 클라이언트의 요청을 받는 DispatcherServlet를 web.xml에 설정

2. 클라이언트의 요청을 처리할 Controller 작성

3. Spring bean으로 Controller 등록

4. jsp를 이용한 view 영역의 코드를 작성

5. browser 상에서 jsp를 실행

6️⃣ 게시판 글 목록 조회

list.do

– BoardController

BoardController.java

게시판 목록 조회 요청 url은 “/board/list.do”이다.

DispathcherServlet이 클라이언트의 요청을 받아 url과 요청 정보를 기준으로 HandlerMapping을 통해 모델 객체 메서드를 호출한다. 그리고 모델에서 요청에 대해 처리하고, 처리 결과 데이터를 model에 담아 board/list.jsp 에 리턴한다.

list.jsp

list.jsp에서는 전달받은 객체를 ${list}로 받아서 jstl core 라이브러리를 사용해 반복문으로 테이블에 목록을 출력해준다.

그리고 제목을 클릭하면 해당 글을 조회할 수 있도록 하이퍼링크를 달았다.

7️⃣ 특정 글 조회

특정 글 조회 결과 BoardController.java

특정 글 조회 요청 url은 “/board/view.do”이다.

그리고 특정 글 조회를 위해 wr_uid 를 파라미터로 받는다.

특정 글을 클릭하면 해당 글을 조회할 수 있어야 하며, 조회수가 1 증가해야하기 때문에

두가지를 수행한다.

그리고 모델의 수행 결과를 ModelAndView 객체에 반환했다.

view.jsp

조회 결과를 board에 담아서 view.jsp에 전달했기 때문에 view에서는 ${board.wr_uid} 하면 해당 값을 출력할 수 있다.

그리고 해당 글을 삭제하고 싶을 때 삭제하기 버튼을 누르면 사용자에게 한번 더 확인하는 확인창을 띄워 사용자가 확인 버튼을 눌러야 삭제가 동작하도록 했다.

8️⃣ 글 작성

글 작성 페이지 BoardController.java

list, view 화면에서 신규 등록 버튼을 누르면 나타나는 화면으로 새로운 글을 작성할 수 있는 페이지이다.

write.jsp

글 작성 페이지에서 등록 버튼을 누르면 writeOk.do가 실행되어 작성한 글이 데이터베이스에 반영된다.

BoardController.java

글을 등록한 후에는 다시 리다이렉트하여 list.do로 이동한다.

9️⃣ 글 수정

특정 글 조회 페이지

글을 수정하기 위해서 수정하기 버튼을 누르면

글 수정 페이지

이렇게 제목과 내용을 수정할 수 있는 페이지로 바뀐다.

wr_uid와 name 등은 변경할 수 없도록 했다.

BoardController.java

우선 글 수정 페이지에서는 원래 수정 전 글이 표시되어야 하기 때문에 selectOne 을 통해 특정 글을 조회해 표시해준다.

update.jsp BoardController.java

글을 수정한 후에 수정버튼을 누르면 updateOk.do가 실행되면서 글 수정을 데이터베이스에 반영하고 난 후에

redirect로 list로 한다.

🔟 글 삭제

글 삭제 확인 페이지 BoardController

BoardController에서는 @PathVariable 어노테이션을 통해 파라미터를 url형식으로 받을 수 있도록 해준다.

글 삭제는 페이지가 따로 필요 없기 때문에 해당 글의 uid를 url형식으로 받도록 했다.

사용자가 확인 버튼을 누르면 삭제가 되고, 다시 목록으로 돌아가도록 리다이렉트 한다.

이렇게 하면 간단한 게시판을 조회, 수정, 삭제, 등록할 수 있다.

이제 여기서 제목이나 작성자는 반드시 작성하도록 유효성을 점검한다던가,

에러가 발생한다면 에러 페이지를 만들어주거나 하는 등 해서

점점 추가해 나갈 예정이다!

728×90

코딩맛집 :: Spring MVC 패턴 스프링 게시판 만들기

728×90

이번에는 Spring MVC 패턴을 이용하여 게시판을 만들어보도록 하겠습니다.

우선 로직과 파일의 폴더 구성은 아래와 같습니다.

작업 순서도

1. DB작성

2. 프로젝트 생성

3. pom.xml, web.xml 수정

1. 테이블, 시퀀스 작성 후 테스트 데이터 입력

select * from tab; create table mvc_board( bno number primary key, writer varchar2(20) not null, title varchar2(100) not null, content varchar2(1000) not null, write_date DATE default SYSDATE, hit int default 0); create sequence mvc_board_seq; insert into mvc_board( bno, writer, title, content) values (mvc_board_seq.nextval, ‘kim’, ‘제목1’, ‘내용1입니다’); commit;

2. 프로젝트 생성

변경할 코드는 아래에서 참조한다.

server.xml 수정

…더보기

혹은 context.xml 수정

…더보기 WEB-INF/web.xml WEB-INF/tomcat-web.xml ${catalina.base}/conf/web.xml

3. 이클립스 – pom.xml 수정

…더보기 4.0.0 com.lje springboard SpringMVCBoard01 war 1.0.0-BUILD-SNAPSHOT 1.8 5.1.9.RELEASE 1.6.10 1.6.6 org.springframework spring-context ${org.springframework-version} commons-logging commons-logging org.springframework spring-webmvc ${org.springframework-version} org.aspectj aspectjrt ${org.aspectj-version} org.slf4j slf4j-api ${org.slf4j-version} org.slf4j jcl-over-slf4j ${org.slf4j-version} runtime org.slf4j slf4j-log4j12 ${org.slf4j-version} runtime log4j log4j 1.2.15 javax.mail mail javax.jms jms com.sun.jdmk jmxtools com.sun.jmx jmxri runtime javax.inject javax.inject 1 javax.servlet servlet-api 2.5 provided javax.servlet.jsp jsp-api 2.1 provided javax.servlet jstl 1.2 junit junit 4.12 test org.springframework spring-test 5.1.9.RELEASE test org.springframework spring-jdbc 5.1.9.RELEASE org.apache.commons commons-dbcp2 2.7.0 mysql mysql-connector-java 8.0.17 maven-eclipse-plugin 2.9 org.springframework.ide.eclipse.core.springnature org.springframework.ide.eclipse.core.springbuilder true true org.apache.maven.plugins maven-compiler-plugin 2.5.1 1.8 1.8 -Xlint:all true true org.codehaus.mojo exec-maven-plugin 1.2.1 org.test.int1.Main

pom.xml 수정 (2) Maven Repository 이용

1) spring-test context

org.springframework spring-test 5.1.9.RELEASE test

2) Spring JDBC

org.springframework spring-jdbc 5.1.9.RELEASE

3) dbcp

org.apache.commons commons-dbcp2 2.7.0

4) mysql connector J

mysql mysql-connector-java 8.0.17

자동으로 Maven Repository로 연결이 되는 mysql과 달리 오라클은 유료 프로그램이기 때문에 직접 연결을 해 주어야 한다. Build Path를 눌러 Java Build Path > Add External JARs 그리고 Deployment Assembly > Java Build Path Entiries 를 눌러 두 가지를 추가해준다.

web.xml 수정 : 에 Character Encoding Filter 삽입

…더보기 contextConfigLocation /WEB-INF/spring/root-context.xml org.springframework.web.context.ContextLoaderListener appServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/appServlet/servlet-context.xml 1 appServlet / encoding org.springframework.web.filter.CharacterEncodingFilter encoding /*

4. 패키지 작성

com.exam.spring_board.command / com.exam.spring_board.controller

com.exam.spring_board.dao / com.exam.spring_board.dto

DAO

BoardDao.java

…더보기 package com.lje.springboard.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import com.lje.springboard.dto.Board; import com.mysql.cj.xdevapi.PreparableStatement; public class BoardDao { private BoardDao() { } private static BoardDao dao = new BoardDao(); public static BoardDao getInstance() { return dao; } public Connection getConnection() { // 커넥트풀 Connection conn = null; try { Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup(“java:/comp/env”); DataSource ds = (DataSource) envContext.lookup(“jdbc/myoracleDB”); conn = ds.getConnection(); // etc. } catch (Exception e) { e.printStackTrace(); } return conn; } public List selectAll() { List list = new ArrayList(); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; String sql = “select * from mvc_board”; try { conn = getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { Board board = new Board(); board.setBno(rs.getInt(“bno”)); board.setWriter(rs.getString(“writer”)); board.setTitle(rs.getString(“title”)); board.setWrite_date(rs.getTimestamp(“write_date”)); board.setHit(rs.getInt(“hit”)); list.add(board); } } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps, rs); } return list; } //조회수 증가 public void updateHit(int bno) { Connection conn = null; PreparedStatement ps = null; String sql = “update mvc_board set hit=hit+1 where bno=?”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setInt(1, bno); int n = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps); } } public Board selectOne(int bno) { Board board = null; Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; String sql = “select * from mvc_board where bno=?”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setInt(1, bno); rs = ps.executeQuery(); while (rs.next()) { board = new Board(); board.setBno(rs.getInt(“bno”)); board.setWriter(rs.getString(“writer”)); board.setTitle(rs.getString(“title”)); board.setContent(rs.getString(“content”)); board.setWrite_date(rs.getTimestamp(“write_date”)); board.setHit(rs.getInt(“hit”)); } } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps, rs); } return board; } public void insert(Board board) { Connection conn = null; PreparedStatement ps = null; String sql = “insert into mvc_board(bno, writer, title, content) ” + “values (mvc_board_seq.nextval, ?,?,?)”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, board.getWriter()); ps.setString(2, board.getTitle()); ps.setString(3, board.getContent()); int n = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps); } } public void update(Board board) { Connection conn = null; PreparedStatement ps = null; String sql = “update mvc_board set writer=?, title=?, content=? ” + “where bno=?”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, board.getWriter()); ps.setString(2, board.getTitle()); ps.setString(3, board.getContent()); ps.setInt(4, board.getBno()); int n = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps); } } public void delete(int bno) { Connection conn = null; PreparedStatement ps = null; String sql = “delete from mvc_board where bno=?”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setInt(1, bno); int n = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps); } } private void closeDB(Connection conn, PreparedStatement ps, ResultSet rs) { try { if (rs != null) rs.close(); if (ps != null) ps.close(); if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } private void closeDB(Connection conn, PreparedStatement ps) { try { if (ps != null) ps.close(); if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }

DTO

Board.java

…더보기 package com.lje.springboard.dto; import java.sql.Timestamp; public class Board { private int bno; private String writer; private String title; private String content; private Timestamp write_date; private int hit; public int getBno() { return bno; } public void setBno(int bno) { this.bno = bno; } public String getWriter() { return writer; } public void setWriter(String writer) { this.writer = writer; } 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 Timestamp getWrite_date() { return write_date; } public void setWrite_date(Timestamp write_date) { this.write_date = write_date; } public int getHit() { return hit; } public void setHit(int hit) { this.hit = hit; } @Override public String toString() { return “Board [bno=” + bno + “, writer=” + writer + “, title=” + title + “, content=” + content + “, write_date=” + write_date + “, hit=” + hit + “]”; } }

SERVICE

BoardService.java

…더보기 package com.lje.springboard.service; import java.util.List; import com.lje.springboard.dto.Board; public interface BoardService { public List listAll(); public void insert (Board board); public Board read(int bno); public void modify(Board board); public void delete(int bno); }

BoardServiceImpl.java (인터페이스)

인터페이스 생성 시 add로 BoardService를 추가해주면 자동으로 코드가 작성됩니다.

…더보기 1) 싱글톤 방식 package com.lje.springboard.service; import java.util.List; import com.lje.springboard.dao.BoardDao; import com.lje.springboard.dto.Board; public class BoardServiceImpl implements BoardService { @Override public List listAll() { // TODO Auto-generated method stub return BoardDao.getInstance().selectAll(); } @Override public void insert(Board board) { BoardDao.getInstance().insert(board); } @Override public Board read(int bno) { // 조회 시 조회수 증가 BoardDao dao = BoardDao.getInstance(); dao.updateHit(bno); return dao.selectOne(bno); } @Override public void modify(Board board) { BoardDao.getInstance().update(board); } @Override public void delete(int bno) { BoardDao.getInstance().delete(bno); } } 2) 어노테이션을 쓴다면 (지금사용안함) package com.lje.springboard.service; import java.util.List; import com.lje.springboard.dao.BoardDao; import com.lje.springboard.dto.Board; public class BoardServiceImpl implements BoardService { BoardDao dao = null; public BoardServiceImpl() { dao = new BoardDao(); } @Override public List listAll() throws Exception { // TODO Auto-generated method stub return dao.selectAll(); } @Override public void insert(Board board) throws Exception { dao.insert(board); } @Override public read(int bno) throws Exception { // TODO Auto-generated method stub return dao.selectOne(bno); } @Override public void modify(Board board) throws Exception { dao.update(board); } @Override public void delete(int bno) throws Exception { dao.delete(bno); } } 이 경우 BoardDao.java도 수정 package com.lje.springboard.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import com.lje.springboard.dto.Board; import com.mysql.cj.xdevapi.PreparableStatement; public class BoardDao { /* * private BoardDao() { } * * private static BoardDao dao = new BoardDao(); * * public static BoardDao getInstance() { return dao; } */ public Connection getConnection() { // 커넥트풀 Connection conn = null; try { Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup(“java:/comp/env”); DataSource ds = (DataSource) envContext.lookup(“jdbc/myoracleDB”); conn = ds.getConnection(); // etc. } catch (Exception e) { e.printStackTrace(); } return conn; } public List selectAll() { List list = new ArrayList(); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; String sql = “select * from mvc_board”; try { conn = getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { Board board = new Board(); board.setBno(rs.getInt(“bno”)); board.setWriter(rs.getString(“writer”)); board.setTitle(rs.getString(“title”)); board.setWrite_date(rs.getTimestamp(“write_date”)); board.setHit(rs.getInt(“hit”)); list.add(board); } } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps, rs); } return list; } public Board selectOne(int bno) { Board board = null; Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; String sql = “select * from mvc_board where bno=?”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setInt(1, bno); rs = ps.executeQuery(); while (rs.next()) { board = new Board(); board.setBno(rs.getInt(“bno”)); board.setWriter(rs.getString(“writer”)); board.setTitle(rs.getString(“title”)); board.setWrite_date(rs.getTimestamp(“write_date”)); board.setHit(rs.getInt(“hit”)); } } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps, rs); } return board; } public void insert(Board board) { Connection conn = null; PreparedStatement ps = null; String sql = “insert into mvc_board(bno, writer, title, content) ” + “values (mvc_board_seq.nextval, ?,?,?)”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, board.getWriter()); ps.setString(2, board.getTitle()); ps.setString(3, board.getContent()); int n = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps); } } public void update(Board board) { Connection conn = null; PreparedStatement ps = null; String sql = “update mvc_board set writer=?, title=?, content=? ” + “where bno=?”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, board.getWriter()); ps.setString(2, board.getTitle()); ps.setString(3, board.getContent()); ps.setInt(4, board.getBno()); int n = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps); } } public void delete(int bno) { Connection conn = null; PreparedStatement ps = null; String sql = “delete from mvc_board where bno=?”; try { conn = getConnection(); ps = conn.prepareStatement(sql); ps.setInt(1, bno); int n = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { closeDB(conn, ps); } } private void closeDB(Connection conn, PreparedStatement ps, ResultSet rs) { try { if (rs != null) rs.close(); if (ps != null) ps.close(); if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } private void closeDB(Connection conn, PreparedStatement ps) { try { if (ps != null) ps.close(); if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }

CONTROLLER

BoardController.java

…더보기 package com.lje.springboard.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.lje.springboard.dto.Board; import com.lje.springboard.service.BoardService; import com.lje.springboard.service.BoardServiceImpl; @Controller @RequestMapping(“/board”) public class BoardController { BoardService service; @RequestMapping(“/list”) public String list(Model model) { service = new BoardServiceImpl(); model.addAttribute(“list”, service.listAll()); return “board/list”; } @RequestMapping(“/read”) public String read(@RequestParam(“bno”) int bno, Model model) throws Exception{ service = new BoardServiceImpl(); model.addAttribute(“board”, service.read(bno)); return “board/update”; } @GetMapping(“write”) public String writeForm() { return “board/write”; } @PostMapping(“write”) public String write(@ModelAttribute(“board”) Board board) { service = new BoardServiceImpl(); System.out.println(board); //작업테스트 service.insert(board); return “redirect:list”; } @RequestMapping(“update”) public String modify(@ModelAttribute(“board”) Board board) { service = new BoardServiceImpl(); service.modify(board); return “redirect:list”; } @RequestMapping(“delete”) public String delete(@RequestParam(“bno”) int bno) { service = new BoardServiceImpl(); service.delete(bno); return “board/view”; } }

VIEW (JSP) : list.jsp / write.jsp …

중간 실행해서 체크해볼 때는 폴더 안에 만들었으니 /board/를 빼먹지 않는다. http://localhost:8081/springboard/board/list

…더보기 list.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> Insert title here

번호 제목 작성자 날짜 조회수
${board.bno } ${board.title } ${board.writer } ${board.write_date } ${board.hit }

write.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> Insert title here

작성자
제목
내용

update.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> update.jsp

번호
작성자
제목
내용
작성일 ${board.write_date }
조회수 ${board.hit }

728×90

국비 교육 78일차 – spring mvc 게시판 만들기, mvc 프로젝트 셋팅

728×90

반응형

드디어 스프링으로 mvc 게시판을 만들어 봤다. 이제 이걸 토대로 2차 팀 프로젝트를 진행하게 될 것 같다.

파일 구성은 이렇게 되어 있다.

java 에는 DAO, VO, Controller, mapper 파일들이 있고

src 폴더에는 view에 해당하는 jsp 파일들과 스프링 컨테이너 파일에 해당하는 application-context,datasource 파일들을 저장해준다.

이거는 내가 나름대로 정리해본 스프링 mvc 구조도이다.

사용자가 request를 보내면 dispatcherServlet을 통해 model 클래스들에게 필요한 데이터를 전송한다.

Model 클래스들은DAO로부터 데이터베이스에서 받아온 값을 받아와 다시 dispatcherServlet에 전달한다.

그러면 받은 데이터를 viewResolver로 보내주고, viewResolver는 jsp파일명을 찾아서 전송해준다.

dispatcherservlet이 model를 request로 변환하여 jsp로 전송하면 jsp에서 처리한 화면을 response와 함께 사용자의 화면에 띄워준다.

이런 원리로 mvc 구조가 완성되어 있다.

그럼 먼저 spring container 부분을 보면,

클래스를 모아주는 컨테이너에서도 클래스를 파일마다 분리해서 등록해주어야 한다.

사용자 정의 클래스는 application-context.xml,

라이브러리 클래스는 application-datasource.xml 에 각각 등록해준다.

아래 2개는 아직 배우지 않아서 다음에 배우면 다시 정리하도록 하겠다.

사용자 정의 클래스를 모아주는 application-context.xml 파일

사용자가 만든 모든 클래스의 메모리 할당을 요청하고, viewresolver에 경로명과 확장자를 전송한다.

그리고 라이브러리 클래스를 등록하는 application-datasource.xml 파일

여기서는 mybatis 라이브러리를 사용할 클래스들의 메모리 할당을 요청한다. BaiscDataSource, SqlSessionFactoryBean 클래스의 메모리 할당을 요청해서 오라클에 연결할 준비를 완료한다.

그리고 VO와 mapper 클래스를 모아두는 config.xml 파일을 생성해준다.

그리고 mapper.xml에서 dao에 전송해줄 sql문장을 적어준다.

UPDATE webboard SET hit=hit+1 WHERE no=#{no} INSERT INTO webboard VALUES( (SELECT NVL(MAX(no)+1,1) FROM webboard), #{name}, #{subject}, #{content}, #{pwd}, SYSDATE, 0 ) UPDATE webboard SET name=#{name},subject=#{subject},content=#{content} WHERE no=#{no} DELETE FROM webboard WHERE no=#{no}

그리고 controller

package com.sist.web; 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 com.sist.dao.*; // DispatcherServlet와 연결 => DAO에서 결과값을 전송(ViewResolver) /* * 1. 요청 * 2. DispatcherServlet * 3. 요청과 관련된 데이터를 받는다 Model * 4. 요청 <==> DAO * 5. 결과값을 ViewResolver로 전송 */ import java.util.*; @Controller public class BoardController { // 데이터베이스 연결 => DAO의 객체 얻기 @Autowired // 자동 주입 => 스프링에서 BoardDAO객체주소를 찾아서 자동으로 주입 private BoardDAO dao; /* * GET ==> GetMapping() * POST ==> PostMapping() * ======================= + * RequestMapping() */ // 기능 출력 @GetMapping(“board/list.do”) public String board_list(String page,Model model) { if(page==null) page=”1″; // default int curpage=Integer.parseInt(page); // start,end Map map=new HashMap(); int rowSize=10; int start=(rowSize*curpage)-(rowSize-1); int end=rowSize*curpage; map.put(“start”, start); map.put(“end”, end); // WHERE num BETWEEN #{start} AND #{end} => Map을 지정하는 경우에는 반드시 키명을 설정 List list=dao.boardListData(map); int totalpage=dao.boardTotalpage(); // ViewResolver로 데이터를 전송 model.addAttribute(“list”, list); // => request.setAttribute(“list”, list) model.addAttribute(“curpage”, curpage);// => request.setAttribute(“curpage”, curpage) model.addAttribute(“totalpage”, totalpage);// => request.setAttribute(“totalpage”, totalpage) return “board/list”; } @GetMapping(“board/detail.do”) public String board_detail(int no,Model model) { BoardVO vo=dao.boardDetailData(no); model.addAttribute(“vo”, vo); return “board/detail”; } @GetMapping(“board/insert.do”) public String board_insert() { return “board/insert”; } @PostMapping(“board/insert_ok.do”) public String board_insert_ok(BoardVO vo) { dao.boardInsert(vo); return “redirect:list.do”; // 목록 } @GetMapping(“board/update.do”) public String board_update(int no,Model model) { //DAO연동 BoardVO vo=dao.boardUpdateData(no); model.addAttribute(“vo”, vo); return “board/update”; } // @Controller => return시 반드시 파일명,.do ==> @RestController를 사용해서 스크립트 전송 @PostMapping(“board/update_ok.do”) public String board_update_ok(BoardVO vo,Model model) { // 결과값 전송 => 비밀번호 체크 boolean bCheck=dao.boardUpdate(vo); model.addAttribute(“no”, vo.getNo()); model.addAttribute(“bCheck”, bCheck); return “board/update_ok”; } @GetMapping(“board/delete.do”) public String board_delete(int no, Model model) { model.addAttribute(“no”, no); return “board/delete”; } @PostMapping(“board/delete_ok.do”) public String board_delete_ok(int no, String pwd, Model model) { boolean bCheck=dao.boardDelete(no, pwd); model.addAttribute(“bCheck”, bCheck); return “board/delete_ok”; } }

이전 프로젝트와 다른 점은 post 방식과 get 방식을 각각 다른 어노테이션을 쓰고 있다는 점이다. 어떤 방식으로 데이터를 보내주고 있는지를 잘 확인해야한다.

이 외에는 jsp를 이용한 프로젝트와 다른점이 없어 생략하겠다.

위에 적은 spring mvc구조와 셋팅, get/post 방식 구분만 잘 신경써주면 될 것 같다.

728×90

반응형

[스프링 프레임워크]게시판 만들기 #1 : 프로젝트 생성 및 셋팅

반응형

본 포스팅은 스프링 프레임워크를 이용하여 기본적인 게시판을 만드는 방법을 설명합니다.

‘Spring Framework

안녕하세요. 이번 포스팅은 Spring Framework를 이용하여 게시판 만드는 방법을 설명합니다.

Spring Framework를 간단하게 설명하자면 아래의 4가지의 특징이 있습니다.

IOC(제어 반전 컨테이너) : 스프링을 가장 핵심기능으로 자바의 반영을 이용하여 객체의 생명주기를 관리하고 의존성 주입을 통해 각 계층이나 서비스들 간의 의존성을 맞춰준다.(Maven을 통해 라이브러리를 관리하는 것) AOP(관점 지향 프로그래밍) : 기능들을 모듈로 분리하여 서로 조합하여 사용 MVC 패턴 배치 프레임워크 : 대용량 데이터를 처리하는 데 쓰이는 일괄처리(Batch Process)을 지원하는 배치 프로그래밍 지원

Spring Framework는 프로젝트를 경량화 시키고 쉽게 확장시킬 수 있는 것에 주안점을 두고 있다고 할 수 있습니다.

STS 설치

https://github.com/spring-projects/toolsuite-distribution/wiki/Spring-Tool-Suite-3

STS(Spring Tool Suite)는 현재 STS 4버전 까지 나와있습니다.

프로젝트를 Spring Legacy로 진행할 예정으로 4버전에서는 추가적인 설치가 필요하기 때문에 3 버전으로 설치해주도록 합니다.

프로젝트 생성

프로젝트의 생성은 아래의 순서로 진행합니다.

Pachage Explorer 오른쪽 클릭 -> New -> Spring Legacy Project Project name 입력 후 Templates은 Spring MVC Project 선택 Top Level Package Name 입력

Top Level Pachage Name은 com.[회사명].[프로젝트명] 으로 보통 입력합니다.

프로젝트 생성 예제

인코딩 설정

프로젝트를 생성하였으면 몇가지의 인코딩 설정이 필요합니다.

상단 메뉴의 Window -> General -> Workspace -> Text File Encoding UTF-8 설정 프로젝트 오른쪽 클릭 Properties -> Resource -> Text File Encoding UTF-8 설정 src -> main -> webapp -> WEB-INF -> views -> home.jsp 에 인코딩 코드 추가(안 해도 되긴 합니다.) src -> main -> webapp -> WEB-INF -> web.xml에 사이에 인코딩 설정 코드 추가

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> // home.jsp

encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter /*

web.xml에 인코딩 설정

JAVA 및 스프링 버전 설정

인코딩 설정이 끝났으면 JAVA 버전 및 스프링 버전을 설정해줍니다.

JDK버전은 현재 설치된 JAVA 버전을 설정해주고, 스프링 버전은 3.1.1 또는 4.3.8 버전을 사용합니다.

프로젝트 오른쪽 클릭 Properties -> Project Facets -> Java 1.8 버전으로 수정 pom.xml 에서 java-versoin 1.8로 수정, springframework-version 3.1.1.RELEASE 또는 4.3.8.RELEASE 수정

Project Facets pom.xml

다음은 데이터베이스 셋팅과 스프링과 데이터 베이스의 연동에 대해 포스팅하도록 하겠습니다.

반응형

[STS Spring] 게시판 만들기 — 01. Spring MVC Project 생성

MVC 패턴 model2 방식 – 회원 정보 조회, 수정, 삭제 Web Application model1, model2 1. Model1 (모델1) 방식 -모든 클라이언트의 요청과 비즈니스 로직 처리를 JSP에서 담당하는 구조 -기능 구현이 쉽고 편리, but 유지 보수가 어려워서 큰 프로젝트에서는 한계가 있다. 2. Model2 (모델2) 방식 -각 기능을 분리해서 구현 ->클라이언트의 요청 처리 및 흐름 제어 담당 (Controller) => 서블릿 ->응답 처리 (화면 기능) (View) => JSP ->비즈니스 로직 처리 (Model) => DAO -각각의 기능을 모듈화하여 개발 => 재사용이 용이하다. -유지 보수가 쉽다. -publisher와 개발자 작업 분업화 MVC 디자인 패턴 -Model – View – Controller -Controller 서블릿.. 공감수 0

키워드에 대한 정보 spring mvc 게시판

다음은 Bing에서 spring mvc 게시판 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 Webjjang Spring 00-04 무조건 게시판 만들기 – 프로젝트 흐름 이해 / 게시판리스트 보이기(웹짱과 함께하는 스프링)

  • 웹짱 스프링
  • 웹짱
  • 스프링
  • webjjang spring
  • webjjang
  • spring
  • 미코손

Webjjang #Spring #00-04 #무조건 #게시판 #만들기 #- #프로젝트 #흐름 #이해 #/ #게시판리스트 #보이기(웹짱과 #함께하는 #스프링)


YouTube에서 spring mvc 게시판 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 Webjjang Spring 00-04 무조건 게시판 만들기 – 프로젝트 흐름 이해 / 게시판리스트 보이기(웹짱과 함께하는 스프링) | spring mvc 게시판, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment