#ids.seq 질문입니다.
공식 문서를 보니 ids에 prev 말고도 seq, next가 있어서 직접 해보았는데 seq를 사용하니 regions2, regions4, regions6으로 나오더라구요. next를 사용하면 regions2, regions3, regions4 순으로 나오구요. 실습대로 prev를 사용하면 regions1, regions2, regions3 순으로 나옵니다. 카운팅이 어떻게 되는지 모르겠습니다. prev면 이전 카운트를 가져오는 것 같아 시작 카운트가 2인가? 생각했는데 next를 보면 아닌 것 같고 seq는 순서대로 증가할 것 같은데 2 단위로 증가하는 걸 보니 헷갈립니다. 공식 문서에도 별다른 설명이 없어 질문드립니다.
답변 2
11
이 글을 보고 흥미가 생겨서 테스트 해본 결과를 말씀드리겠습니다.
1. `th:each`는 `iteration`이 가능한 객체에 대해 반복은 제공하지만 `index` 자체를 제공하지는 않습니다.
2. 그래서 우리가 해당 객체를 이용할 때 매번 가상의 `index`를 생성합니다. 내부적으로 쓰이는 이름은 아마 `ID Count` 입니다. (에러메시지에서 확인 가능합니다.)
3.(중요) 단, 객체를 이용하지 않으면 생성하지 않습니다. 즉, '객체를 이용할 때' 그 때 생성합니다. (아마 lazy한 정책을 가지고 있는 것 같습니다.)
4. 가상의 `index`는 `1`부터 시작합니다.
5. 당연히 매 루프를 돌 때마다 가상의 `index`는 1씩 증가합니다.
6. `#ids.prev()`는 이전에 이용했던 가상의 `index` 내역이 있는지 확인하고 그 값을 가져옵니다. 그래서 만일, `label` 태그를 앞에 위치시키고, `#ids.prev()`를 이용하면 아직 가상의 인덱스를 이용해본적이 없기 때문에 다음과 같은 예외가 뜹니다.
Caused by: org.attoparser.ParseException: Cannot obtain previous ID count for ID "regions" (template: "form/editForm" - line 54, col 24)
7. `#ids.next()`는 만일 객체를 사용했다면, 생성됐을 가상의 인덱스 값을 가져옵니다. (`3.`번 규칙을 다시 되새기면 아직 객체를 사용하지 않았기 때문에 가상의 인덱스가 생성되지 않은 상태인데, `#ids.next()`를 이용해 가상의 인덱스를 객체를 사용하지 않고도 미리 이용할 수 있다는 것을 알 수 있습니다.)
8. `#ids.seq()`는 `#ids.next()`처럼 가상의 `index`를 미리 이용해놓고 이용한 뒤 `1` 증가시켜 놓습니다. (`i++`) -> 그래서 마치 2씩 증가하는 것처럼 보일 수 있습니다.
위의 8가지 법칙을 적용하면 정확히 맞아떨어집니다.
8
안녕하세요. wscrg 님, 공식 서포터즈 codesweaver 입니다.
.
prev 는 이전의 시퀀스 값을, next 다음의 시퀀스 값을, 그리고 seq는 현재의 시퀀스 값을 반환후 시퀀스값을 1 증가하는것이 기본 동작입니다.
.
보통 ids 는 label태그에 사용하는데, 이 label이 form의 앞에 위치하는가 뒤에 위치하는가를 기준으로 next와 prev를 선택해서 사용합니다. label이 input 태그 보다 먼저오는 경우 next를, label이 input 태그 보다 뒤에오는 경우 prev 를 사용합니다.
.
문제는, seq의 경우 label과 input 태그의 위치에 따라 동작이 다른것처럼 보인다는 점입니다.
.
우선, label이 input 태그보다 먼저 올 경우는 seq가 아래와 같이 '현재 시퀀스 값을 반환 후 시퀀스 값을 증가'하고 있음을 볼 수 있습니다.

.
반면, label이 input태그의 뒤에 오는 경우 seq가 '현재 시퀀스 값에서 1증가한 뒤 값을 반환'하는것처럼 보입니다.

결과적으로 label과 input의 위치에 따라 seq의 동작이 달라진것처럼 보입니다.
.
그러나, 앞서 설명드렸던 기본 동작 (seq의 경우 현재값을 반환후 시퀀스 값을 1 증가)을 위반하지 않아야 한다고 가정하고 다시 생각해보겠습니다.
그러면, th:field 로 "regions1" 이 생성된 이후 내부적으로 관리하는 시퀀스가 1 증가하였다고 가정할 수 있습니다. 그렇게 되면 결과와 ids객체의 기본 동작에 모순이 생기지 않습니다.
.
현재로썬 메뉴얼에 해당 부분의 자세한 설명을 찾을 수 없어 출력 결과를 가지고 ids 객체의 행동을 유추할 수 밖에 없을것 같습니다. 혹시 이것저것 테스트 해보시고, 새로운 정보를 알게 알게 되시면 답글 부탁드립니다.
.
감사합니다.
이미지 업로드와 db 트랜잭션 묶는법
0
43
1
Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4
0
53
2
MessageSourceTest 코드
0
49
1
인터셉터 에러 설정
0
48
1
resolveArgument()메서드 질문
0
57
1
43강 검증1 에서 실패 로직 관련 질문있습니다.
0
58
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
66
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





