- 아래 사진과 같이 만들어 봅시다
조건 .1
save.jsp에서 사용자가 회원 성명을 입력하지 않은 경우
팝업으로 "회원성명이 입력되지 않았습니다"를 출력하고 해당 text바에 포커스
조건 .2
마찬가지로 사용자가 모든 정보를 입력하여 정상 등록되는 경우
팝업으로 "회원등록이 완료 되었습니다!"를 출력
조건 .3
조회된 목록의 회원 번호를 클릭하면 회원정보수정 화면(list.jsp)으로 이동
당연히 모든 정보는 DB를 통해야함
- index - 메인화면
설명 필요 없는 부분
- Save.jsp - 회원 등록 페이지
사용자의 정보를 입력받아 /saveParam으로 Controller에 파라미터로 전성된다
회원 정보이기 때문에 보안을위해 post로 전송한다
Controller
@Controller
public class ShopController {
@Autowired // 필드주입
private ShopService service;
@GetMapping("/save")
public String save(){
return "save";
}
메인화면인 index에서 save로 넘어가는 경우 실행
@PostMapping("/saveParam")
public String saveParam(@ModelAttribute MemberDTO memberDTO){
사용자의 입력정보를 @ModelAttribute를 사용하여 객체에 담아줍니다
int saveResult = service.save(memberDTO);
필드주입한 service클래스의 메소드 save에 객체를 매개변수로 넘겨줍니다
리턴으로 int값을 받는 이유는 혹시나 잘못된 저장이 실행될 경우
save를 담당하는 insert는 리턴이 1,0이기 때문입니다
성공 = 1 실패 = 0 입니다
return "redirect:/list";
모든 작업이 끝나면 Mapping이 /list인 메소드를 실행하여
화면이 넘어갑니다
}
}
redirect: /list는 그냥 list.jsp를 화면에 출력하는것이 아닌
Mapping이 "/list"인 메소드를 실행하고 그 메소드의 리턴값 jsp를 화면에 출력합니다
이것으로 DB에 저장을하고 Mapping이 "/list"인 메소드를 실행하여 리스트를 새로 뽑기 때문에
save로 방금 받은 값이 찍힌 정상적인 list 화면 출력이 가능합니다
Service
@Service
public class ShopService {
@Autowired // 의존성주입 - 필드주입
private ShopRepository shopRepository;
public int save(MemberDTO memberDTO) {
return shopRepository.save(memberDTO);
Controller에서 받은 매개변수를 DB에 저장하기 위해
Repository의 save메소드의 매개변수로 넣어줍니다
}
}
Repository
@Repository
public class ShopRepository {
@Autowired //의존성주입 - 필드주입
private SqlSessionTemplate sql;
public int save(MemberDTO memberDTO) {
return sql.insert("Shop.save",memberDTO);
Shop맵퍼에 save쿼리문을 사용하고 memberDTO를 매개변수로 가져갑니다
대소문자를 주의하자
}
}
Mapper
<mapper namespace="Shop">
Shop 맵퍼입니다
<insert id="save" parameterType="shop">
save 쿼리문 SQL양식을 따르기 때문에 insert
insert into member_tbl_02(custName,phone,address,joinDate,grade,city)
values(#{custName},#{phone},#{address},#{joinDate},#{grade},#{city})
실행문도 마찬가지로 SQL의 양식을 따름
객체의 정보를 한번에 저장하는 방법은 아직 모르기 때문에
하나씩 꺼내 table의 컬럼에 넣어준 모습입니다
</insert>
</mapper>
- list.jsp - 회원 목록 페이지
객체정보가 담긴 List를 리턴받아 출력합니다
출력은 c태그를 사용하여 forEach문을 사용하였습니다
c태그는 롬복이기 때문에 따로 사용법을 알아보시길 추천드리겠습니다
Controller
@Controller
public class ShopController {
@Autowired //의존성 주입 - 필드주입
private ShopService service;
@GetMapping("/list")
public String findAll(Model model){
DB에서 가져온 List를 Model에 담아 뿌려주는 느낌입니다
List<MemberDTO> mList = service.findAll();
DB에서 List를 일방적으로 받아오기 때문에 매개변수 없이
sevrice클래스의 findAll 메소드에서 List를 리턴받습니다
model.addAttribute("mList",mList);
이후 model 인터페이스에 담아 list에
잘 뿌려줍니당
return "list";
}
}
Service
@Service
public class ShopService {
@Autowired
private ShopRepository shopRepository;
public List<MemberDTO> findAll() {
return shopRepository.findAll();
Repository에서 List를 받아 리턴합니다
}
}
Repository
@Repository
public class ShopRepository {
@Autowired
private SqlSessionTemplate sql;
public List<MemberDTO> findAll() {
List<MemberDTO> mList = sql.selectList("Shop.findAll");
Mapper를 통해 DB에서 리턴하는 정보를 List에 받아줍니다
selectList이기 때문에 받아온 객체 정보가 리스트에 담겨오게됩니다
return mList;
이후, List를 리턴합니다
}
}
Mapper
<mapper namespace="Shop">
Shop Mapper
<select id="findAll" resultType="shop">
findAll 쿼리문 리턴 타입은 객체입니다
select * from member_tbl_02;
DB의 table에 있는 모든 정보를 객체타입으로 받고
리스트에 담아 리턴합니다
</select>
</mapper>
- update.jsp - 회원정보 수정
list.jsp 에서 id를 누르면 회원정보 수정 창으로 넘어가게 됩니다
파라미터 형석으로 리턴하고 Mapping은 /update로 받습니다
Controller
@Controller
public class ShopController {
@Autowired
private ShopService service;
@GetMapping("/update")
public String update(@RequestParam("custno") Long custno,Model model){
Book프로젝트와 마찬가지로 고유값인 custno를 파라미터로 받아
@RequestParam으로 담아줍니다
MemberDTO memberDTO = service.findByid(custno);
객체를 특정할 수 있도록 고유값인 custno를 넘겨줍니다
Servie클래스에서는 findByid 메소드를 통해 custno을 매개로 받아
DB까지 넘겨주며 객체 정보를 받아옵니다
model.addAttribute("memberDTO",memberDTO);
받아온 객체를 model에 담아 update.jsp에서 사용 가능하게 만들어줍니다
return "update";
}
}
Service
@Service
public class ShopService {
@Autowired
private ShopRepository shopRepository;
public MemberDTO findByid(Long custno) {
return shopRepository.findByid(custno);
매개변수로 받은 custno을
Repository에 있는 findByid에 넘겨주며
객체를 받아 리턴해줍니다
}
}
Repository
@Repository
public class ShopRepository {
@Autowired
private SqlSessionTemplate sql;
public MemberDTO findByid(Long custno) {
MemberDTO memberDTO = sql.selectOne("Shop.findByid",custno);
매개변수로 받아온 custno을 Mapper Shop에 넘겨주고
findByid 쿼리문을 통해 DB에 있는 정보를 객체로 받아옵니다
객체 하나만 받아오기 때문에 selectOne을 사용하였습니다
return memberDTO;
이후 객체를 리턴합니다
}
}
Mapper
<mapper namespace="Shop">
<select id="findByid" resultType="shop" parameterType="Long">
Mapper Shop에 있는 findByid 쿼리문입니다 리턴 타입은 객체이기 때문에
DTO경로를 매개변수로 사용하는 custno의 타입은 Long입니다
select * from member_tbl_02 where custno = #{custno}
DB를 SQL로 만들었기 때문에 SQL문법을 사용하여
매개변수로 받아온 custno의 값과 같은 custno를 찾아
객체로 리턴받습니다
</select>
</mapper>
custno값을 옮겨가며 객체를 받아온 이유는 사용자의 편의성을 위해서 입니다
기존 정보를 수정칸에 넣어주기 위해서 입니다
사용자는 수정하고 싶은 부분의 text바의 value만 수정후 등록합니다
이렇게 등록하는 정보는 전송방식 post로 /update의 파리미터로 Controller에 전송됩니다
Controller
@Controller
public class ShopController {
@Autowired
private ShopService service;
@PostMapping("/update")
public String updateFaram(@ModelAttribute MemberDTO memberDTO , Model model){
사용자가 수정한 정보를 파라미터로 받기 때문에
@ModelAttribute를 사용하여 객체로 담아줍니다
model.addAttribute("updateResult",service.update(memberDTO));
조건이 걸려있는 팝업창을 띄워야하기 때문에 리턴받는 값을
바로 model인터페이스에 받아줍니다
return "updateResult";
}
}
전송하는 방식이 get , post로 서로 다르기 때문에
주소값이 같아도 상관 없습니다
Service
@Service
public class ShopService {
@Autowired
private ShopRepository shopRepository;
public int update(MemberDTO memberDTO) {
return shopRepository.update(memberDTO);
매개변수로 받은 DTO객체를 Repository에 넘겨주며
DB저장결과를 리턴받습니다
}
}
Repository
@Repository
public class ShopRepository {
@Autowired
private SqlSessionTemplate sql;
public int update(MemberDTO memberDTO) {
return sql.update("Shop.update",memberDTO);
Shop맵퍼의 update쿼리문을 지정하고 매개변수로 받은
DTO를 넘겨줍니다
그리고 저장 결과를 리턴합니다
}
}
Mapper
<mapper namespace="Shop">
<update id="update" parameterType="shop">
Shop맵퍼의 update쿼리문입니다 매개로 받은 값이 DTO이기 때문에
경로를 통해 객체임을 알려줍니다
update member_tbl_02 set custno = #{custno}, custName = #{custName},phone = #{phone}
,address = #{address},joinDate = #{joinDate}
,grade = #{grade},city =#{city} where custno = #{custno}
입력받은 값을 SQL문법에 맞게 작성하여 DB에 넘겨주고
결과를 리턴합니다
</update>
</mapper>
이렇게 Controller에서 리턴한 updateResult로 넘어오게 됩니다
update또한 리턴타입은 저장 성공시 1을 리턴하고 실패하는 경우 0을 리턴하기 때문에
updateResult.jsp에서 스크립트를 사용해 조건문을 통해 팝업을 띄우며
사용자에게 보여줄 jsp 이름을 전송합니다