본문 바로가기

Spring

스프링 MVC Controller

반응형

스프링프레임워크를 접하고 나서 그냥 지나쳤던 어노테이션이 @Controller 이다 이전에는 무조건 쓰라고 해서 썻지만 확실하게 개념을 잡고 가고 싶어서 포스팅한다 오늘도 게시판 삭제랑 댓글 처리 작업 하면서 Controller이  Model과 View 사이의 상호 작용을 관리해주는 녀석인건 알지만 명확하게 모르는거 같아서 일단 책을 보고 정리해보고자 한다

 

스프링 MVC의 Controller

 

스프링 MVC를 이용하는 경우 작성되는 Controller는 다음과 같은 특징이 있다.

  • HttpServletRequest,HttpServletResponse를 거의 사용할 필요 없이 필요한 기능을 구현할수 있다

프로젝트 하면서 사용하긴 했지만 Servlet을 이용할때보다 많이 사용하지는 않았다.

 

  • 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용가능

Controller 사용하면서 가자 좋았던 부분인데 model이랑 modelAndView 그리고 ResponseEntiy 타입을 리턴 타입으로 가장 많이 사용한거 같다

 

  • GET 방식, POST 방식 등 전송 방식에 대한 처리르 어노 테이션으로 처리 가능

프로젝트 하면서 List나 항상 결과가 같은 값을 보여줘야 할때 GET방식을 썻고 수정되거나 업데이트 할때는  Post랑 Patch를 많이 썼다

 

 

 

SampleController의 클래스 선언부에는 @Controller라는 스프링  MVC 에서 사용하는 어노테이션을 적용하고 있다 SampleController 클래스는 위의 그림과 같이 자동으로 스프링의 객체(Bean)로 등록되는데 servlet-context.xml 에 그이유가 있다.

 

servlet-context.xml 에는 context:component-scan 이라는 태그를 이용해서 지정된 패키지를 스캔하도록 설정되어 있다. 해당 패키지에 선언된 클래스들을 조사하여 스프링에서 객체(Bean) 설정에 사용되는 어노테이션들을 가진 클래스들을 파악하고 필요하다면 이를 객체로 생성해서 관리하게 된다.

클래스가 스프링에서 관리되면 화면상에는 클래스 옆에 작게  s모양의 아이콘이 추가된다 .

 

Controller를 사용하면 함꼐 RequestMapping을 많이 사용하는데 RequestMapping은 현재 클래스의 모든 메서들의 기본적인 URL 경로가 된다. 물론 메서드에서도 사용가능하다 .

SampleController클래스를 "/sample/*" 이라는 경로를 지정한다면 다음과 같은 URL은 모두 SampleController에서 처리된다.

 

 

 

 

SampleController클래스는 LomBok의 @Log4j를 사용한다. @Log4j 는 @Log 가 java.util.Logging 을 이용하는데 반해 Log4j라이브러리를 활용한다 현재 나는 스프링 부트로 해보고 있어서 의존성을 추가 해주고 properties를 만들어줬다 이방법뿐 아니라 xml 을 사용하여 만들어줘도 된다.  WAS 를 실행해보면 스프링이 인식할수 있는 정보가 출력되는것을 확인할수 있다.

 

 

현재 프로젝트 경우 "/sample/*" 은 호출이 가능한 경로라는 것을 확인할 수 있습니다.

 

@RequestMapping의 변화

 

RequestMapping의 경우 몇가지의 속성을 추가 할수 있는데 이중에서도 가장 많이 사용하는 속성이 method속성이다 주로 GET,POST 방식을 구분해서 사용한다 좀더 구체적으로 설명하자면 ~~ 음 ~~ 사용자가 100번을 요청을 해도 같은 결과값이 나와야 하는건 GET로 사용하고 반대로 100번요청을 해도 결과값이 다를수있는경우에는 POST 를 사용한다

 

RequestMapping은 GET,POST 방식 모두를 지원해야 하는 경우에 배열로 처리해서 지정할수 있다. 일반적인 경우에는  GET,POST  방식만을 사용하지만 최근에는 PUT DELETE 방식등도 점점 많이 사용하고 있다.

 

Controller의 파라미터 수집

 

Controller를 작성할때 가장 편리한 기능은 파라미터가 자동으로 수집되는 기능이다.  이기능을 이용하면 매번 request.getParameter() 를 이용하지 않아도 된다. servlet을 이용한 프로젝트는 매번 사용했었다.. ㅠ 불편하을 겪고 편한걸 사용하면 그렇게 감사할수가 없다.. ㅋ

 

 

책에서는 어노테이션이 @Getter 가 아니라 @Data 를 사용한다 필자는 @Data 를 사용하지 않고 Getter 만 열어 놓고 사용한다 

이유는 포스팅한적이 있는데 이번에는 언급하지 않고 그냥 넘어가겠다 

 

SampleController의 경로가 "/sample/*" 이므로 ex01() 메서드를 호출하는 경로는 "/sample/ex01" 이 된다. 

필요한 마라미터를 URL 뒤에 ?name=AAA&age=10 로 입력을 해봤다 실행된 결과를 로그로 확인해보면 파라미터 값을 받아 오는걸 확인할수 있다.

 

파라미터 수집과 변환

 

Controller가 파라미터를 수집하는 방식은 파라미터 타입에 따라 자동으로 변환하는 방식으로 이용한다. 예를 들어 SampleDTO 에는 int 타입으로 선언된 age가 자동으로 숫자로 변환되는 것을 볼수 있다.

만일 기본 자료형이나 문자열 등을 이용한다면 파라미터의 타입만을 맞게 선언해주는 방식으 사용할수 있다.

@RequestParam 어노테이션을 사용해서 작성해봤다 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우에 유용하게 사용된다.

 

리스트 배열 처리

동일한 이름의 파라미터가 여러 개 전달되는 경우에는 ArrayList<> 등을 이용해서 처리가 가능하다 

스프링은 파라미터의 타입을 보고 객체를 생성하므로 파라미터의 타입은 List<> 와 같이 인터페이스 타입이 아닌 실제적인 클래스 타입으로 지정한다. "ids" 라는 이르의 파라미터가 여러개 전달되더라도 ArrayList<String> 이 생성되어 자동으로 수집된다. 

배열인 경우도 똑같이 처리할수있다

 

객체 리스트

 

만일 전달하는 데이터가 SampleDTO 와 같이 객체 타입이고 여러 개를 처리해야 한다면 약간의 작업을 통해서 한 번에 처리를 할 수 있다. 예를 들어 SampleDTO를 여러개 전달받아서 처리하고 싶다면 다음과 같이 SampleDTO 의 리스트를 포함하느 SampleDTOList 클래스설계해야한다

파라미터는 [인덱스] 와 같은 형식으로 전달해서 처리할수 있지만 그렇게 하면 현재는 400 에러인 BedRequest가 확인된다.

에러 코드를 보면 현재 특수문자 때문에 에러가 나는데 만약 JavaScript 를 이용한다면 encodeURLComponent(param) 과 같은 방법으로 해결할수 있으나 현재는 밑에 사진처럼 변경 했다 .

 

 

일단 객체를 리스트로 받아 오는거 가까지 복습을 해봤다 분명 전부다 아는내용이지만 다시 한번 집고 가니까 마음이 편해졌다 아직 @InitBinder 가 남았는데 내일 다시 포스팅 하겠다!

 

 

spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=S
spring.datasource.password=s
server.port=81

logging.level.org.springframework.web=debug
logging.level.sql=error
# hibernate에서 생성하는 SQL 로그 끄기
logging.level.org.hibernate.SQL=off

logging.level.jdbc=error
logging.level.jdbc.sqlonly=debug

#max-history 설정 안하면 디폴트가 30이라 30일 이후의 로그는 자동 삭제된다. 필수로 해야함.
logging.logback.rollingpolicy.max-history=9999999
logging.logback.rollingpolicy.max-file-size=100MB
logging.file.name=${user.home}/logs/product.log

# 로그 패턴 설정
logging.pattern.console=%-5level %d{yyyy-MM-dd HH:mm:ss}[%thread] [%F - %M] [%logger{0}:%line] - %msg%n
logging.pattern.file= %-5level %d{yyyy-MM-dd HH:mm:ss}[%thread] [%F - %M] [%logger{0}:%line] - %msg%n

#jsp 연동
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp



#log4jdbc.log4j.properties

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

 

반응형

'Spring' 카테고리의 다른 글

스프링 MVC Controller(ResponseEntity) 타입  (0) 2020.12.03
스프링 MVC Controller(@InitBinder)  (0) 2020.12.03
@PathVariable(스프링 지향)  (0) 2020.12.01
SprtingSecurity(메뉴 권한 및 WebIgnore 설정)  (0) 2020.11.14
Oracle 연동  (0) 2020.11.09