[꼼꼼한 개발자] 꼼코더
21. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 파라미터 수집(2), 리스트, 배열 처리, 객체 리스트, @DateTimeFormat 본문
21. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 파라미터 수집(2), 리스트, 배열 처리, 객체 리스트, @DateTimeFormat
꼼코더 2023. 1. 5. 01:24👨🏻💻 리스트, 배열 처리
동일한 이름의 파라미터가 여러 개 전달되는 경우에 ArrayList <> 등을 이용해서 처리가 가능하다.
코드와 같이 List <>와 같은 인터페이스 타입이 아닌 실제적인 클래스 타입으로 지정해줘야 한다.
예제 코드는 ‘ids’ 이름의 파라미터가 여러 개 전달되어도 ArrayList <String>이 생성되어 자동으로 수집된다.
‘/sample/ex02List?ids=111&ids=222&ids=333’을 호출 시 아래와 같은 로그가 출력된다.
배열의 경우도 동일하게 처리된다.
👨🏻💻 객체 리스트 (SampleDTO 클래스 작성)
만일 전달하는 데이터가 SampleDTO와 같이 ‘객체 타입’이고 여러 개를 처리해야 한다면
리스트를 포함하는 클래스를 설계해야 한다.
👨🏻💻 SampleDTOList 작성
Sample Controller에서는 SampleDTOList 타입을 파라미터로 사용하는 메서드를 작성한다.
💁🏻♂️ 결과
‘/sample/ex02Bean?list[0].name=aaa&list[2].name=bbb’ 호출 시 SampleDTO 객체 생성을 확인
파라미터는 ‘[인덱스]’와 같은 형식으로 전달하여 처리할 수 있다.
(톰캣 버전에 따라 ‘[]’와 같은 특수문자가 허용되지 않을 수 있다)
JavaScript를 이용하는 경우 encodeURIComponet()와 같은 방법으로 해결할 수 있지만
현재 예제는( '[ ⇒ %5B' , '] ⇒ %5D' )로 변경해서 요청한다.
‘/sample/ex02Bean?list%5B0%5D.name=aaa&list%5B2%5D.name=bbb’
✍🏻 @InitBinder(TodoDTO 클래스 작성)
파라미터의 수집은 다른 용어로는 ‘binding(바인딩)’이라고 한다.
변환이 가능한 데이터는 자동 변환되지만, 따라서는 파라미터를 변환해서 처리해야 하는 경우가 있다.
‘2018-01-01’과 같은 문자열 데이터로 전달되면 java.util.Date 타입으로 변환하는 작업이 그러하다.
스프링 Controller에서는 파라미터를 바인딩할 때 자동으로 호출되는 @InitBinder를 이용하여 이러한 변환 처리를 할 수 있다.
👨🏻💻 예제 작성
org.zerock.domain 패키지 → TodoDTO 클래스 작성.
TodoDTO에는 특별하게 dueDate 변수의 타입이 java.util.Date 타입이다.
SampleController의 코드도 수정해 주자.
💁🏻♂️ 결과
‘http://localhost:8080/sample/ex03?title=test&dueDate=2018-01-01’호출 시 서버에서는 정상적으로 파라미터 수집 후 아래의 결과를 출력한다.
만일 @InitBinder 처리가 되지 않는다면 브라우저에서 ‘400 에러(syntax 오류)’를 확인할 수 있다.
아직 View단인 JSP 페이지는 없으므로, 다시 말해응답처리는 하지 않았기 때문에 다음과 같은 화면이 보인다.
✍🏻 @DateTimeFormat
@InitBinder를 이용해서 날짜를 변환할 수도 있지만
파라미터로 사용되는 인스턴수 변수에 @DateTimeFormat을 적용해도 반환이 가능하다.
(@DateTimeFormat 사용 시 @InitBinder는 필요하지 않는다.)
문자열로 ‘yyyy/MM/dd’의 형식으로 호출 시 자동으로 날짜타입으로 변환이 된다.
🚚 Model이라는 데이터 전달자
Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있다.
Model 객체는 컨트롤러에서 생성된 데이터를 담아서 JSP에 전달하는 역할.
이를 이용하여 JSP와 같은 뷰(VIew)로 전달해야 하는 데이터를 담아서 보낼 수 있다.
스프링은 Model 타입의 객체를 만들어 메서드에 주입하게 된다.
Model은 모델 2 방식에서 사용하는 request.setAttribute()와 유사한 역할을 한다.
Servlet을 이용해 본 적이 있다면 다음과 같은 코드에 익숙할 것이다.
위에 코드를 스프링에서는 Model을 이용해 아래와 같이 처리한다
메서드의 파라미터를 Model 타입으로 선언하게 되면
스프링 MVC에서 자동으로 Model 타입의 객체를 만든다
따라서 개발자는 필요한 데이터를 담아주는 작업만 하게 되면 모든 작업은 마무리된다.
🔎 Model을 사용하는 예시
주로 Controller에 전달된 데이터를 이용해서 추가적인 데이터를 가져오는 상황에 Model을 사용한다.
- 리스트 페이지 번호를 파라미터로 전달받고, 실제 데이터를 View로 전달해야 하는경우
- 파라미터들에 대한 처리 후 결과를 전달해야 하는 경우
🧹 최종 정리
- 동일한 이름의 파라미터가 여러 개 전달되는 경우에 ArrayList <> 등을 이용해서 처리가 가능
- 파라미터의 수집은 다른 용어로는 ‘binding(바인딩)’이라고 한다.
- 변환이 가능한 데이터는 자동 변환되지만, 따라서는 파라미터를 변환해서 처리해야 하는 경우가 있다.(날짜와 같은 경우)
- @InitBinder 파라미터를 바인딩할 때 자동으로 호출되는 어노테이션.
- @DateTimeFormat 사용 시 간단하게 날씨 포멧 형식을 처리할 수 있다.( @InitBinder는 필요하지 않는다)
- Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있다.
- Model 객체는 컨트롤러에서 생성된 데이터를 담아서 JSP에 전달하는 역할.
- 주로 Controller에 전달된 데이터를 이용해서 추가적인 데이터를 가져오는 상황에 Model을 사용한다
위 내용은 코드로 배우는 스프링 웹 프로젝트 교재를 참고하여 작성되었습니다.