프로그래밍

[SpringBoot] day88 : 스프링부트 방식으로 MVC 구현(값 주고 받기) 본문

자바/Spring Boot

[SpringBoot] day88 : 스프링부트 방식으로 MVC 구현(값 주고 받기)

시케 2023. 9. 14. 17:10
728x90
반응형

2023.09.14.목

스프링부트 방식으로 MVC 구현(값 주고 받기)

스프링부트 방식으로 값을 주고 받는 기본적인 MVC 구조를 구현해보자

우선 Lombok, JSP 컴파일러, JSTL 라이브러리 등을 추가해주었다

 

2023.09.13 - [환경설정] - [Spring Boot] 스프링부트 설치 및 초기 설정

 

[Spring Boot] 스프링부트 설치 및 초기 설정

2023.09.13.수 스프링부트 초기 설정 2023.09.13 - [Spring Boot] - [SpringBoot] 스프링 VS 스프링부트(Spring VS SpringBoot) [SpringBoot] 스프링 VS 스프링부트(Spring VS SpringBoot) 2023.09.13.수 스프링 VS 스프링부트 스프링

dev-9rm.tistory.com

2023.09.14 - [환경설정] - [Spring Boot] 스프링부트 롬복(Lombok)설치 및 초기 설정

 

[Spring Boot] 스프링부트 롬복(Lombok)설치 및 초기 설정

2023.09.14.목 롬복(Lombok) Lombok(롬복)은 Java 라이브러리로 반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리이다 자바 클래스에서 VO getter setter toString equals

dev-9rm.tistory.com

 

파일구조

위와 같이 파일이 구성되어 있다

 

Controller

@Controller
public class CTRL {
	@RequestMapping("/") //루트 요청
	public @ResponseBody String root() { // ViewResolver가 동작하지 않고 단순 문자열 값을 리턴
		return "루트요청";
	}
}

기본적인 루트 요청시 @ResponseBody 어노테이션 설정을 활용하여

ViewResolver를 작동시키지 않고 리턴 String 값이 경로가 아닌 단순 문자열 값임을 알려줌

 

@RequestMapping("/test")
public String test(VO vo, Model model) { //커맨드객체 방식
	System.out.println("vo: "+vo);
	model.addAttribute("apple",vo.getId());	
		
	return "test"; // WEB-INF/views/test.jsp
}

가장 기본적으로 많이 써왔던 커맨드객체 방식이다

ViewResolver 설정을 마쳤기 때문에 해당 리턴의 경로로 이동하게 된다

 

@RequestMapping("/test2")
public String test(@ModelAttribute("ari")VO vo) {
	System.out.println("vo: "+vo);

	return "test2"; // WEB-INF/views/test2.jsp
}

일반적으로는 model 객체를 활용하여 데이터를 전달한다

커맨드 객체를 사용가능한 상태이기 때문에

커맨드객체명.xxx 형태로도 사용이 가능하다

이 경우에는 커맨드객체명을 View에서 알고 있어야 하는데

해당 이름을 @ModelAttribute을 통해 이름을 지정할 수 있다

 

★Q. 자바에서는 파라미터로 사용하는 변수는 보통 "지역변수"
지역변수는 메서드가 종료되는 사라지지 않나요?

메서드 종료되었는데 어떻게 뷰에서 사용할 수 있어요???
더보기

=> 일반 "지역변수" (특히 int String)는 메서드 종료시 소멸
=> 지금 사용하는 커맨드변수는 지역변수가 아님
=> 커맨드 변수는 지역변수
=> 컨테이너가 new 해준 IoC 객체 == 커맨드 객체
컨테이너 메모리에 저장된 객체
"참조변수" call by reference ★
OOP (특히 자바)에서 좋아하는 기법
return 2개 이상이 불가능하기 때문에 발달한 기법

 

∴  Q. 커맨드 객체를 어떻게 V에서 사용할 수 있나요?

컨테이너가 IoC 해준(개발자 대신 new 해준) 객체라서 참조변수 입니다
OOP인 JAVA에서 좋아하는 기법입니다

 

2023.05.09 - [자바/자바 기초] - [자바 기초] day05 : 함수의 인자

 

[자바 기초] day05 : 함수의 인자

2023.05.09.화 함수의 인자 함수를 호출할 때 인자로 배열을 쓰는 경우 참조에 의한 호출이 발생한다 이때 배열 값을 반환하지 않더라도 함수 인자에 배열의 주소 값이 전달되었기 때문에 힙 메모

dev-9rm.tistory.com

call by reference (참조에 의한 호출) 예제 설명 포함

// request 활용 방식
@RequestMapping("/test01")
public String test01(HttpServletRequest request, Model model) {

	VO vo = new VO();
	vo.setId(request.getParameter("id"));
	System.out.println("test01 vo: "+vo);
		
	// model.addAttribute("apple",request.getParameter("id"));	
	model.addAttribute("apple",vo.getId());	
		
	return "test";
}

request 자체가 NOT POJO인 Servlet 객체이기 때문에 활용도가 낮다

 

// @RequestParam 활용한 방식
@RequestMapping("/test02")
public String test02(@RequestParam("id")String id, @RequestParam("name")String name, Model model) {
	model.addAttribute("apple", id);
		
	return "test";
}

커맨드 객체를 활용한 방식보다 성능적으로 부족하진 않지만

인자의 수가 늘어나기 쉬워 가독성이 커맨드 객체를 사용할때보다 별로이다

단, 뷰랑 모델이 변수명등의 고민을 하지 않아도 된다는 장점이 있다

 

// 모든 값을 파라미터로 전달하는 방식 REST API(모바일에 따른 추세)
@RequestMapping("/test03/{id}/{name}")
public String test03(@PathVariable String id, @PathVariable String name, Model model) {
	model.addAttribute("apple", id);
	return "test";
}

URL(경로/PATH)에 데이터를 바로 보내는 형식이다

모바일에 따른 추세로 점점 늘어나고 있는 형식이다

REST API 방식에서 주로 채용하는 방식이다

 

View

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
   <head>
      <meta charset = "UTF-8">
      <title>롬복예제</title>
   </head>
   <body>
      	<h1>${apple}</h1>
   </body>
</html>

Model

import lombok.Data;

@Data
public class VO {
	private String id;
	private String name;

}
소스코드 보러가기

 

 

728x90
반응형
Comments