웹개발 교육/Spring

[68일] spring (6) - mymelon mediagroup 추가, 리스트

ewok 2022. 11. 2. 18:20

새 프로젝트 생성

 

 

 

 

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

 

시작 클래스 실행해서 서버 상태 확인

run

 

 

폴더 생성

style.css
0.01MB

 

 

빨간색 : 부모 / 연두색 : 자식

 

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>

 

 

 

 

 

 

댓글수0