나의 수업일지

인천 일보 아카데미 46일차 -2- 배운 내용으로 만들어보기 (쇼핑몰 회원관리) / redirect 약간 이해함

GUPING 2023. 4. 27. 00:24
  • 아래 사진과 같이 만들어 봅시다

index.jsp / list.jsp / update.jsp

 

조건 .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.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 이름을 전송합니다