본문 바로가기

개발/Backend

[Spring Boot] 예제로 배우는 스프링부트 입문 | Web 기초

다양한 방법으로 파라미터를 받아 사용할 수 있는 방법을 알아보자 

build.gradle

  • spring-boot-starter-web : 스프링 MVC를 사용할 수 있도록함, RESTful API 구축
  • spring-boot-starter-tomcat: 톰캣 서버를 자동으로 실행시킴 

JSP 사용하기 

Java 기반 웹 애플리케이션을 개발할 때 서버 측에서 동적으로 HTML을 생성하는 데 사용되는 템플릿 엔진 중하나 

  • HTML괴 Java 코드를 혼합하여 작성 가능
  • JSP파일이 컴파일되어 서블릿으로 변환되고 클라이언트 요청을 처리하여 동적 웹 페이지를 생성하는 방식으로 동작

JSP를 사용하려면 설정이 필요함 

 

1. dependency  추가 

implementation 'jakarta.servlet:jakarta.servlet-api' //서블릿
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'//JSP에서 JST 사용
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' //JSP사용

 

2. application.properties 설정

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

3. 폴더구성

webapp >> webinf >> views >> 제시하는이름.jsp 

 

4. danmic web module 버전 고정하기

build.gradle의 다음 코드 추가 

eclipse.wtp.facet {
    // Change the version of the Dynamic Web Module facet
    facet name: 'jst.web', version: '5.0'
}

 

5. Mycontroller 작성

  • @ResponseBody는 순수하게 텍스트만 리턴
  • 나머지들은 jsp를 사용하기 위한 view-resolver가 [return값].jsp를 찾아 브라우저에 response로 보냄
package com.study.springboot;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyContoller
{
    @RequestMapping("/")
    public @ResponseBody String root() throws Exception{
        return "JSP in Gradle"; 
    }
 
    @RequestMapping("/test1")    // localhost:8081/test1
    public String test1() {
        return "test1";          // 실제 호출 될 /WEB-INF/views/test1.jsp       
    }
     
    @RequestMapping("/test2")    // localhost:8081/test2
    public String test2() {
        return "sub/test2";      // 실제 호출 될 /WEB-INF/views/sub/test2.jsp       
    }

}

 

Model 사용하기

URL 요청이 들어오면 변수의 정보를 담아서 JSP에서 그 변수의 내용을 사용하는 작업 

 

MyController

  • ModelAndView는 모델에 값도 넣어주고 뷰도 지정을 해야함 
package com.study.springboot;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyContoller
{
    @RequestMapping("/")
    public @ResponseBody String root() throws Exception{
        return "Model & View";
    }

    @RequestMapping("/test1")
    public String test1(Model model) {
    	// Model 객체를 이용해서, view로 Data 전달
    	// 데이터만 설정이 가능
        model.addAttribute("name", "홍길동"); //(key,name)

        return "test1";       
    }
     
    @RequestMapping("/mv")
    public ModelAndView test2() {
    	// 데이터와 뷰를 동시에 설정이 가능
        ModelAndView mv = new ModelAndView();
         
        List<String> list = new ArrayList<>();
         
        list.add("test1");
        list.add("test2");
        list.add("test3");
         
        mv.addObject("lists", list);      			 // jstl로 호출,(key,name)
        mv.addObject("ObjectTest", "테스트입니다."); // jstl로 호출
        mv.addObject("name", "홍길동");				 // jstl로 호출
        mv.setViewName("view/myView");
        
        return mv;                                     
    }

}

 

myView.jsp

  • EL표기법에 의한 key가 들어있음 
  • ${listls}에는 객체가 들어있어 JSTL의 for-each문을 통해 하나씩 꺼냄 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="jakarta.tags.core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
    out.println("Model(Sub) : Hello World");
%>
<br>
 
${ObjectTest}
 
<br>
 
${lists}
 
<br>
<br>
 
<c:forEach var="mylist" items="${lists}">
    ${mylist} <br>
</c:forEach>

<br>
<br>
당신의 이름은 ${name} 입니다.


</body>
</html>

 

실행결과 

  • 앞에 {test1, test2, test3}는 list객체의 내용을 출력한 것 
  • JSTL의 for-each문을 출력한것 

 

Form 사용하기 

홈데이터 등 파라미터를 전달받아 사용하는 코드를 작성해보자

 

Mycontroller.java

package com.study.springboot;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import jakarta.servlet.http.HttpServletRequest;

@Controller
public class MyContoller
{
    @RequestMapping("/")
    public @ResponseBody String root() throws Exception{
        return "Form 데이터 전달받아 사용하기";
    }
 
    @RequestMapping("/test1")
    public String test1(HttpServletRequest httpServletRequest, Model model) {
		
    	String id = httpServletRequest.getParameter("id");
		String name = httpServletRequest.getParameter("name");

		model.addAttribute("id", id);
        model.addAttribute("name", name);

        return "test1";       
    }

}
  • httpServletRequset로부터 getParemeter 방식으로 id,name파라미터의 내용을 변수에 할당함
  • 파라미터에서 값을 받아 모델에 넣어주고 model의 값을 jsp로 출력함 

 

실행을해보자 

localhost:8080/test1/?id=test1&name=홍길동

 

이렇게 JSP에서 사용하는 파라미터 방식 외에도 스프링부트에서는 다양한 방식을 사용할 수 있음

@RequestMapping("/test2")
    public String test2(@RequestParam("id") String id,
    		            @RequestParam("name") String name,
    		            Model model)
    {
    	// 파라미터가 많아지면 불편해진다.
		model.addAttribute("id", id);
        model.addAttribute("name", name);

        return "test2";       
    }

@RequsetParam 이용해서 id란 파라미터가 있으면 해당 변수에 넣어줌 

=> 불필요한 코드 중복을 줄일 수 있음 

 

test2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="jakarta.tags.core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    out.println("#02 : Hello World");
%>
<br>
당신의 아이디는 ${id} 입니다.<br>
당신의 이름은 ${name} 입니다.
 
</body>
</html>

 

결과

 

JSP의 Command객체 방법을 사용해보자

파라미터와 같은 이름을 멤버 변수로 가지는 클래스를 만들어 객체 타입으로 파라미터를 한번에 처리할 수 있음

 

Member.java

package com.study.springboot;

public class Member
{
	String id;
	String name;
	public String getId()
	{
		return id;
	}
	public void setId(String id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	
	
}
  • 자동으로 값이 들어가야 하기 떄문에 setter, getter필요 
@RequestMapping("/test3")
    public String test3(Member member, Model model)
    {
    	// 파라미터와 일치하는 빈을 만들어서 사용할 수 있다.
    	// View 페이지에서 model 을 사용하지 않고 member를 사용한다.
        return "test3";       
    }
  • test2에서 파라미터가 많아지면 불편한데 test3에서는 클래스 하나로 처리할 수 있어 편리
  • 모델을 사용하지 않고 JSP에서 command객체 안에 들어있는 값들을 바로 사용할 수 있음 

test3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="jakarta.tags.core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    out.println("#03 : Hello World");
%>
<br>
당신의 아이디는 ${member.id} 입니다.<br>
당신의 이름은 ${member.name} 입니다.
 
</body>
</html>

 

@PathVariable 사용하는 방법도 있음 

@RequestMapping("/test4/{studentId}/{name}")
	public String getStudent(@PathVariable String studentId,
		                     @PathVariable String name,
		                     Model model)
    {
		model.addAttribute("id", studentId);
		model.addAttribute("name", name);
		return "test4";
	}
  • 이름이 변수 값으로 위치값을 이용해서 파라미터의 값을 받아올 수 있음 
  • model에 값을 넣어줘서 사용

test4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="jakarta.tags.core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    out.println("#04 : Hello World");
%>
<br>
당신의 아이디는 ${id} 입니다.<br>
당신의 이름은 ${name} 입니다.
 
</body>
</html>

 

localhost:8080/test4/1/해리포터 실행

 

Lombok 사용하기 

lombok은 java클래스를 만들 떄 흔히 사용하는 코드들을 어노테이션을 이용해서 자동으로 만들어주는 라이브러리

  • vo, dto, command 객체 같은 모델에서 getter,setter메서드, 기본생성자, 파라미터를 가지는 생성자 등 

MyController.java

package com.study.springboot;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import jakarta.servlet.http.HttpServletRequest;

@Controller
public class MyContoller
{
    @RequestMapping("/")
    public @ResponseBody String root() throws Exception{
        return "Lombok 사용하기";
    }
 
    @RequestMapping("/test1")
    public String test1(Member member, Model model)
    {
    	System.out.println(member);
        return "test1";       
    }
}

 

test1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="jakarta.tags.core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    out.println("#01 : Hello World");
%>
<br>
당신의 아이디는 ${member.id} 입니다.<br>
당신의 이름은 ${member.name} 입니다.
 
</body>
</html>

 

Member.java

package com.study.springboot;

import lombok.Data;

@Data
public class Member
{
	String id;
	String name;
}

위에 command객체 예시에서 직접 만들었던 getter,setter,equals, canEqual(), hashCode, toString, 생성자가 lombok에 관련된 @Data 어노테이션으로 대체됨 

=> 규칙성을 가진 메서드이기 때문에 변수이름만 알면 자동으로 만들어줄 수 있음