스프링 요청 처리출처: https://it-sungwoo.tistory.com/7
클라이언트의 요청이 들어오면 DispatcherServlet이 요청을 가로챈다.
DispatcherServlet이 요청을 HandlerMapping에게 보내 해당 요청을 처리할 수 있는 Controller를 찾고, 그 Controller 내부 메소드 중 요청 url에 매핑되는 메소드를 실행시킨다.
메소드 로직 처리후 ViewResolver를 통해 view 화면을 찾는다.
찾은 view 화면을 View에 보내면 이 결과를 다시 DispatcherServlet에 보내고, DispatcherServlet는 최종 클라이언트에게 전송한다.
webapp -> WEB_INF -> spring -> appServlet -> servlet-context.xml파일에 context:component-scan 태그의
base-package는 Spring Legacy Project를 만들 때 지정한 topLevelPackage의 경로이다.
이는 변경할 수 있다.
base-package 속성 값(특정 경로)에서 Component, Service, Repository, Controller 어노테이션을 찾는다.
Context:component-scan 적용 어노테이션
- @Component : Spring Bean
- @Service : 서비스 클래스
- @Repository : 보통 DAO 클래스에 사용함
- @Controller : 컨트롤러
자동 주입 어노테이션
- @Autowired: 타입을 기준으로 bean주입, 같은 타입의 bean이 2개 이상 존재할 경우에는 이름으로 구분하여 주입
- @Qualifier: Autowired와 같이 사용, Bean의 이름을 지정하여 주입
- @Resource: 주입하려고 하는 bean의 name(id)이 일치하는 객체를 자동으로 주입, Jdk9부터는 포함X
- @Inject: @Autowired과 동일한 기능
@Controller를 통해 RequestController가 컨트롤러임을 명시하고, @Autowired를 통해 스프링 컨테이너 내부의 타입이 RequestService인 Bean을 멤버 필드인 service에 자동으로 주입하였다.
메소드의 url 매핑과 리턴할 값이 동일하면 생략할 수 있으므로, 보통 두 값이 동일하지 않은 경우에 리턴할 값을 명시한다.
Post 요청 처리 방법
1. HttpServletRequest를 이용하는 방법
HttpServletRequest의 getParameter(), getParameterValues()를 통해 파라미터 값을 변수에 저장하고 이를 사용한다.
2. 요청을 처리할 메소드의 파라미터명을 request의 파라미터명과 일치시키는 방법
request의 파라미터명과 컨트롤러 메소드의 매개변수 이름이 같으면 자동으로 값이 주입된다.
3. 메소드의 매개변수명과 request의 파라미터명을 다르게 사용하는 방법
@RequestParam("ID")는 HttpServletRequest의 getParameter("ID")와 같다.
request의 매개변수 중 name이 ID인 변수의 값을 String타입의 id라는 객체에 저장한다.
pw도 이와 동일하다.
4. DTO객체의 멤버 필드명과 request의 파라미터명을 일치시켜 값을 전달 받는 방법
request의 파라미터에 맞게 DTO객체의 특정 setter가 호출되어 매개변수별로 값이 자동으로 대입된다.
5. Model과 DTO객체를 이용하는 방법
Model 타입의 model 객체는 스프링 컨테이너가 생성한 객체의 참조 값을 반환 받아 사용한다.
model객체의 생명 주기는 기존의 요청이 소멸되기 전까지, 즉 새로운 요청이 들어오기 전까지이다.
Model의 addAttribute()를 통해 index.jsp에 전달할 데이터를 저장하고, return을 통해 viewResolver에게 index를 전달하면 해당 jsp파일을 찾아 실행한 후 클라이언트에게 응답한다.
이 과정에서 클라이언트가 새롭게 요청을 보내지 않았으므로 요청 url은 login으로 동일하다.
새로운 요청이 없어 model 객체가 소멸되지 않았으므로 저장한 데이터인 id, pw를 통해 데이터를 불러올 수 있다.
[요청 처리 메소드의 리턴 값] 경로, redirect, forward의 차이점
- return 경로; // viewResolver가 전달 받은 파일명을 통해 jsp 파일을 찾아 실행한 후 클라이언트에게 응답
- return "redirect:경로"; //요청 경로를 클라이언트에게 응답 -> 클라이언트가 직접 서버로 재요청함(url변경 & Model을 쓸 수 없음)
- return "forward:경로"; //서버 내부에서 @mapping을 찾아 메소드 실행
RedirectAttributes를 이용하여 값을 전달하는 방법
id와 pw값이 빈 값이 아니면 로직을 처리한 후 redirect 방식으로 index에 요청을 보내고자 한다.
이때 redirect 방식은 클라이언트에게 특정 index 파일의 경로를 전달하면 클라이언트가 서버에 새롭게 이를 요청한다.
따라서 Model객체가 소멸되므로 RedirectAttributes타입의 객체를 이용해 값을 전달해야 한다.
https://mine-it-record.tistory.com/416
[SPRING] redirect를 사용하여 파라미터 넘겨주기 (ft. addFlashAttribute, addAttribute)
- redirect를 사용하여 파라미터 담아서 넘겨주기 - 웹 개발 진행 중에 redirect를 사용하여 파라미터를 넘겨줘야 하는 경우가 있으니 그 방법에 대해 알아보자. 우선 알아둬야할것은 RedirectAttributes
mine-it-record.tistory.com
'Spring Framework' 카테고리의 다른 글
[Spring Framework] DB 커넥션 풀, HikariCP, MyBatis (0) | 2022.08.03 |
---|---|
[spring] 의존성 주입 (0) | 2022.06.24 |
톰캣 서버 로케이션 비활성화 해결 (0) | 2022.06.21 |
Spring Framework 구조 (0) | 2022.06.20 |