혜야의 코딩스토리

[Spring] 스프링 회원 관리 프로그램 본문

꿈 : 멋진 개발자 🧸/Java

[Spring] 스프링 회원 관리 프로그램

hyeya_ 2022. 9. 23. 16:30

📌효율적인 유지보수를 위해 인터페이스, 구현 클래스로 나누는 것이 좋음

A => B (클래스) 강한 결합 관계 Bad

A => B(인터페이스) => C(클래스) 느슨한 결합 Good

 

💡 forward : 주소 그대로, 화면 이동, 대량의 데이터 전달(주 목적) - 목록 조회 등
💡 redirect : 주소 변경, 화면 이동(주 목적), get방식의 소량의 데이터 - 회원 가입 등
💡 스프링은 jsp와 달리 기본 값이 forward방식(리다이렉트는 별도로 지정해야 함)

 

📌프로그램 호출 순서

MainController => MemberController => MemberService(인터페이스), MemberServiceImpl =>

MemberDAO(인터페이스), MemberDAOImpl => SqlSession => memberMapper.xml

 

🎈🎈MainController

package com.example.spring01.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.spring01.model.dto.ProductDTO;

//Controller bean으로 스프링에 등록
@Controller
public class MainController {

	//로깅 변수
	private static final Logger logger=LoggerFactory.getLogger(MainController.class);
	
	//url 요청 매핑처리, 모든 요청
	@RequestMapping("/")
	public String main(Model model) {
		//Model은 자료 저장용 객체(서블릿 request객체와 같은 역할)
		model.addAttribute("message","홈페이지 방문을 환영합니다.");
		return "main"; // WEB-INF/views/main.jsp로 포워딩(스프링은 기본 값이 포워딩. 리다이렉트는 별도로 지정해야 함)
	}
	
}

🎈🎈MemberController 

package com.example.spring01.controller;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.spring01.model.dto.MemberDTO;
import com.example.spring01.service.MemberService;

//컨트롤러 빈으로 등록
@Controller
public class MemberController {

	//Service 인스턴스 주입
	@Inject
	MemberService memberService;
	
	@RequestMapping("member/list.do")
	public String memberList(Model model) {
		List<MemberDTO> list=memberService.memberList();
		model.addAttribute("list",list);
		return "member/member_list";// veiws/memeber/member_list.jsp로 포워딩
	}
	
	@RequestMapping("member/write.do")
	public String write() {
		return "member/write";//write.jsp로 포워딩
	}
	
	//@ModelAttribute : form에서 전달한 값을 저장하는 객체(생략 가능)
	@RequestMapping("member/insert.do")
	public String insert(@ModelAttribute MemberDTO dto) {
		//System.out.println(dto);
		memberService.insertMember(dto);//F4
		//등록 후 목록 갱신
		return "redirect:/member/list.do";//리다이렉트
	}
	
	@RequestMapping("member/view.do")
	public String view(@RequestParam String userid, Model model) {
		//모델에 자료 저장
		model.addAttribute("dto",memberService.viewMember(userid));
		return "member/view";//view.jsp로 포워딩
	}

	@RequestMapping("member/update.do")
	public String update(MemberDTO dto, Model model) {
		//비밀번호 체크
		boolean result=memberService.checkPw(dto.getUserid(), dto.getPasswd());
		if(result) {//비밀번호가 맞으면
			//회원정보 수정
			memberService.updateMember(dto);
			//수정 후 목록 갱신
			return "redirect:/member/list.do";//리다이렉트			
		}else {
			model.addAttribute("message","비밀번호를 확인하세요.");
			//수정 버튼을 누른 후에는 입력필드에 나타난 정보가 모두 지워지기 때문에 이를 방지하는 코드를 작성
			model.addAttribute("dto", dto);
			//날짜는 dto가 아닌 시스템에서 자동 처리했기 때문에 입력필드에서 지워지는 현상을 방지하기 위한 코드 처리
			model.addAttribute("join_date", memberService.viewMember(dto.getUserid()).getJoin_date());
			return "member/view";
		}
	}
	
	@RequestMapping("member/delete.do")
	public String delete(String userid, String passwd, Model model) {
		boolean result=memberService.checkPw(userid, passwd);
		if(result) {//비밀번호가 맞으면
			memberService.deleteMember(userid);
			//삭제 후 목록 갱신
			return "redirect:/member/list.do";
		}else {
			model.addAttribute("message", "비밀번호를 확인하세요.");
			//삭제 버튼을 누른 후에는 입력필드에 나타난 정보가 모두 지워지기 때문에 이를 방지하는 코드를 작성
			model.addAttribute("dto", memberService.viewMember(userid));
			return "member/view";
		}
		
	}
}

🎈🎈MemberService(interface)

package com.example.spring01.service;

import java.util.List;

import com.example.spring01.model.dto.MemberDTO;

public interface MemberService {
	public List<MemberDTO> memberList();
	public void insertMember(MemberDTO dto);
	public MemberDTO viewMember(String userid);
	public void deleteMember(String userid);
	public void updateMember(MemberDTO dto);
	public boolean checkPw(String userid, String passwd);
}

🎈🎈MemberServiceImpl

package com.example.spring01.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.example.spring01.model.dao.MemberDAO;
import com.example.spring01.model.dto.MemberDTO;

//서비스 빈으로 등록
@Service
public class MemberServiceImpl implements MemberService {
	
	//DAO 인스턴스 주입
	@Inject
	MemberDAO memberDao;

	@Override
	public List<MemberDTO> memberList() {
		return memberDao.memberList();
	}

	@Override
	public void insertMember(MemberDTO dto) {//회원 등록
		memberDao.insertMember(dto);
	}

	@Override
	public MemberDTO viewMember(String userid) {
		return memberDao.viewMember(userid);
	}

	@Override
	public void deleteMember(String userid) {
		memberDao.deleteMember(userid);
	}

	@Override
	public void updateMember(MemberDTO dto) {
		memberDao.updateMember(dto);
	}

	@Override
	public boolean checkPw(String userid, String passwd) {
		return memberDao.checkPw(userid, passwd);
	}

}

🎈🎈MemberDAO(interface)

package com.example.spring01.model.dao;

import java.util.List;

import com.example.spring01.model.dto.MemberDTO;

public interface MemberDAO {
	public List<MemberDTO> memberList();
	public void insertMember(MemberDTO dto);
	public MemberDTO viewMember(String userid);
	public void deleteMember(String userid);
	public void updateMember(MemberDTO dto);
	public boolean checkPw(String userid, String passwd);
}

🎈🎈MemberDAOImpl

package com.example.spring01.model.dao;

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

import javax.inject.Inject;

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

import com.example.spring01.model.dto.MemberDTO;

//DAO bean으로등록
@Repository
public class MemberDAOImpl implements MemberDAO {

	//mybatis연결
	@Inject
	SqlSession sqlSession;//root-context의 id와 같아야함
	
	@Override
	public List<MemberDTO> memberList() {
		return sqlSession.selectList("member.memberList");
	}

	@Override
	public void insertMember(MemberDTO dto) {
		sqlSession.insert("member.insertMember",dto);
	}

	@Override
	public MemberDTO viewMember(String userid) {
		return sqlSession.selectOne("member.viewMember", userid);
	}

	@Override
	public void deleteMember(String userid) {
		sqlSession.delete("member.deleteMember",userid);
	}

	@Override
	public void updateMember(MemberDTO dto) {
		sqlSession.update("member.updateMember", dto);
	}

	@Override
	public boolean checkPw(String userid, String passwd) {
		boolean result=false;
		
		//mapper에 2개이상의 자료를 전달할 떄 : map/dto 사용
		Map<String,String> map=new HashMap<>();
		map.put("userid", userid);
		map.put("passwd", passwd);
		int count=sqlSession.selectOne("member.checkPw", map);
		//비밀번호가 맞으면(1), 틀리면(0)
		if(count==1) result=true;
		return result;
	}

}

🎈🎈memberMapper.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와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="member">

 <select id="memberList" resultType="com.example.spring01.model.dto.MemberDTO">
  select * from member
  order by name
 </select>
 
 <insert id="insertMember">
  insert into member (userid,passwd,name,email)
  values (#{userid},#{passwd},#{name},#{email})
 </insert>
 
 <select id="viewMember" resultType="memberDto">
  select * from member
  where userid=#{userid}
 </select>
 
 <update id="updateMember">
  update member
  set passwd=#{passwd}, name=#{name}, email=#{email}
  where userid=#{userid}
 </update>
 
 <!-- 비밀번호 확인 -->
 <select id="checkPw" resultType="int">
  select count(*) from member
  where userid=#{userid} and passwd=#{passwd}
 </select>
 
 <delete id="deleteMember">
  delete from member
  where userid=#{userid}
 </delete>
	
</mapper>