Spring Boot

[Spring Boot] 참조 변수

웹코린이 2023. 9. 14. 14:47
728x90

 

참조 변수

프로그래밍에서 변수가 다른 변수나 데이터 구조에 대한 참조를 가지고 있는 변수를 말함

 

 

 

 

참조 변수의 특징

  1. OOP(객체 지향 프로그래밍) 에서 특히 JAVA에서 좋아하는 기법
  2. return 값이 2개 이상이 불가능하기 때문에 발달한 기법 (즉, 객체로 저장해서 return 값을 보낸다는 뜻)

 

 

 

 

실습

@RequestMapping("/test")
public String test(VO vo, Model model) {
	System.out.println("vo : " + vo);
	model.addAttribute("apple", vo.getId());
	return "test";
}

 

 

Q. 자바에서 파라미터로 사용하는 변수를 보통 '지역변수'라고 하는데 그럼 Model 객체도 지역변수니까 메소드가 종료되면 사라지지 않나요 ? 그니까 위의 코드를 아래와 같이 커맨드 객체인 Model을 삭제하면 View에서 사용할 수 없지 않나요 ? 

 

CTRL.java

@RequestMapping("/test")
public String test(VO vo) {
	System.out.println("vo : " + vo);
	return "test";
}

일반적으로 Controller에서 View로 이동할 때 Model 객체(대부분)를 활용하여 데이터를 전달한다

하지만 Model 객체를 삭제해도 값의 전달은 가능하다 그 이유는 스프링 컨테이너가 'new' 해준 객체가 커맨드 객체이기 때문에 개발자가 객체를 관리하는 것이 아닌 컨테이너가 객체를 대신 관리해주게 된다 이것을 '참조 변수'라고 한다

따라서 Model 객체 없이도 View에서 값을 사용할 수 있게 된다

 

 또한, View에서 객체명을 지정하여 사용하고 싶다면 Controller에서 @ModelAttribute 를 통해 이름을 지정하여 해당 이름으로 View에서도 값을 사용할 수 있다

 

CTRL.java

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

 

아래는 @ModelAttribute 를 사용했을 때의 jsp와 사용하지 않았을 때의 jsp 코드이다

VO.java의 멤버변수로는 id, name 두가지의 종류가 있다

 

 

@ModelAttribute를 사용하지 않았을 때

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>커맨드 객체를 사용하여 model 활용하지 않고 값 출력하기</title>
</head>
<body>
    <h1>${ vo.id } | ${ vo.name }</h1>

</body>
</html>

 

 

 

@ModelAttribute 를 사용했을 때 (해당 이름을 'a' 로 작성함)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>커맨드 객체를 사용하여 model 활용하지 않고 값 출력하기</title>
</head>
<body>
    <h1>${ a.id } | ${ a.name }</h1>

</body>
</html>

 

 

 

코드 시연

해당 값들이 잘 넘어오는 것을 확인할 수 있다

728x90