본문 바로가기
개발자 전향 프로젝트

체크박스 활용하기 (Multiple Selection 수정or삭제) - 2/2

by 샘오리 2022. 10. 6.

오늘은 저번 글에 이어서 백 쪽의 로직은 어떻게 동작하는지 작성해보려고 한다.

먼저 view 단에서 배열을 통해 보내준 값을 컨트롤러 단에서 어떻게 받는지는 아래와 같다.

 

 

CONTROLLER

    //코드 활성화/비활성화
    @GetMapping(value = "/disableCode")
    public String disableCode(@RequestParam("articlesArray") String[] articlesArray) {
        
        for(String arr:articlesArray) {
            Integer codeNo = Integer.valueOf(arr);
            codeService.disableCode(codeNo);
        }
        
        return "redirect:/selectCode";
    }

원리는 향상된 for문으로 articlesArray라는 배열을 그 배열의 길이만큼 돌되 arr이라는 String 변수에

담는다는 뜻이고, 그 arr에 담을 때 그 arr을 String에서 Integer로 형변환 하여 codeNo라는 Integer 변수에 넣는 것이다.

 

이제 그 codeNo는 반복문을 통해 반복적으로 codeService의 실질적인 수정 or 삭제를 실행시켜줄 함수에 매개변수로 들어가는 것이고 이 모든 반복작업이 끝나면 해당 화면을 조회해주는 컨트롤러단의 함수로 경로를 redirect 하게 되는 것이다.

 

그러면 codeService의 disableCode는 codeNo를 어떻게 받을까?

 

SERVICE

 public void disableCode(Integer codeNo) {
        codeSheetRepository.disableCode(codeNo);
    }

 

void로 리턴을 주지 않고 codeNo를 매개변수로 받아 Repository단에 실제로 db를 꺼내고 연산하는 작업을 담당하는 함수에 전달해주는 작업을 한다.

 

그럼 대망의 Repository단은?

 

REPOSITORY

  @Modifying
    @Transactional
    @Query(value = "UPDATE 테이블명 SET 바꿀 필드명 = CASE WHEN 바꿀 필드명 = '조건 값' THEN '바꾸고 싶은 값' WHEN 바꿀 필드명 = '조건 값' THEN '바꾸고 싶은 값' ELSE '어느것도 아닐 경우 출력할 값' END WHERE CODE_NO=:매개변수로 받은 변수", nativeQuery = true)
    void disableCode(@Param("매개변수로 받은 변수") Integer 매개변수로 받은 변수);

필자 같은 경우는 CASE WHEN THEN 을 사용해서

A 라는 케이스에서는 어떤 값을 출력하고

B 라는 케이스에서는 어떤 값을 출력하라는 명령을 한 것이고

이 모든 작업이 아까 CONTROLLER -> SERVICE 단에서 넘어온 codeNo라는 매개변수를 받아 해당 행의 pk 값인 codeNo가 변수와 일치할 경우 작업을 하라고 해줌으로써 어떤 행인지 명시해준 것이다.

 

예를 들어 두번째 행의 체크를 했으면 두번째 행의 codeNo가 들어가서 두번째 행의 값을 수정하라고 명시해준 셈이다.

이것은 단일 체크박스에만 해당되는 것이나 아까 말했듯 반복문을 통해서 그 배열의 인덱스만큼 해당 로직을 반복하게 했기 때문에 체크한 모든 행의 값이 수정되는 것을 볼 수 있다.

 

끝!

 

백엔드는 원래 이런것이야..