Stack/Spring

[Spring] CRUD Project 제작 1 - 초기 설정 및 글삭제

7ingout 2022. 9. 13. 15:56

https://velog.io/@emawlrdl/Spring-project-%EC%A0%9C%EC%9E%91-%EA%B3%BC%EC%A0%95-8yk5n8bogp

 

Spring project 제작 과정 ( CRUD 기능구현 예제)

먼저 개발 환경을 설치하여야 한다. 툴 : Spring Tool Suite 3.9.5 (이클립스) -> 이클립스 상단매뉴 Help -> MarketPlace -> STS 설치.. WAS(Web Application Server) = 아파치 톰캣 was에 대한 설명 참조 : https://gmlwjd9405.gi

velog.io

 

https://chan-0124.tistory.com/entry/%5B%EC%8A%A4%ED%94%84%EB%A7%81%5DMVC2%EB%B0%A9%EC%8B%9D-CRUD-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-2.pom.xml-%EC%84%A4%EC%A0%95?category=639553 

 

[스프링]MVC2방식 CRUD 게시판 만들기 2.pom.xml 설정

(기준일 18-07-07) (개발 환경) 1. 툴 : Spring Tool Suite 3.9.5 (이클립스)  -> 이클립스 상단매뉴 Help -> MarketPlace -> STS 설치.. 2. WAS : 아파치 톰캣 8 ->https://tomcat.apache.org/download-80.cgi 3..

chan-0124.tistory.com

 

참조한 블로그 ~

 


 

Controller : 웹에서 처리해야 할 데이터를 받고, 이 데이터를 담당할 service를 선택하여 호출한다.

그리고 처리한 데이터를 다음 페이지에서 볼 수 있게 세팅하며, 이동할 페이지를 리턴한다.

 

Service : 데이터를 dao를 통해 주고받으면서 비즈니스 로직을 수행

 

DAO(Data Access Object) : Database의 data에 접근을 위한 객체. Database에 접근을 하기 위한 로직과

비즈니스 로직을 분리하기 위해 사용.

DB를 통해 데이터를 조회하거나 수정 삭제하는 역할

 

VO(Value Object) : DB에 있는 테이블 컬럼 값을 java에서 객체로 다루기 위해 사용함.

 

출처

https://xhwogusxh.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EB%95%8C-ControllerService-DAO-VO%EC%9D%98-%EC%97%AD%ED%95%A0

 

스프링 게시판 만들때 Controller,Service, DAO, VO의 역할

Controller : 웹에서 처리해야 할 데이터를 받고, 이 데이터를 담당할 service를 선택하여 호출한다. 그리고 처리한 데이터를 다음 페이지에서 볼 수 있게 세팅하며, 이동할 페이지를 리턴한다. Service

xhwogusxh.tistory.com

 

 

 


 

New - Spring Legacy Project

 

Project name은 ex01로 하고 Spring MVC Project 클릭 후

com.myp.controller로 패키지 이름을 지정하였다 !

* 패키지 이름은 3단으로 입력한다 (com.프로젝트명.폴더)

 

 

* Spring 프로젝트가 빌드 되는 과정

1. 서버 실행될 때 web.xml이 최초 구동된다.

2.  root-context와 servlet-context를 읽는다.

3. servlet-context에 명시된 controller address mapping

4. Controller 내부 메소드 실행

 

1.

1) web.xml

설정을 위한 설정파일.
즉, 최초로 WAS가 최초로 구동될 때, 각종 설정을 정의해줍니다.
여러 xml파일을 인식하도록 각 파일을 가리켜 줍니다.

여기에서 root-context.xml과 servlet-context.xml을 지정해준다.

 

- root-context의 역할

servlet-context.xml 과는 반대로 view와 관련되지 않은 객체를 정의
따라서 Service, Repository(DAO), DB등 비즈니스 로직과 관련된 설정을 함

 

- servlet-context의 역할

servlet에서 보듯이 요청과 관련된 객체를 정의
url과 관련된 controller나, @(어노테이션), ViewResolver, Interceptor, MultipartResolver 등의 설정을 함
초기 파일에

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

위와 같은 주석이 있음

DispatcherServlet(사용자의 요청이 오면 제일 먼저 시작되는 servlet)과 관련된 설정을 해야 함

 

2) context.xml

여기에서 context:component-scan을 설정하게 되는데
base-package에 component-scan을 할 패키지 경로를 명시해주면 해당 경로를 포함한 모든 하위 경로에 적용되고,

어노테이션을 명시한 자바 파일들이 Bean으로 동록 되어 사용 가능해짐
즉 base-package안에 있는 어노테이션을 인식할 수 있게 되는 것,

따라서 그 package안에 있는 controller를 비롯한 다른 어노테이션 인식 !

 

3) controller

base-package에 선언된 package안에 있는 @Controller가 인식
그러면 그 Controller가 모델과 뷰를 관리
Url-mapping(@RequestMapping)을 통해서 입력받은 url에 맞는 모델을 실행하게 되고
이후 View를 호출

여기서의 base-package는 com.myp.controller이므로 그 package안에 있는 controller를 인식하게 됨

 

위 controller에서 value를 /home 으로 입력하게 되면

home이라는 모델이 실행되게 되는데 이 모델은 home이라는 view를 return 하게 된다.

 

위에서 localhost:8080은 Tomcat server을 의미하고,

뒤에있는 controller는 tomcat-server에서 이 프로젝트를 인식하는 Web project의 이름

 

프로젝트 우클릭 -> properties -> Web Project Setting 에서 변경 가능

 

이 후 view가 리턴되면 view 폴더안에 있는 view라는 jsp파일이 호출되게 되는데 이 경로는 servlet-context안에서 설정 가능

 

ViewResolver에서 경로의 prefix와 suffix를 설정해 주고 있는데,

즉, return 값이 view라면 /WEB-INF/views/view.jsp 파일이 호출

 

2. pom.xml 설정

1) dependency 추가

CRUD 프로젝트 생성시 필요한 여러가지 기능들을 구현한 library들을 추가
POM.xml 안에 dependency를 추가하여 library를 사용

 

dependency는 maven사이트 안에서 가져와서 추가할 수 있음

 

2) 최신버전으로 수정

 

3) Java 항목을 1.8로 수정

 

4)  web.xml에 한글필터 추가

 

3. DB연결을 위한 설정

셀프close 하니까 오류 해결 ㅜㅜㅜ <property&nbsp; &nbsp;~~~ />로 사용할 것

1) DataSource 등록

root-context에 db연결정보 설정하기

DB접속을 위해 나의 mysql url정보와 userid , passoword를 설정

 

2) Sqlsessionfactory 등록

Mybatis 사용을 위한 sqlsessionfactory 커넥션 추가

 

3) namespace 설정

충돌방지 설정을 위한 namespace 설정

 

4. DB 기초 공사

1) 프로젝트안에 src/main/resources 안에 mybatis-config.xml 생성

Mybatis 설정파일임을 명시하기 위한 DTD 선언

2) SQL쿼리전송을 위한 Mapper 하우스 짓기

- 프로젝트안에 src/main/resources 안에 mapper 폴더 생성 후 board-Mapper.xml 생성

 

5. VO(DTO) 생성

* VO (Value Object) : DB의 정보를 객체화 시키는 용도

* DTO (Data Transfer Object) : 외부 시스템과 데이터 통신을 하기 위함

 

여기서는 VO를 생성 ..

1) Domain 패키지와 게시판 구성을 위한 BoardVO.java 생성

- main/java/com.myp.domain

package com.myp.domain;

import java.util.Date;

public class BoardVO {

//	데이터베이스 테이블의 컬럼명과 같음
	private Integer bno;
	private String title;
	private String content;
	private String writer;
	private Date regdate;
	private int viewcnt;
	
	public Integer getBno() {
		return bno;
	}
	public void setBno(Integer 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;
	}
	
	@Override
	public String toString() {
		return "BoardVO [bno=" + bno + ", title=" + title + ", content=" + content + ", writer=" + writer + ", regdate="
				+ regdate + ", viewcnt=" + viewcnt + "]";
	}
}

 

6. board-Mapper.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.myp.mapper.BoardMapper">

	<insert id="create"> 
		insert into tbl_board (title, content, writer)  
		values(#{title},#{content}, #{writer}) 
	</insert>
	<select id="read" resultType="com.myp.domain.BoardVO">
		select    
		bno, title, content, writer, regdate, viewcnt
		from 
		tbl_board  where bno = #{bno} 
	</select>
 	<update id="update"> 
		update tbl_board set title =#{title}, content =#{content}  
		where bno = #{bno}
	</update>
	<delete id="delete"> 
		delete from tbl_board where bno = #{bno} 
	</delete> 
	<select id="listAll" resultType="com.myp.domain.BoardVO"> 
	<!-- SQL 내부에 연산자가 있을 경우 사용 -->
	<![CDATA[ 
		select    
		bno, title, content, writer, regdate, viewcnt  
		from
		tbl_board
		where bno > 0  
		order by bno desc, regdate desc 
		]]>   
	</select>
</mapper>

 

7. DAO 생성

* DAO (Data Access Object) : 데이터 접근 객체 

 - 서비스 <-> DAO <-> Mapper

 

* Service : 컨트롤러(서블릿)의 요청사항을 DAO에 전달

 

1) BoardDAO.java

- main/java/com.myp.persistence

package com.myp.persistence;

import java.util.List;
import com.myp.domain.BoardVO;

public interface BoardDAO {
	public void create(BoardVO vo) throws Exception;		
	public BoardVO read(Integer bno) throws Exception;		
	public void update(BoardVO vo) throws Exception;		
	public void delete(Integer bno) throws Exception;		
	public List<BoardVO> listAll() throws Exception;

}

 

2) BoardDAOImpl.java

package com.myp.persistence;

import java.util.List;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.myp.domain.BoardVO;

@Repository
public class BoardDAOImpl implements BoardDAO {
	
	@Inject	
	private SqlSession session;		
	
	private static String namespace = "com.myp.mapper.BoardMapper";

	@Override
	public void create(BoardVO vo) throws Exception {
		// TODO Auto-generated method stub
		session.insert(namespace+".create", vo);
	}

	@Override
	public BoardVO read(Integer bno) throws Exception {
		// TODO Auto-generated method stub
		return session.selectOne(namespace + ".read", bno);
	}

	@Override
	public void update(BoardVO vo) throws Exception {
		// TODO Auto-generated method stub
		session.update(namespace+".update", vo);
	}

	@Override
	public void delete(Integer bno) throws Exception {
		// TODO Auto-generated method stub
		session.delete(namespace+".delete", bno);
	}

	@Override
	public List<BoardVO> listAll() throws Exception {
		// TODO Auto-generated method stub
		return session.selectList(namespace + ".listAll");
	}

}

 

3) servlet-context.xml 베이스 패키지 수정

주소값을 "com.myp"로 변경

<context:component-scan base-package="com.myp" />

 

8. Service 작성

* Service : 유지보수와 로직프로세스를 유연하게 처리하기 위한 중간 단계.

- 프레임워크 디자인패턴에 들어가며, 프로젝트 규모가 커질수록 관리하기 용이함

controller -> service(interface) -> ServiceImpl -> dao 

 

1) main/java/com.myp에 service 폴더 생성 후

BoardService.java 생성

package com.myp.service;

import java.util.List;
import com.myp.domain.BoardVO;

public interface BoardService {
	public void regist(BoardVO board) throws Exception;
	public BoardVO read(Integer bno) throws Exception;
	public void modify(BoardVO board) throws Exception;
	public void remove(Integer bno) throws Exception;
	public List<BoardVO> listAll() throws Exception;
}

 

2) BoardServiceImpl.java

package com.myp.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.myp.domain.BoardVO;
import com.myp.persistence.BoardDAO;

@Service
public class BoardServiceImpl implements BoardService {	 
	@Inject
	private BoardDAO dao;			
	
	@Override	
	public void regist(BoardVO board) throws Exception {		
		dao.create(board);	
	}	
	
	@Override	
	public BoardVO read(Integer bno) throws Exception {
		return dao.read(bno);	
	}	
	
	@Override	
	public void modify(BoardVO board) throws Exception {		
		dao.update(board);	
	}	
	
	@Override	
	public void remove(Integer bno) throws Exception {		
		dao.delete(bno);	
	}	
	
	@Override	
	public List<BoardVO> listAll() throws Exception {		
		return dao.listAll();	
	}
}

 

9. 게시판 목록페이지 구현

1) 선행작업

WAS 구동시 home.jsp 페이지에서 게시판 목록(listAll.jsp)으로 가는 기능 구현

views에 listAll.jsp 생성

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page session="false"%>
<!DOCTYPE html>
<html>
<head>
<title>게시판 목록</title>
</head>
<form action="regist" method="get">
	<body>
		<table border="1" width="880">
			<tr>	
				<td width="77">
					<p align="center">글번호</p>
				</td>
				<td width="327">
					<p align="center">제목</p>   
				</td>   
				<td width="197">     
					<p align="center">작성자</p>   
				</td>   
				<td width="155">     
					<p align="center">작성일</p>   
				</td>   
				<td width="90">     
					<p align="center">조회수</p>   
				</td>   
			</tr>
			      
			<c:forEach items="${list}" var="boardVO">
				<tr>
					   
					<td>${boardVO.bno}</td>   
					<td><a href='/read?bno=${boardVO.bno}'>${boardVO.title}</a></td> 
					 
					<td>${boardVO.writer}</td>   
					<td><fmt:formatDate pattern="yyyy-MM-dd HH:mm"
							value="${boardVO.regdate}" /></td>   
					<td><span class="badge bg-red">${boardVO.viewcnt}</span></td>
				</tr>
			</c:forEach>
			 
		</table>
		  
		<button type="submit">글쓰기</button>
		 
	</body>
	 
</form>
</html>

 

2) BoardController.java

package com.myp.controller;

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.bind.annotation.RequestMethod;

import com.myp.service.BoardService;

@Controller // 컨트롤러임을 명시
@RequestMapping(value = "/") // 주소 패턴
public class BoardController {			
	
	@Inject // 주입(심부름꾼) 명시
	private BoardService service; // Service 호출을 위한 객체생성		
	
	@RequestMapping(value= "/listAll", method = RequestMethod.GET) // 주소 호출 명시 . 호출하려는 주소 와 REST 방식설정 (GET)
	public void listAll(Model model)throws Exception { // 메소드 인자값은 model 인터페이스(jsp전달 심부름꾼)				
		model.addAttribute("list",service.listAll()); // jsp에 심부름할 내역(서비스 호출)			
	}
}

 

3) WAS의 기본 주소값 변경

- https://localhost:8080/controller -> http://localhost:8080/

server - Modules - path의 값을 /로 변경

 

* 최종화면

 

CRUD 게시판 가기 클릭 시