본문 바로가기
  • 일하면서 배운 내용 끄적이는 블로그
Spring

Model & ModelAttribute & RequestParam & PathVariable

by dhl7799 2024. 3. 7.

Model

백엔드 - > 프론트로 데이터를 전달할때 사용한다.

@RequestMapping("/main")
	public String main(Model model) {
		System.out.println("메인페이지로");
		
		ObjectMapper objectMapper = new ObjectMapper();
        
		int ranNum = 1321232131;
		
		List<PromotionVo> objectlist = promotionservice.selectAllPromotion();
		
		String list = null;
		
		try {
			
			list = objectMapper.writeValueAsString(objectlist);
			
		} catch (JsonProcessingException e) {
			
			e.printStackTrace();
			
		}

		model.addAttribute("list", list);
		model.addAttribute("ranNum",ranNum);
		model.addAttribute("volist", objectlist);
		
		return "/main/mainPage";
	}

 

Model 객체에 addAttribute를 활용하여 key-value 형태로 전달할 데이터를 담아 전달 가능하다.

일반적인 변수는 코드의 ranNum처럼 그대로 담아도 잘 동작하지만

객체는 ObjectMapper를 사용해서 변환해주지 않으면 Vo를 인식 못해서 에러가 뜬다

 

<script>
	var ranNum = ${ranNum};
	console.log(ranNum);
	var promotionListJson = ${list};
	console.log(promotionListJson);
	console.log(promotionListJson[0]);
	console.log(promotionListJson[0].id);
</script>

 

프론트에서 받을땐 ${ }안에 앞에서 설정한 key값을 넣어서 찾으면 되는데

${ }로 받으면 배열로 인식해주고

'${ }'로 받으면 JSON으로 인식한다

"${ }"는 에러가 뜬다

 

<script>
	var promotionListJson = ${list};
</script>

 

js 코드중에 Model에 넣은 변수를 전달받는 부분은 js파일에 선언하면 에러가 뜬다

해당부분은 무조건 jsp파일 안에 넣어야함

이후 변수를 저장한 var를 js파일 안에서 사용하는것은 문제 없음

 

마지막으로 html 코드 내에서 el을 사용하여 model로 전달받은 값을 사용할때는 아래와 같다

<c:forEach items="${volist}" var="vo">
	<p>${vo.id}</p>
	<p>${vo.product_id}</p>
</c:forEach>

 

이번엔 또 '${ }'와 "${ }"는 가능하지만 그냥 ${ }는 에러가 뜬다

 

ModelAttribute & RequestParam

둘다 반대로 프론트 -> 백엔드로 데이터를 전달할때 사용한다

 

프론트는 차이가 없다

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Add Product</title>
</head>
<body>

<h1>Add Product</h1>

<form action="${pageContext.request.contextPath}/products/add" method="post">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name" required><br>
    
    <label for="price">Price:</label>
    <input type="number" id="price" name="price" required><br>
    
    <button type="submit">Add Product</button>
</form>

</body>
</html>

 

ModelAttribute - 데이터 여러개를 묶어서, 하나의 객체로 매핑시켜줌 따라서 한번에 여러 데이터를 받을때 사용

form 태그를 사용하여 한번에 데이터를 보낼때 같은 경우

@Controller
@RequestMapping("/products")
public class ProductController {

    @GetMapping("/add")
    public String showProductForm(Model model) {
        model.addAttribute("product", new Product());
        return "addProduct";
    }

    @PostMapping("/add")
    public String addProduct(@ModelAttribute("product") Product product) {
        System.out.println("Added product: " + product.getName());
        return "redirect:/products/add";
    }
}

 

RequestParam - 데이터를 하나씩 받을때 사용한다. 주로 url를 이용하여 데이터를 받는데 사용한다

/products/view?id=123

한번에 여러 데이터를 받을수도 있다

/products/view?id=123&name=Product%20Name&price=99.99

(여기서 Product%20Name은 Product와 Name 사이 띄어쓰기같은 느낌이다. Product Name)

마찬가지로 form 형태로 데이터를 전달받을 수도 있다. 

@Controller
@RequestMapping("/products")
public class ProductController {

    @PostMapping("/add")
    public String addProduct(
            @RequestParam("name") String name,
            @RequestParam("price") double price,
            Model model) {

        System.out.println("Name: " + name);
        System.out.println("Price: " + price);
        
        model.addAttribute("name", name);
        model.addAttribute("price", price);

        return "viewProduct";
    }
}

 

RequestParam vs PathVariable

RequestParam과 PathVariable은 비슷한데 조금 다르다.

url 형태가 조금 다르고, Java코드 부분에서도 차이가 있다.

 

RequestParam의 경우 위에서 본것처럼 사용하면 되는데

GetMapping시에도 따로 url에 변수를 넣을 필요가 없다

RequestParam의 url은 /add?id=123 의 형태이다

@GetMapping("/add")
public String showProductForm(@RequestParam(name = "id", required = false) Long id, Model model) {
    model.addAttribute("product", new Product(id));
    return "addProduct";
}

 

반면 PathVariable의 경우 url에 변수를 넣어주어야 한다

PathVariable의 url은 /add/123 형태이다.

말그대로 경로 그자체

@GetMapping("/add/{id}")
public String showProductForm(@PathVariable("id") Long id, Model model) {
    model.addAttribute("product", new Product(id));
    return "addProduct";
}

'Spring' 카테고리의 다른 글

@Qualifier  (0) 2024.03.13
@Configuration, @PropertySource 어노테이션  (0) 2024.03.13
DTO, DAO, ConnectionPool, DataSource  (0) 2024.02.28
Spring Framework 기본개념  (0) 2024.02.28