inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

체크 박스 - 멀티

@ModelAttribute 관련 static 처리와 th:field 부분 질문드립니다

해결된 질문

482

s2사랑해요s2김영한s2

작성한 질문수 10

3


[질문 내용]
안녕하십니까 강의 정말 잘 듣고 있습니다. 두 가지 질문 드리려고 하는데요!

  1. 5분 50초 경에

     

    @ModelAttribute("regions")

    public Map<String, String> regions() {

    Map<String, String> regions = new LinkedHashMap<>();

    regions.put("SEOUL", "서울");

    ..

    return regions;

    } 부분 설명해주시면서 별도의 메서드마다 별도로 처리하는 것보다는 static으로 처리를 하면 더 좋다는 설명을 해주셨습니다. static으로 처리하는 것의 예시가 궁금합니다. 어떻게 처리를 해야할지 감이 잘 안와서요!! ㅎㅎ ㅠ

  2. <!-- multi checkbox -->

             <input type="checkbox" th:field="*{regions}" th:value="${region.key}"
     class="form-check-input">
    

    th:field="*{regions}" 와 th:value="${region.key}" 의 값을 비교해서 checked 설정을 해준다는 설명 부분이 이해가 잘안갑니다..ㅠ th:field="*{regions}" 를 적용했을 때 id 값과 name값 value값을 편리하게 설정해준다는 개념만 이해가 되는데 사용자가 항목을 체크하면 th:field="*{reigons}" 에 어떤 값들이 들어가는것인지 , 어떻게 비교를 하는 것인지 잘 모르겠습니다...

감사합니다..!

spring mvc

답변 1

2

김영한

안녕하세요. s2사랑해요s2김영한s2님 🙂

 

  1. 다음과 같이 처리하시면 됩니다.

public abstract class Regions {

    private static final Map<String, String> regions = new LinkedHashMap<>();
    static {
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU", "제주");
    }

    public static Map<String, String> getRegions() {
        return regions;
    }


}

//컨트롤러
@ModelAttribute("regions")
public Map<String, String> regions() {
    return Regions.getRegions();
}

관련 코드가 잘 이해되지 않으면 자바의 static에 대해서 학습하셔야 합니다.

 

2번의 경우 다음 코드를 통해서 생성된 코드를 웹브라우저에서 소스코드 보기를 해보시면 확인할 수 있습니다.

<input type="checkbox" th:field="*{regions}" th:value="${region.key}"
 class="form-check-input">

 

생성된 코드

        <!-- multi checkbox -->
        <div>
            <div>등록 지역</div>
            <div class="form-check form-check-inline">
                <input type="checkbox" value="SEOUL" class="form-check-input" id="regions1" name="regions" checked="checked"><input type="hidden" name="_regions" value="on"/>
                <label for="regions1"
                       class="form-check-label">서울</label>
            </div>

            <div class="form-check form-check-inline">
                <input type="checkbox" value="BUSAN" class="form-check-input" id="regions2" name="regions"><input type="hidden" name="_regions" value="on"/>
                <label for="regions2"
                       class="form-check-label">부산</label>
            </div>

            <div class="form-check form-check-inline">
                <input type="checkbox" value="JEJU" class="form-check-input" id="regions3" name="regions"><input type="hidden" name="_regions" value="on"/>
                <label for="regions3"
                       class="form-check-label">제주</label>
            </div>
        </div>

 

th:field="*{regions}"

이 코드는 Item에 있는 regions를 사용합니다.

public class Item {

    private Long id;
    private String itemName;
    private Integer price;
    private Integer quantity;

    private Boolean open; //판매 여부
    private List<String> regions; //등록 지역
}

 

th:value="${region.key}"

이 코드는 타임리프에서 해당 코드 바로 위에서 반복하는 <div th:each="region : ${regions}">에 있는 region을 뜻합니다. 즉 다음 코드를 뜻합니다.

    @ModelAttribute("regions")
    public Map<String, String> regions() {
        Map<String, String> regions = new LinkedHashMap<>();
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU", "제주");
        return regions;
    }

 

결과적으로 @ModelAttribute에서 다음 regions가 반복하면서 출력됩니다.

그 중에 Item.regions의 값과, @ModelAttribute에 있는 regions에 있는 key가 같으면 HTML에서 checked가 들어갑니다. 화면에는 체크 표기가 되어 보이는 것이지요.

감사합니다.

2

s2사랑해요s2김영한s2

자세한 설명 진심으로 감사드립니다. 1번은 정말 잘 이해가 되었습니다!!

2번 질문에서 추가로 질문드리고 싶은데..

th:field="*{regions}" 이 값이 item에 있는 regions를 사용한다는 것을 알고,

th:value="${region.key}" 이 코드는 <div th:each="region : ${regions}">에 있는 region을 뜻하는 것도 알겠습니다.

그런데 둘을 비교하는 부분이 이해가 가질 않습니다 강사님!! TT

사용자가 체크박스 항목을 체크를 하면 items에 있는 regions에 값이 들어가고 이 값과 모델에 들어있는 regions 값을 비교해서 checked 속성이 checked로 바뀌는 것인가요?

1

김영한

네 생각하신 내용이 맞습니다^^!

이미지 업로드와 db 트랜잭션 묶는법

0

43

1

Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4

0

53

2

MessageSourceTest 코드

0

48

1

인터셉터 에러 설정

0

48

1

resolveArgument()메서드 질문

0

57

1

43강 검증1 에서 실패 로직 관련 질문있습니다.

0

57

2

타임리프 3.X 버전 rendering, serializer 에러 해결 방법

2

133

3

스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ

0

90

3

pdf 오타 문의

0

57

1

ItemUpdateForm 검증 관련 질문입니다.

0

49

1

22page 링크 주소 변경

0

59

2

특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문

0

53

1

섹션3번 수업에 대한 질문입니다.

0

80

2

@Autowired 보다 더 좋은 방법이 어떤 걸까요?

0

85

2

타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.

0

65

1

자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다

0

142

3

스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문

0

63

1

톰캣 에러 페이지가 안보입니다.

0

104

2

apiEceptionController에서 센드 에러 호출하면 안되는지?

0

81

1

세션 타임아웃시 쿠키 삭제 방법이 없나요?

0

118

2

ApiExceptionController 질문드립니다.

0

64

1

셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?

0

66

1

MemberRepository 필드의 fianl 선언 유무

0

85

2

혹시 index.html 에서는 fragment 사용이 안되는건가요

0

58

1