본문 바로가기
카테고리 없음

국비 - 스프링 MVC 처리 과정, 프로젝트 구조, 컨트롤러 생성

by Jeong.dev 2022. 9. 29.

■ 배운것

- 스프링 MVC 요청 처리 과정
- 스프링 프로젝트 구조
- 기본 파일 살펴보기(web.xml, servelt-context, HomeController.java)
- 컨드롤러 생성
- 요청으로 넘겨준 파라미터를 컨트롤러가 받는 방법

* jsp 수정

 

 

■ 스프링 MVC 요청 처리 과정

 

 

- 스프링MVC는 디스패처서블릿 1개가 요청을 다 받아서 처리한다.

- 기본적으로 다 셋팅 되어있어서 나는 컨트롤러, 서비스, DAO, 뷰 만 만들어주면 된다.

 

① URL로 클라이언트가 요청함

DispatcherServlet : 야(HandlerMapping) 나 이거 요청 받았는데 어떤 컨트롤러한테 줘야해?

 HandlerMapping : URL과 컨트롤러의 메서드들 Map 형태로 가지고 있어서 컨트롤러 지정해서 알려줌

③④⑤ 핸들매핑이 알려준 컨트롤러한테 요청 줘서 컨트롤러가 서비스랑 다오 통해서 처리하고

     뷰 이름 디스패처 서블릿에게 반환함.

디스패처 서블릿은 뷰 이름만 알아서는 jsp파일을 찾지 못함.

    ViewResolver에게 뷰 이름 주고 뷰 리졸버가 실제 뷰 이름(경로까지해서) 줌.

    디스패처가 그래서 그 뷰한테 전달함.

 

 

 

■ 스프링 프로젝트 구조

1. java : 클래스 파일 들어감(자바 코드)

2. resources : 기타 프로젝트 설정 파일, xml 파일

3. webapp : 외부에서 접근할 수 있는 웹root

4. resources : 이미지, css, 자바스크립트

5. WEB-INF : 웹에 대한 설정(외부에서 직접 접근 불가한 폴더)

http://localhost:8090/soldsoldmarket/WEB-INF/views/home.jsp 이거 안됨

6. lib : 라이브러리 폴더

(메이븐에서 태그 라이브러리 잘 인식 안되어서 라이브러리 직접 넣었다.)

7. spring : 스프링 설정

8. servlet-context : 웹과 관련된 빈 설정 웹이랑 관련된 설정

(컨트롤러, 핸들맵핑, 뷰리졸버, 서비스, 다오)

9. root-context : 공통으로 쓰는 빈 설정

내가 필요한 라이브러리(마이바티스 등), 서블릿이 여러개여도 공통으로 쓸 애들

10. views : jsp 파일

11. web.xml : 톰켓이 서버 실행할 때 가장 먼저 읽는 파일, 서블릿 등록, 필터 등록

12. pom.xml 

 

 

■ 기본 파일 살펴보기(web.xml, servelt-context, HomeController)

web.xml

톰켓 구동

 톰켓에서 내가 만든 웹 애플리케이션  web.xml 참고해서 구동시킴

→ 웹 애플리케이션이 올라가고 내려가는게 이벤트라서

이벤트 리스너 ContextLoaderListener 실행되고

→ 이게 실행되면 루트 애플리케이션 컨텍스트 생성

 

- context-param

ContextLoaderListener에서 Root WebApplicationContext를 생성하기 위한 설정 파일의 경로 지정

 

- listener - ContextLoaderListener
웹 애플리케이션의 시작, 종료 이벤트에 대한 이벤트 리스너이다.
웹 애플리케이션 구동 시 루트 애플리케이션 컨텍스트를 생성하고 
웹 애플리케이션 종료 시 루트 애플리케이션 컨텍스트를 소멸한다.

=> 위에 설정한 파일 읽어서 필요한 빈들 만듬

 

- DispatcherServlet

사용자의 요청을 받는 컨트롤러 서블릿

DispatcherServlet 서블릿 마다 독립적인 WebApplicationContext를 갖는다.

 

=> 따라서 해당 프로젝트가 실행되면 애플리케이션context가 총 2개임

ContextLoaderListener가 만든 root,

DispatcherServlet 가 만든 servlet

 

 

servelt-context

- <annotation-driven />, context:component-scan/>

HandlerMapping, Controller을 xml로 따로 안적고 어노테이션(태그) 사용하겠다는 뜻

빈은 되도록이면 어노테이션 기반으로 만들어야 함(코드 줄여서 에러 줄이게)

 

- <resources mapping="/resources/**" location="/resources/" />

모든 요청 디스패처서블릿이 받는데

URL "/resources/**" 오면 webapp의 resources가 처리하게 한다.

=> 자바스크립트 내려주거나, 이미지 내려주는 것들은 디스패처서블릿 통해서 요청 처리할 필요 없음. 

이렇게 오는 요청은 디스패처 서블릿 말고 바로 폴더로 매핑해서 바로 동작해라

 

- ViewResolver 설정 : URL로 요청온거 실제 뷰 이름으로 반환

이거는 왜 있냐면, 실제로 view를 jsp말고 다른거로도 만들수가 있어

그럴 때 매번 실제 이름을 반환하면 .jsp 를 다른거로 다 바꿔야하는데

이거 이용하면 여기만 수정하면 되니까 확장성이 높아짐

 

 

HomeController.java

localhost:80080/mvc/ 

로컬호스트의 8080포트에 있는 톰켓에서 우리가 만든 프로젝트를 찾아가기 위한 경로

context-path : 애플리케이션을 찾아가는 경로

/ : web root

스프링에서는 / (슬래시)를 요청 받아서 홈컨트롤러로 이동시킨다.

 

 

 

■ 컨드롤러 생성

1. 클래스 이름 위에 @Controller

- 컨트롤러 역할하는 빈으로 등록 

 * 빈 : 스프링에서 관리할 객체(애플리케이션 컨텍스트에서 관리하는 객체)

 

2. 맵핑

- URL과 컨트롤러의 메소드(프로그램) 연결

@RequestMapping(value = "/login",  method = {RequestMethod.POST})
@GetMapping("/login")
@PostMapping("/login")

 

 

■ 요청으로 넘겨준 파라미터를 컨트롤러가 받는 방법

 - URL :  /login/?id=aaa&pwd=123 으로 요청 시 컨트롤러가 aaa, 123 등 받기

 

1. @RequestParam 어노테이션

- 매개변수의 이름과 파라미터의 name 속성의 값이 동일하면 @RequestParam 어노테이션을 생략할 수 있다.
(생략 시 defaultValue 설정이 불가능하다.)

 

2. @PathVariable 어노테이션

- URL 패스상에 있는 특정 값을 가져오기 위해 사용하는 방법

ex. /login/?id=aaa&pwd=123 여기서 login이라는 문자열을 가지고 오고 싶을 때 사용

 

3. @ModelAttribute 어노테이션

- 요청 파라미터가 많은 경우 객체 타입으로 파라미터를 넘겨받는 방법이다.
- 단, 기본 생성자와 Setter가 존재해야 한다.
- @ModelAttribute 어노테이션을 생략해도 객체로 매핑된다.

 

@Slf4j // 롬복 라이브러리 이용해서 log 변수 쓰기
@Controller // 컨트롤러 등록
public class MemberController {

    @RequestMapping(value="/login", method = {RequestMethod.POST})
    public String login(@RequestParam("id") String id, 
                        @RequestParam("password") String password){
        System.out.println(member);
        return "home"; // 리턴값은 뷰의 이름
    }

    @GetMapping("/member/{id}")
    public String findMember(@PathVariable("id") String id) {
        log.info("findMember() - 호출 : {}", id);
        return "home";
    }

    @PostMapping("/login") // URL과 메소드 연결
    public String login(@ModelAttribute Member member) {
        System.out.println(member);
        return "home";
    }
    
}

 

 

 

■ jsp 파일 수정

<%@ page session="false" %> 지우고 (로그인하려면 세션 사용해야함)

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> 작성

 

pageEncoding : JSP 페이지에 대한 인코딩

contentType 차이점 : 서블릿으로 변환해서 클라이언트한테 전달 되어 넘어오는 페이지를 브라우저에서 인코딩 하는 것

 

 

댓글