Spring PhotoGallery DataBase DS

메타플랫폼대표
|2024. 7. 22. 12:19
반응형

 

 

기본적인 Option 만들고, 세팅하기

 

 

 

servlet-context.xml 내부를 수정해준다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<settings>
		<setting name="cacheEnabled" value="false" />
		<setting name="useGeneratedKeys" value="true" />
		<setting name="defaultExecutorType" value="REUSE" />
	</settings>
	
	<typeAliases>
		<!-- <typeAlias type="vo.BoardVo" alias="board"/> -->
		<typeAlias type="vo.MemberVo" alias="member"/>
		<typeAlias type="vo.PhotoVo" alias="photo"/>
	</typeAliases>
	
	<mappers>
		<mapper resource="config/mybatis/mapper/member.xml" />
		<mapper resource="config/mybatis/mapper/photo.xml" />
	</mappers>
	
</configuration>

 

 

 

 

MemberController는 RequestMapping이 항상 경로가 /member/이기 때문에, login_form.do 앞에 /member/라는 RequestMapping이 항상 붙어서 해석이 된다.

 

 

 

MemberDao 연결하기(왼쪽 Constructor 생성자로 sqlSession 생성, 오른쪽 Setter로 sqlSession 생성)

 

 

 

MemberDao Spring으로 받게끔 지정해주기

public class MemberDao {
	
	SqlSession sqlSession; // SqlSessionTemplate의 interface
	// Injection 완료 Constructor로 받기
	public void setSqlSession(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
	}
	
	
	// mem_id에 해당되는 1건의 정보 얻어온다
	public MemberVo selectOne(String mem_id) {

		return sqlSession.selectOne("member.member_one",mem_id);
	}

}

 

 

 

loginAction에 대한 Controller 작성하기(session 추가, 틀린 경우에 넘겨주는 값)

	// /member/login.do?mem_id=one&mem_pwd=1234
	@RequestMapping("login.do")
	public String login(String mem_id, String mem_pwd, RedirectAttributes ra) {
		
		MemberVo user = member_dao.selectOne(mem_id);
		
		// 로그인한 유저 정보가 없으면,
		if(user==null) {
			
			// RedirectAttributes에 redirect할 때 넘어가야할 정보를 알려주면
			// parameter로 이용된다.
			ra.addFlashAttribute("reason","fail_id");
			
			// return "redirect:login_from.do?reason=fail_id";
			return "redirect:login_from.do";
		}
		
		// 비밀번호가 틀린 경우
		if(user.getMem_pwd().equals(mem_pwd)==false) {
			//response.sendRedirect("login_form.do?reason=fail_pwd&mem_id=" + mem_id);
			ra.addAttribute("reason","fail_pwd");
			ra.addAttribute("mem_id",mem_id);
			
			return "redirect:login_form.do";
		}
		
		// 로그인 처리: 현재 로그인 객체(user)정보를 session 저장
		session.setAttribute("user", user);
		
		return "redirect:../photo/list.do";
	}

 

 

 

 

 

로그아웃 Controller

	// 로그아웃
	@RequestMapping("logout.do")
	public String logout() {
		
		session.removeAttribute("user");
		
		return "redirect:../photo/list.do";
	}

 

 

 

 

Photo Paging 처리

 

 

context-3-dao.xml 생성하기

	<!-- MemberDao 생성 -->
	<bean id="member_dao" class="dao.MemberDao">
		<property name="sqlSession" ref="sqlSession"/>
	</bean>
	
	<!-- PhotoDao 생성 -->
	<bean id="photo_dao" class="dao.PhotoDao">
		<property name="sqlSession" ref="sqlSession"/>
	</bean>
	
</beans>

 

 

 

 

PhotoDao 작성하기

package dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import vo.PhotoVo;

public class PhotoDao {

	SqlSession sqlSession;
	
	// Setter Injection
	public void setSqlSession(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
	}
	
	public List<PhotoVo> selectList(Map<String, Object> map) {

		List<PhotoVo> list = new ArrayList<PhotoVo>();

		return sqlSession.selectList("photo.photo_list_page", map);
	}
	
	public PhotoVo selectOne(int p_idx) {

		return sqlSession.selectOne("photo.photo_one", p_idx);
	}
	
	public int insert(PhotoVo vo) {
		// TODO Auto-generated method stub

		return sqlSession.insert("photo.photo_insert", vo);

	}//end:insert()
	
	public int update_filename(PhotoVo vo) {
		// TODO Auto-generated method stub

		return sqlSession.update("photo.photo_update_filename", vo);
	}//end:update()
	
	public int update(PhotoVo vo) {

		return sqlSession.update("photo.photo_update", vo);

	}//end:update()
	
	public int selectRowTotal() {

		return sqlSession.selectOne("photo.photo_row_total");
	}
	
}

 

 

 

 

PhotoContoller PhotoListAction 대신하는 Controller 작성하기

package controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import dao.PhotoDao;
import util.MyCommon;
import util.Paging;
import vo.PhotoVo;

@Controller
@RequestMapping("/photo/")
public class PhotoController {
	
	@Autowired
	PhotoDao photo_dao;

	public PhotoController() {
		// TODO Auto-generated constructor stub
		System.out.println("--PhotoController()--");
	}
	
	// /photo/list.do?page=2
	@RequestMapping("list.do")
	public String list(@RequestParam(name="page",defaultValue = "1") int nowPage,
			Model model) {
		
		
		// 게시물의 범위 계산(start/end)
		int start = (nowPage-1) * MyCommon.Photo.BLOCK_LIST + 1;
		int end = start + MyCommon.Photo.BLOCK_LIST - 1;
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("start",start);
		map.put("end",end);
		
		
		List<PhotoVo> list = photo_dao.selectList(map);
		
		// 전체 게시물수
		int rowTotal = photo_dao.selectRowTotal();
		
		// pageMenu 만들기
		String pageMenu = Paging.getPaging("list.do",   // pageURL
											nowPage,    // 현재페이지
											rowTotal,   // 전체페이지
											MyCommon.Photo.BLOCK_LIST,  // 한화면에 보여질 게시물 수
											MyCommon.Photo.BLOCK_PAGE); // 한화면에 보여질 페이지 수
		
		// 결과적으로 request binding
		model.addAttribute("list",list);
		model.addAttribute("pageMenu",pageMenu);
		
		return "photo/photo_list";
	}
	
}

 

 

 

 

index.jsp 작성하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	location.href="photo/list.do";
</script>
</head>
<body>

</body>
</html>

 

 

 

 

resources images 경로 변경하기

 

 

 

 

PhotoController 나머지 작성하기

	@RequestMapping("insert_form.do")
	public String insert_form() {
		
		return "photo/photo_insert_form";
	}
	
	
	//사진등록
	//							요청 Parameter 이름과 받는 변수명이 동일하면 @RequestParam(name="")의
	//							name 속성은 생략가능
	@RequestMapping("insert.do")
	public String insert(PhotoVo vo,
			@RequestParam(name="photo") MultipartFile photo,
			RedirectAttributes ra) throws Exception {
		
		// 유저 정보 얻어오기
		MemberVo user = (MemberVo) session.getAttribute("user");
		
		// session timeout
		if(user==null) {
			
			// response.sendRedirect("../member/login_form.do?reason=session_timeout");
			ra.addAttribute("reason","session_timeout");
			return "redirect:../member/login_form.do";
		}
		
		// 파일 업로드 처리
		String absPath = application.getRealPath("/resources/images/");
		String p_filename = "no_file";
		
		if(!photo.isEmpty()) {
			
			// 업로드 파일이름 얻어오기
			p_filename = photo.getOriginalFilename();
			// 저장할 위치 + file 이름
			File f = new File(absPath,p_filename);
			
			if(f.exists()) { // 저장경로에 동일한 파일이 존재하면=>다른이름변경
				// 변경파일명 = 시간_원본파일명
				
				long tm = System.currentTimeMillis();
				p_filename = String.format("%d_%s", tm, p_filename);
				
				f = new File(absPath,p_filename);
			}
			
			// 임시 파일=>내가 지정한 위치로 복사
			photo.transferTo(f);
		}
		
		// 업로드 된 파일이름
		vo.setP_filename(p_filename);
		// IP
		String p_ip = request.getRemoteAddr();
		vo.setP_ip(p_ip);
		String p_content = vo.getP_content().replaceAll("\n", "<br>");
		vo.setP_content(p_content);
		
		// 입력한 로그인 유저 넣는다
		vo.setMem_idx(user.getMem_idx());
		
		vo.setMem_name(user.getMem_name());

		// DB Insert
		int res = photo_dao.insert(vo);
		return "redirect:list.do";
	}

 

 

 

 

json library 다운로드

https://mvnrepository.com/artifact/org.json/json/20240205

 

 

 

 

 

 

photo_one 추가 json ResponseBody로 넘기기

	@RequestMapping(value="photo_one.do",
			produces = "application/json;charset=utf-8;")
	@ResponseBody // 현재 반환값을 응답데이터를 이용해라
	public String photo_one(int p_idx) {
		
		PhotoVo vo = photo_dao.selectOne(p_idx);
		
		// VO -> JSON 객체 생성(필요없는건 안넘겨도 됨)
		JSONObject json = new JSONObject();
		json.put("p_idx", 		vo.getP_idx());
		json.put("p_title",		vo.getP_title());
		json.put("p_content", 	vo.getP_content());
		json.put("p_filename", 	vo.getP_filename());
		json.put("p_regdate",	vo.getP_regdate());
		json.put("p_ip", 		vo.getP_ip());
		json.put("mem_idx", 	vo.getMem_idx());
		json.put("mem_name", 	vo.getMem_name());
		
		return json.toString();
	}

 

 

 

 

 

delete / modify / modify_form

	@RequestMapping("delete.do")
	public String delete(PhotoVo vo,int p_idx) {
		
		vo = photo_dao.selectOne(p_idx);
		
		String absPath = request.getServletContext().getRealPath("/resources/images/");
		
		File delFile = new File(absPath, vo.getP_filename());
		delFile.delete();
		
		// DB delete
		int res = photo_dao.delete(p_idx);
		
		return "redirect:list.do";
	}
	
	@RequestMapping("modify_form.do")
	public String modify_from(int p_idx, PhotoVo vo, Model model) {
		
		vo = photo_dao.selectOne(p_idx);
		
		String p_content = vo.getP_content().replaceAll("<br>", "\n");
		vo.setP_content(p_content);
		
		model.addAttribute("vo", vo);
		
		return "photo/photo_modify_form";
	}
	
	@RequestMapping("modify.do")
	public String modify(int p_idx, String p_title, String p_content, PhotoVo vo) {
		
		vo.setP_idx(p_idx);
		vo.setP_title(p_title);
		vo.setP_content(p_content);
		
		photo_dao.update(vo);
		
		return "redirect:list.do";
	}

 

 

 

 

 

 

update로 기존 사진 삭제하고 다시 올리는 Controller

	@RequestMapping(value="photo_upload.do",produces = "application/json;charset=utf-8")
	@ResponseBody
	public String upload(PhotoVo vo, MultipartFile photo, RedirectAttributes ra, int p_idx) throws Exception {
		
		String absPath = application.getRealPath("/resources/images/");
		
		String p_filename = "no_file";
		
		if(!photo.isEmpty() ) {
			
			p_filename = photo.getOriginalFilename();
			
			File f = new File(absPath,p_filename);
			
			if(f.exists()) {
				
				long tm = System.currentTimeMillis();
				p_filename = String.format("%d_%s", tm, p_filename);
				
				f = new File(absPath, p_filename);
			}
			
			photo.transferTo(f);
		}
		
		vo = photo_dao.selectOne(p_idx);
		File delFile = new File(absPath, vo.getP_filename());
		delFile.delete();
		
		vo.setP_filename(p_filename);
		photo_dao.update_filename(vo);
		
		String json = String.format("{\"p_filename\":\"%s\"}", p_filename);
		
		return json;
	}

 

 

 

 

 

 

MemberDao

package dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import vo.MemberVo;

public class MemberDao {
	
	SqlSession sqlSession; // SqlSessionTemplate의 interface
	// Injection 완료 Constructor로 받기
	public void setSqlSession(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
	}
	
	// mem_id 에 해당되는 1건의 정보 얻어온다
	public MemberVo selectOne(String mem_id) {

		return sqlSession.selectOne("member.member_id_one", mem_id);
	}
	
	//전체조희
	public List<MemberVo> selectList() {

		return sqlSession.selectList("member.member_list");
	}
	
	// mem_idx에 해당되는 1건의 정보 얻어온다
	// 일부만 조회
	public MemberVo selectOne(int mem_idx) {

		return sqlSession.selectOne("member.member_one",mem_idx);
	}
	
	public int insert(MemberVo vo) {

		return sqlSession.insert("member.member_insert", vo);

	}//end:insert()

	public int delete(int mem_idx) {
		
		return sqlSession.delete("member.member_delete", mem_idx);

	}//end:delete()

	public int update(MemberVo vo) {

		return sqlSession.update("member.member_delete", vo);

	}//end:update()

}

 

 

 

 

 

 

MemberAction 전체를 Controller로 변경해주자

package controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import dao.MemberDao;
import vo.MemberVo;

@Controller
@RequestMapping("/member/")
public class MemberController {
	
	// 자동연결
	@Autowired
	HttpServletRequest request;
	
	@Autowired
	HttpSession session;
	
	// 처음에 1회 연결
	@Autowired
	MemberDao member_dao;

	public MemberController() {
		// TODO Auto-generated constructor stub
		System.out.println("--MemberController()--");
		
	}
	
	// class RequestMapping + method RequestMapping => /member/login_form.do
	@RequestMapping("login_form.do")
	public String login_form() {
		
		return "member/member_login_form";
	}
	
	// /member/login.do?mem_id=one&mem_pwd=1234
	@RequestMapping("login.do")
	public String login(String mem_id, String mem_pwd, RedirectAttributes ra) {
		
		MemberVo user = member_dao.selectOne(mem_id);
		
		// 로그인한 유저 정보가 없으면,
		if(user==null) {
			
			// RedirectAttributes에 redirect할 때 넘어가야할 정보를 알려주면
			// parameter로 이용된다.
			ra.addFlashAttribute("reason","fail_id");
			
			// return "redirect:login_from.do?reason=fail_id";
			return "redirect:login_from.do";
		}
		
		// 비밀번호가 틀린 경우
		if(user.getMem_pwd().equals(mem_pwd)==false) {
			//response.sendRedirect("login_form.do?reason=fail_pwd&mem_id=" + mem_id);
			ra.addAttribute("reason","fail_pwd");
			ra.addAttribute("mem_id",mem_id);
			
			return "redirect:login_form.do";
		}
		
		// 로그인 처리: 현재 로그인 객체(user)정보를 session 저장
		session.setAttribute("user", user);
		
		return "redirect:../photo/list.do";
	}
	
	
	// 로그아웃
	@RequestMapping("logout.do")
	public String logout() {
		
		session.removeAttribute("user");
		
		return "redirect:../photo/list.do";
	}
	
	@RequestMapping("modify_form.do")
	public String modify_form(int mem_idx, Model model) {
		
		MemberVo vo = member_dao.selectOne(mem_idx);
		
		model.addAttribute("vo", vo);
		
		return "member/member_modify_form";
	}
	
	@RequestMapping("modify.do")
	public String modify(int mem_idx, String mem_name, String mem_id, String mem_pwd, String mem_zipcode,
			String mem_addr, String mem_grade) {
		
		MemberVo vo = new  MemberVo(mem_idx, mem_name, mem_id, mem_pwd, mem_zipcode, mem_addr, mem_grade);
		
		member_dao.update(vo);
		
		session = request.getSession();
		MemberVo loginUser = (MemberVo) session.getAttribute("user");
		
		if(loginUser.getMem_idx()==mem_idx) {
			
			// 로그인상태정보
			MemberVo user = member_dao.selectOne(mem_idx);
			
			// session.removeAttribute("user"); 불필요한 작업
			// scope내에 저장방식 Map형식: key / value
			//						  동일한 key로 저장하면 수정처리된다
			session.setAttribute("user", user);
		}
		
		return "redirect:list.do";
	}
	
	@RequestMapping("insert_form.do")
	public String insert_form() {
		
		return "member/member_insert_form";
	}
	
	@RequestMapping("insert.do")
	public String insert(String mem_name, String mem_id, String mem_pwd, String mem_zipcode,
			String mem_addr) {
		
		String mem_ip = request.getRemoteAddr();
		
		MemberVo vo = new MemberVo(mem_name, mem_id, mem_pwd, mem_zipcode, mem_addr, mem_ip);
		
		member_dao.insert(vo);
		
		return "redirect:../photo/list.do";
	}
	
	@RequestMapping(value="check_id.do",produces = "application/json;charset=utf-8;")
	@ResponseBody
	public String check_id(String mem_id, MemberVo vo) {
		
		vo = member_dao.selectOne(mem_id);
		
		boolean bResult = (vo==null);
		
		String json = String.format("{\"result\":%b}", bResult);
		
		return json.toString();
	}
	
	@RequestMapping("list.do")
	public String list(Model model) {
		
		List<MemberVo> list = member_dao.selectList();
		
		model.addAttribute("list",list);
		
		return "member/member_list";
	}
	
	
}

 

반응형