https://velog.io/@emawlrdl/Spring-project-%EC%A0%9C%EC%9E%91-%EA%B3%BC%EC%A0%95-8yk5n8bogp
참조한 블로그 ~
Controller : 웹에서 처리해야 할 데이터를 받고, 이 데이터를 담당할 service를 선택하여 호출한다.
그리고 처리한 데이터를 다음 페이지에서 볼 수 있게 세팅하며, 이동할 페이지를 리턴한다.
Service : 데이터를 dao를 통해 주고받으면서 비즈니스 로직을 수행
DAO(Data Access Object) : Database의 data에 접근을 위한 객체. Database에 접근을 하기 위한 로직과
비즈니스 로직을 분리하기 위해 사용.
DB를 통해 데이터를 조회하거나 수정 삭제하는 역할
VO(Value Object) : DB에 있는 테이블 컬럼 값을 java에서 객체로 다루기 위해 사용함.
출처
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연결을 위한 설정
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 생성
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 게시판 가기 클릭 시
'Stack > Spring' 카테고리의 다른 글
[Spring] CRUD Project 제작 3 - 조회수 / 페이지 번호 게시판 (완성) (0) | 2022.09.14 |
---|---|
[Spring] DAO / DTO / VO (0) | 2022.09.14 |
[Spring] MVC 처리 순서 (0) | 2022.09.14 |
[Spring] CRUD Project 제작 2 - 글쓰기 / 읽기 / 수정 (0) | 2022.09.13 |
[Spring] STS 프로젝트 생성 후 Hello World 보기 😃 (1) | 2022.09.05 |