인프런 커뮤니티 질문&답변

jeidiiy님의 프로필 이미지

작성한 질문수

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

체크 박스 - 멀티

#ids.seq 질문입니다.

해결된 질문

작성

·

710

4

공식 문서를 보니 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 객체의 행동을 유추할 수 밖에 없을것 같습니다. 혹시 이것저것 테스트 해보시고, 새로운 정보를 알게 알게 되시면 답글 부탁드립니다.

.

감사합니다.

jeidiiy님의 프로필 이미지

작성한 질문수

질문하기