Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

우당탕탕 개발일지

SpringBoot - MVC 본문

Spring

SpringBoot - MVC

YUDENG 2023. 6. 16. 17:29

스프링 부트의 웹 애플리케이션은 'MVC 아키텍처'라고 하는 개념을 기반으로 설계돼 있다. 애플리케이션을 Model, View, Controller라는 역할로 나누어 구축해가는 방식이다.

 

  • Model(모델) - 애플리케이션에서 사용할 데이터를 관리한다.
  • View(뷰) - 실제로 사용자가 보는 화면을 만든다.
  • Controller(컨트롤러) - 전체 처리를 제어한다.

 

Model

템플릿에서 사용할 데이터들을 일괄해서 관리한다. 데이터 관리가 주 목적이기에 뷰 관련 정보는 가지고 있지 않다. 따라서 Model을 반환값으로 사용할 수는 없다.

 

< ModelAttribute >

@ModelAttribute 애노테이션은 컨트롤러 메서드의 매개변수에 사용하여 요청의 데이터를 객체로 바인딩하는 역할을 한다. 요청한 파라미터를 자동으로 해당 객체의 필드와 매핑하여 객체를 생성하고 초기화하기에 컨트롤러 메서드에서 사용할 수 있게 된다. 주로 HTML 폼의 데이터를 객체로 바인딩하거나, JSON 요청의 데이터를 객체로 변환하는 데 사용된다. 

 

 

ModelAndView

템플릿에서 사용할 데이터들과 뷰관련 정보를 일괄해서 관리한다. 뷰 관련 정보를 가지고 있어서 ModelAndView를 그대로 반환값으로 사용할 수 있으며 이를 통해 설정한 템플릿도 사용할 수 있다.

 

< addObject >

addObject() - model.addObject(이름, 값)

첫 번째 인수에는 저장할 값의 이름, 두 번째 인수에는 저장할 값을 지정한다. 지정한 이름으로 값이 저장된다.

 

 

< SprinBootApplication >

@SpringBootApplication 애노테이션이 클래스가 스프링 부트의 애플리케이션 클래스라는 것을 나타낸다. 

스프링 MVC에는 컴포넌트 스캔 기능이 있다. 설정 파일 등을 준비하지 않아도 애노테이션만 정의해두면 프로그램에서 사용하는 컴포넌트 전체를 자동으로 적용해서 사용할 수 있게 해주는 기능이다.

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringPosApplication.class, args);
	}

}

< Request 이동 경로 >

1) 클라이언트의 요청이 들어오면 DispatcherServlet으로 도착한다.

2) Handler Mapping이 컨트롤러를 검색한다.

3) 찾은 컨트롤러에 해당하는 메서드를 HandlerAdapter가 URI를 기준으로 찾는다.

4) 컨트롤러는 Service >> DAO >> DataBase에 접근해서 데이터를 가져온다.

 

 

< RequestMapping >

@RequestMapping 애노테이션 서버의 URL과 특정 처리를 연동시키는 구조다. 메서드마다 @RequestMapping(주소) 연동해놓고, 서버로 요청이 온 경우 해당 주소에 할당돼 있는 메서드가 자동으로 실행되는 것이다.

 

@RequestMapping의 인수는 value="/" 형식으로 작성해야 한다. 하지만 인수에 value만 있는 경우는 value를 생략하고 값만 지정할 수도 있다. value="/"에 매핑되는 메서드가 하나는 GET 접속 시 사용하는 것이고 다른 하나는 POST 전송시 사용되는 것이다. 

 

@RequestMapping은 method를 생략하면 GET 방식과 POST 방식을 모두 처리해준다. 그러나 GET 방식의 요청을 받았다면 POST 방식의 요청은 다른 url을 써야한다. 전송 방식을 명시하면 url을 경제적으로 사용할 수 있다.

@GetMapping과 @PostMapping을 사용하면 하나의 url로도 두 개 이상의 매핑을 처리할 수 있다.

 

 

< GetMapping, PostMapping >

버튼이나 링크를 매핑할 때, @GetMapping이나 @PostMapping 애노테이션에 params 인자를 사용하여 요청을 제어할 수 있다. params 인자는 name=value 형식으로 쿼리 파라미터의 이름과 값으로 조합을 지정한다.

 

 

< PathVariable >

URL의 쿼리 스트링 부분에 지정한 값을 추출해서 사용하는 기능이다.

@RequestMapping("/{값}")으로 사용을 하며, {값} 부분이 매개변수이다.

@RequestMapping("/{studentId}/{name}")
public String getStudent(@PathVariable String studentId, @PathVariable String name, Model model)

"/"라는 주소 뒤에 있는 특정 값을 studentId, name이라는 변수로 받으라는 의미이다.

 

 

- login.jsp

<body>
	<form action="/login" method="post">
		<input type="text" name="userId" value="${userAuthRequest.userId}"/>
		<input type="text" name="password" value="${userAuthRequest.password}"/>
        <button type="submit" name="onLogin" value="UserAuthRequest">
            로그인
        </button>
    </form>
<body>

<form action="/" method="post"> 형태로 폼을 설정하고 있다. 전송 대상은 "/login"이고 POST 방식을 사용하고 있다.

<input type="text"> 태그에서는 $value 값을 입력 필드에 표시하고 있다.

 

- UserAuthController.java

@Controller
public class MemberController {
	@Autowired
	private UserAuthService userAuthService;	
	
	@RequestMapping(value="/login", method=RequestMethod.GET)
	public ModelAndView login(ModelAndView mav) {
		mav.setViewName("login");
		return mav;
	}
	
	@RequestMapping(value="/login", method=RequestMethod.POST)
	public ModelAndView handleLogin(@RequestParam UserAuthRequest req, ModelAndView mav) {
		
		try {
			Member member = userAuthService.login(req);
			mav.addObject("User", member);
			mav.setViewName("main");
		} catch (Exception e) {
			mav.addObject("msg", e);
			mav.setViewName("login");
		}		
		return mav;
	}
}

 

 

728x90

'Spring' 카테고리의 다른 글

[Spring] Swagger - API 명세서 작성  (1) 2024.09.15
JWT 서비스  (0) 2024.07.11
JPA - 데이터 모델링  (0) 2024.05.20
AWS Cognito를 활용한 회원가입  (0) 2024.05.20