[Spring] 용어 및 주요 어노테이션

형이·2023년 9월 20일

Spring

목록 보기
3/21
post-thumbnail

📝 Spring

🖥️ 1. DispatcherServlet

  • 스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어 있다.
  • 스프링 MVC의 프론트 컨트롤러가 바로 디스패처 서블릿이다.
  • 그리고 이 디스패처 서블릿이 바로 스프링 MVC의 핵심이다.
  • DispatcherServlet도 부모 클래스에서 httpServlet을 상속 받아서 사용하고, 서블릿으로 동작한다.
  • DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet

🖥️ 2. 프레임워크 흐름

  • 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
  • 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
  • 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
  • viewResolver 호출 : 뷰 리졸버를 찾고 실행한다.
  • view 반환 : 뷰 리졸버는 뷰의 논리이름을 물리이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. (forward, redirect / 기본방식 : forward)

🖥️ 3. Model이란?

  • Controller에서 데이터를 Model에 담는다. view는 Model에 담겨있는 데이터만 쏙쏙 골라서 화면에 바이딩 해준다.
  • Model 객체는 컨트롤러에서 데이터를 생성해 이를 JSP, HTML 즉, view단에 전달하는 역할을 한다.
  • HashMap 형태를 갖고 있고, 키(key)와 밸류(value) 값을 저장한다. request.setAttribute(...)과 비슷한 역할을 한다.

3-1. ModelAndView

  • model에서 view 영역이 좀 더 확장
  • model과 view를 동시에 설정이 가능한 컨트롤러는 Model과 view가 모두 리턴 가능

3-2. Model vs ModelAndView

  • 데이터만 저장한다 vs 데이터와 이동하고자 하는 viewPage를 같이 저장한다.

🖥️ 4. 계층 구조

  • 컨트롤러 : 웹 MVC의 컨트롤러 역할
  • 서비스 : 핵심 비지니스 로직 구현
  • 레파지토리 : 데이터베이스에 접근
  • 도메인 : 비지니스 도메인 객체, 예) 회원가입 도메인, 주문 도메인, 쿠폰 도메인 등등

🖥️ 5. Spring 주요 어노테이션

@Controller

 ✔️ Controller 역할을 하는 class에 붙여준다.

 ✔️ Controller에서 mapping url을 찾는다.

@GetMapping / @PostMapping

 ✔️ get 방식의 요청과 post 방식의 요청

@RequestParam("name")

 ✔️ request.getParameter("name")과 같은 의미

📝 예제

[HelloController.java]

/*
 * @Controller : Controller 역할을 하는 class에 붙여준다.
 *               Controller에서 mapping url을 찾는다.
 *               현재 : localhost:9090/hello
 */
@Controller
public class HelloController {
	
	/*
	 * @GetMapping : get 방식의 요청 
	 */
	@GetMapping("/hello")
	public String hello(Model model) {
		System.out.println("hello 도착");
		model.addAttribute("data", "hello!!!");
		return "hello"; // hello.html 화면을 찾아서 return
		/*
		 * 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버(viewRewolver)가 화면을 찾아서 처리
		 *  - 스프링 부트 템플릿엔진 기본 viewName 매핑
		 *  - resources : templates/ + {viewName} + .html
		 */
	}
}
[hello.html]

<!DOCTYPE html>
// 타임리프를 사용하기 위해 넣어줘야하는 태그
<html xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p th:text="'안녕하세요. ' + ${data}">안녕하세요. 손님</p>
</body>
</html>

[HelloController.java]


@Controller
public class HelloController {

	/*
	 * @RequestParam("name")
	 *  - request.getParameter("name")
	 * 
	 * **옵션**
	 * required : 파라미터 값 필수 여부, true = 필수 (default) / false = 필수 아님
	 * defaultValue : 파라미터 값이 없을 경우 기본으로 들어갈 값
	 * 
	 */
	// http://localhost:9090/hello-mvc?name=Spring
	@GetMapping("/hello-mvc")
	public String helloMvc(@RequestParam(value = "name", required = false,
    				defaultValue = "required test") String username, Model model) {
		model.addAttribute("modelvalue", username);
		return "hello-template";
		
	}
}
[hello-template.html]

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p th:text="'hello not empty ' + ${modelvalue}">empty!!</p>
</body>
</html>

0개의 댓글