Notice
Recent Posts
Recent Comments
Link
혜야의 코딩스토리
[Spring] 스프링 회원 관리 프로그램 본문
📌효율적인 유지보수를 위해 인터페이스, 구현 클래스로 나누는 것이 좋음
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>
'꿈 : 멋진 개발자 🧸 > Java' 카테고리의 다른 글
[Spring] AOP 관점 지향 프로그래밍 (0) | 2022.09.30 |
---|---|
[Spring] 스프링 프레임워크의 특징 (0) | 2022.09.23 |
[JSP] JSP(Java Server Pages)의 내장 객체/ MVC패턴 / 프레임 워크(Framework) (0) | 2022.07.17 |
[JSP/Servlet] JSP(Java Server Pages)와 서블릿 (0) | 2022.07.17 |
[Java] 서블릿이란? (0) | 2022.07.17 |