pom.xml
<!-- 사용자 추가 라이브러리(의존성) 시작 -->
<!-- 뷰페이지를 JSP로 지정 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.58</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 파일 업로드/다운로드 관련 라이브러리 -->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- 자바 웹메일 라이브러리 -->
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- json simple 라이브러리 -->
<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 사용자 추가 라이브러리(의존성) 끝 -->
</dependencies>
application.properties (한글 인코딩 설정 - 우클릭 Properties)
#주석
#/src/main/resources/application.properties 환경설정 파일
#Spring Boot는 WAS(Tomcat) 내장되어 있음(기본port번호 8080)
#톰캣서버의 http port번호 변경
server.port=9095
#주의사항 JSP, Thymeleaf, Mustache는 공통으로 사용할 수 없음
#JSP를 뷰페이지로 사용할 경우 pom.xml에 라이브러리 추가해야 함
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
#JSP페이지가 수정이 되면 자동으로 서버 재시작
server.servlet.jsp.init-parameters.development = true
#파일 업로드 용량 제한 설정
spring.servlet.multipart.max-file-size = 500MB
spring.servlet.multipart.max-request-size = 500MB
#오라클 DB 환경 설정
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=system
spring.datasource.password=1234
시작 클래스 실행해서 서버 상태 확인
폴더 생성
myweb처럼 DBOpen을 만들어서 사용하지 않고 제공되는 클래스를 이용할 것이다.
sql
mediagroup.txt
-- mediagroup_sql.txt
-- 미디어 그룹 테이블 생성
CREATE TABLE mediagroup (
mediagroupno NUMBER NOT NULL PRIMARY KEY, -- 그룹번호
title VARCHAR2(255) NOT NULL -- 그룹제목
);
-- 시퀀스 생성
create sequence mediagroup_seq;
commit;
클래스 생성
MediagroupDTO.java
package kr.co.itwill.mediagroup;
public class MediagroupDTO {
private int mediagroupno;
private String title;
//기본생성자, getter, setter, toString
public MediagroupDTO() {}
public int getMediagroupno() {
return mediagroupno;
}
public void setMediagroupno(int mediagroupno) {
this.mediagroupno = mediagroupno;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "MediagroupDTO [mediagroupno=" + mediagroupno + ", title=" + title + "]";
}
}//class end
MediagroupCont.java
package kr.co.itwill.mediagroup;
import org.springframework.stereotype.Controller;
@Controller
public class MediagroupCont {
public MediagroupCont() {
System.out.println("-----MediagroupCont() 객체 생성됨");
}//end
}//class end
클래스 추가 생성
HomeController.java
package kr.co.itwill;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HomeController {
public HomeController() {
System.out.println("-----HomeController() 객체 생성 됨");
}//end
//mymelon 프로젝트의 첫 페이지 호출 명령어 등록
//결과 확인 http://localhost:9095/home.do
@RequestMapping("/home.do")
public ModelAndView home() {
ModelAndView mav = new ModelAndView();
//redirect : 등록한 명령어를 호출할 수 있다
mav.setViewName("redirect:/mediagroup/list.do");
return mav;
}//home() end
}//class end
MediagroupCont.java
package kr.co.itwill.mediagroup;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MediagroupCont {
public MediagroupCont() {
System.out.println("-----MediagroupCont() 객체 생성됨");
}//end
//미디어그룹 쓰기 페이지 호출
//http://localhost:9095/mediagroup/create.do
@RequestMapping(value = "/mediagroup/create.do", method = RequestMethod.GET)
public String createForm() {
return "mediagroup/createForm";
}//createForm() end
}//class end
createForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>createForm.jsp</title>
<style>
*{font-family: gulim; font-size: 24px;}
</style>
<link href="../css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="title">미디어 그룹 등록</div>
<form name="frm" method="post" action="create.do">
<table class="table">
<tr>
<th>미디어 그룹 제목</th>
<td><input type="text" name="title" size="50" value="2022년 댄스 음악"></td>
</tr>
</table>
<div class="bottom">
<input type="submit" value="등록">
<input type="button" value="목록" onclick="location.href='list.do'">
</div>
</form>
</body>
</html>
MediagroupCont.java
package kr.co.itwill.mediagroup;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MediagroupCont {
public MediagroupCont() {
System.out.println("-----MediagroupCont() 객체 생성됨");
}//end
//미디어그룹 쓰기 페이지 호출
//http://localhost:9095/mediagroup/create.do
@RequestMapping(value = "/mediagroup/create.do", method = RequestMethod.GET)
public String createForm() {
return "mediagroup/createForm";
}//createForm() end
@RequestMapping(value = "/mediagroup/create.do", method = RequestMethod.POST)
public ModelAndView createProc(@ModelAttribute MediagroupDTO dto) {
ModelAndView mav = new ModelAndView();
int cnt = dao.create(dto);
if(cnt==0) {
mav.setViewName("mediagroup/msgView");
String msg1 = "<p>미디어 그룹 등록 실패</p>";
String img = "<img src='../images/crying.png'>";
String link1 = "<input type='button' value='다시시도' onclick='javascript:history.back()'>";
String link2 = "<input type='button' value='그룹목록' onclick='location.href=\"list.do\"'>";
mav.addObject("msg1", msg1);
mav.addObject("img", img);
mav.addObject("link1", link1);
mav.addObject("link2", link2);
} else {
mav.setViewName("redirect:/mediagroup/list.do");
}//if end
return mav;
}//createProc() end
}//class end
위 두 명령어(create.do)는 같아 보이지만 method 방식이 다르기 때문에 다른 명령어이다.
msgView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>msgView.jsp</title>
<style>
*{font-family: gulim; font-size: 24px;}
</style>
<link href="../css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="title">알림</div>
<div class="content">
<dl>
<dd>${msg1 != null ? img : ""} ${msg1}</dd>
<dd>${msg2 != null ? img : ""} ${msg2}</dd>
<dd>${msg3 != null ? img : ""} ${msg3}</dd>
</dl>
<p>
${link1} ${link2} ${link3}
</p>
</div>
</body>
</html>
MediagroupDAO.java
package kr.co.itwill.mediagroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
//@Service
@Repository
public class MediagroupDAO {
@Autowired
private JdbcTemplate jt; //DBOpen dbopen = new DBOpen()
public MediagroupDAO() {
System.out.println("-----MediagroupDAO() 객체 생성됨");
}//end
//비즈니스 로직 구현
}//class end
@controller와 같이 객체가 생성되었다.
@Service는 DB에 접근하는 코드를 모아둔다. @Repository는 DB에 직접적으로 접근하는 것은 Repository에 맡겨서 비즈니스 로직에 집중할 수 있다. 둘 다 자동으로 객체를 생성해준다.
@Repository
DAO를 스프링에 인식시키기 위해서 주로 사용
모델클래스로 지정하면 스프링컨테이너에서 관리를 해줌
여기 경로 안에 @Repository를 달고 있으면 인식을 해주고 그것을 객체로 만들어 준다.
DAO관련 빈을 자동 등록 대상으로 만들때 사용한다.
@Component를 부여해도 되지만, 스프링에서는 @Repository를 권장한다.
@Component와 차이점은 Exception이 발생했을 때, DB Exception을 DataAccessException을 변환한다.
같은 클래스가 다른 패키지에 존재하면 이름을 할당하여 구분해야 한다.
객체가 이미 생성되어 있어서 따로 객체를 생성할 필요가 없다. @Autowired를 통해 객체가 존재한다고 알려주기만 하면 된다.
@Autowired : Spring이 필요시 자동으로 객체를 생성하여 필드(Instance variable, 객체 변수)에 할당함.
@Component 선언에 따라 자동으로 만들어진 객체를 연결하는 어노테이션
MediagroupCont.java
package kr.co.itwill.mediagroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MediagroupCont {
//@Autowired 자동으로 만들어진 객체를 연결
@Autowired
private MediagroupDAO dao;
public MediagroupCont() {
System.out.println("-----MediagroupCont() 객체 생성됨");
}//end
//미디어그룹 쓰기 페이지 호출
//http://localhost:9095/mediagroup/create.do
@RequestMapping(value = "/mediagroup/create.do", method = RequestMethod.GET)
public String createForm() {
return "mediagroup/createForm";
}//createForm() end
@RequestMapping(value = "/mediagroup/create.do", method = RequestMethod.POST)
public ModelAndView createProc(@ModelAttribute MediagroupDTO dto) {
ModelAndView mav = new ModelAndView();
int cnt = dao.create(dto);
if(cnt==0) {
mav.setViewName("mediagroup/msgView");
String msg1 = "<p>미디어 그룹 등록 실패</p>";
String img = "<img src='../images/crying.png'>";
String link1 = "<input type='button' value='다시시도' onclick='javascript:history.back()'>";
String link2 = "<input type='button' value='그룹목록' onclick='location.href=\"list.do\"'>";
mav.addObject("msg1", msg1);
mav.addObject("img", img);
mav.addObject("link1", link1);
mav.addObject("link2", link2);
} else {
mav.setViewName("redirect:/mediagroup/list.do");
}//if end
return mav;
}//createProc() end
}//class end
MediagroupDAO.java
package kr.co.itwill.mediagroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
//@Service
//@Repository 모델클래스로 지정. 스프링 컨테이너가 자동으로 객체 생성해 준다
@Repository
public class MediagroupDAO {
//@Autowired 자동으로 만들어진 객체를 연결
@Autowired
private JdbcTemplate jt; //DBOpen dbopen = new DBOpen()
StringBuilder sql = null;
public MediagroupDAO() {
System.out.println("-----MediagroupDAO() 객체 생성됨");
}//end
//비즈니스 로직 구현
public int create(MediagroupDTO dto) {
int cnt = 0;
try {
sql = new StringBuilder();
sql.append(" INSERT INTO mediagroup(mediagroupno, title) ");
sql.append(" VALUES(mediagroup_seq.nextval, ?) ");
cnt = jt.update(sql.toString(), dto.getTitle());
} catch (Exception e) {
System.out.println("미디어 그룹 등록 실패 : " + e);
}//end
return cnt;
}//create() end
}//class end
참고로 등록을 클릭하면 아래 화면이 나오는데 이것은 아직 list 페이지를 만들지 않았기 때문이다. 무시하고 테이블을 조회하면 위 화면처럼 조회가 될 것이다.
DAO 이어서
public List<MediagroupDTO> list() {
List<MediagroupDTO> list = null;
try {
sql = new StringBuilder();
sql.append(" SELECT mediagroupno, title ");
sql.append(" FROM mediagroup ");
sql.append(" ORDER BY mediagroupno DESC ");
//oop0915 참고. 임시로 객체 생성
RowMapper<MediagroupDTO> rowMapper = new RowMapper<MediagroupDTO>() {
@Override
public MediagroupDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
MediagroupDTO dto = new MediagroupDTO();
dto.setMediagroupno(rs.getInt("mediagroupno"));
dto.setTitle(rs.getString("title"));
return dto;
}//mapRow() end
};//rowMapper end
list = jt.query(sql.toString(), rowMapper);
} catch (Exception e) {
System.out.println("미디어 그룹 목록 조회 실패 : " + e);
}//end
return list;
}//list() end
MediagroupCont.java
@RequestMapping("mediagroup/list.do")
public ModelAndView list() {
ModelAndView mav = new ModelAndView();
mav.setViewName("mediagroup/list");
int totalRowCount = dao.totalRowCount();
List<MediagroupDTO> list = dao.list();
mav.addObject("list", list);
mav.addObject("count", totalRowCount);
return mav;
}//list() end
MediagroupDAO.java
public int totalRowCount() {
int cnt = 0;
try {
sql = new StringBuilder();
sql.append(" SELECT COUNT(*) FROM mediagroup ");
cnt = jt.queryForObject(sql.toString(), Integer.class);
} catch (Exception e) {
System.out.println("전체 행 갯수 : " + e);
}//end
return cnt;
}//totalRowCount() end
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="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>list.jsp</title>
<style>
*{font-family: gulim; font-size: 24px;}
</style>
<link href="../css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="title">미디어 그룹 목록</div>
<div class="content">
<input type="button" value="그룹등록" onclick="location.href='create.do'">
</div>
<c:if test="${requestScope.count==0}">
<table><tr><td>게시판에 글 없음!!</td></tr></table>
</c:if>
<c:if test="${requestScope.count>0}">
<table>
<tr>
<th>그룹번호</th>
<th>그룹제목</th>
<th>수정/삭제</th>
</tr>
<!-- MediagroupCont의 list()함수에서 mav.addObject("list")를 가리킴 -->
<c:forEach var="dto" items="${list}">
<tr>
<td>${dto.mediagroupno}</td>
<td>${dto.title}</td>
<td>
<input type="button" value="수정">
<input type="button" value="삭제">
</td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
'웹개발 교육 > Spring' 카테고리의 다른 글
[69일] spring (8) - mymelon media 목록 (0) | 2022.11.03 |
---|---|
[69일] spring (7) - mymelon mediagroup 수정, 삭제 (0) | 2022.11.03 |
[67일] spring (5) - bbs, login (0) | 2022.11.01 |
[67일] spring (4) - 계산 (0) | 2022.11.01 |
[66일] spring (3) - MVC (0) | 2022.10.31 |