백엔드/Spring Boot

46 - Spring Boot

두개의 문 2023. 7. 4. 21:40

( 이전 시간 복습 )

프로젝트 생성 후, 설정과 출력까지 

 

1. Spring Starter Project 생성

   - 하단에서 import , Project Package 창에서 생성한 프로젝트 확인 가능 

 

 - ‘src/main/java’에서 생성된 패키지 내 ‘Artifact + Application’이라는 이름의 클래스가 생성되어 있음 

   • @SpringBootApplication 어노테이션 : 스프링 부트의 가장 기본적인 설정을 선언해줌 

   스프링부트는 main 메소드가 선언된 클래스를 기준으로 실행됨 

 

 

 

2. build.gradle 설정 → Snippet 이용 

 - 'org.springframework.boot:spring-boot-starter-tomcat' : War 패키징 방식을 가능하게 해주는 라이브러리 

 

 

3. External Libraries에서 아래 라이브러리가 추가되었는지 확인 

 - tomcat-embed-jasper-9.0.76.jar

 - jakarta.servlet.jsp.jstl-2.0.0.jar

 - tomcat-embed-websocket-9.0.76.jar

 - tomcat-embed-core-9.0.76.jar

 - tomcat-embed-el-9.0.76.jar 

 

4. application.properties : 전역 설정 ( = 공통 설정 )

     → src/main/resources 폴더 내에 존재 

 

  - application.properties에서 서버 스프링 설정 

   경로 입력 시, 폴더를 의미할 경우 폴더명 뒤에 ‘/‘를 붙임

                          파일을 의미할 경우 파일명으로 끝남 

 설정파일 내에서는 의미없는 공백 추가하지 않도록 주의하기 

 

 

5. view , JSP 파일이 위치하는 폴더 생성시키기 

 - src/main 폴더 아래에 webapp/WEB-INF/view 폴더 생성 후, view 폴더에 index.jsp 파일 생성 

 

 

 - index.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>안녕하세요! </h1>
	<h2>안녕하세요! </h2>
	<h3>안녕하세요! </h3>
	<h4>안녕하세요! </h4>
	<h5>안녕하세요! </h5>
	<h6>안녕하세요! </h6>
</body>
</html>

 

 

6. Run As - Spring Boot App 실행 

 - 파일 단위로 실행되지 않음

 - 항상 프로젝트에서 실행 

 - 전체 프로젝트에서 한 프로젝트만 실행 가능 ( 동시에 불가능 : 80번 포트를 이미 사용하고 있기 때문 )

 

 - 상단바에서 

    ① STOP : 현재 실행 중인 프로젝트 중지 

    ② 정지버튼 + 화살표 : 여러 프로젝트 실행 중일 때, 클릭하면 현재 실행 중인 리스트가 뜸 

 

 - Boot Dashboard 

  ①  : 현재 중지한 프로젝트 

  ② ⬆︎ : 현재 실행중인 프로젝트 

 

 

브라우저 실행 : localhost 호출 → index.jsp 화면에 출력됨 

 

- index.jsp 파일 수정 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	for ( int i = 0 ; i < 5; i++ ) {	
		out.println("<hr>");
	}
%>
	<h1>안녕하세요! </h1>
	<h2>안녕하세요! </h2>
	<h3>안녕하세요! </h3>
	<h4>안녕하세요! </h4>
	<h5>안녕하세요! </h5>
	<h6>안녕하세요! </h6>
</body>
</html>

 

저장 , 페이지에서 새로고침하면 바로 수정된 화면 출력됨 

 

 

 


▷ sub1.jsp 파일 생성 

 - stringBootStr 변수에 “스프링 부트”를 저장한 후, 출력하기 

 - 출력 결과는 out.println( )을 이용하기 

   • h1 ~ h6 : 어서오세요 스프링부트입니다.

   • h6 ~ h1 : 스프링부트는 어렵지 않습니다. 

 


( 복습 )


- 서버창에 ‘localhost/sub1’을 요청 시, 아래와 같이 Whitelabel Error Page가 뜸 

   ⇒ 현재 jsp 파일이 ’WEB-INF’ 폴더 내에 존재하므로, 외부에서 접근 불가

        Controller 통해 jsp파일로 접근할 있도록 해야  

 

▷ Controller 생성 

 :  매핑을 통해 Controller가 특정 View를 사용자에게 반환하도록 만들어보자 

   • @Controller 어노테이션을 이용해 해당 클래스가 Controller임을 알려줌 

   • @GetMapping(“/sub1”) 어노테이션을 이용

      이는 서버 주소창에 ‘localhost/sub1’ 같이 Get방식으로 요청이 들어오면, 아래의 메서드를 실행하라는 의미 

 

package apple.orange;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="myServlet", urlPatterns="/my")
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		System.out.println("MyServlet.doGet()...");
		System.out.println("request := " + req);
		System.out.println("response := " + res);
		
		String msg = req.getParameter("msg");
		System.out.println("쿼리 문자열 msg = " + msg );
		
		res.setContentType("text/html;charset=utf-8");
		res.setCharacterEncoding("utf-8");
		
		String printMsg ="""
				<h1>#1 </h1>
				<h2>#1 </h2>
				<h3>#1 </h3>
				<h4>#1 </h4>
				<h5>#1 </h5>
				<h6>#1 </h6>
				""".replace("#1", msg);
		// 반복을 해야할 경우, # placeholder를 이용해 마크 표시(#1)
		// replace( 마크, 대체할 문자열 ) : 이 마크를 찾아 문자열로 대체함 
		
		// 응답객체의 값을 요청 웹 브라우저로 보내야 함 
		// 네트워크가 연결되면 하나의 입출력흐름이 됨 
		// 먼저 응답객체의 문자열 출력 스트림(PrintWriter)을 가져옴 : getWriter()
		// 출력스트림이 연결되었으면 출력 시작 : write()
		res.getWriter().write(printMsg);
			
	}
}

 

 

 

 - @ResponseBody

 • 서버에서 클라이언트로 응답 데이터를 전송하기 위해 @ResponseBody 어노테이션을 사용 

    자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송함 

 

 

 


스프링부트로 정적파일 처리하기 

  - ‘src/main/resources/static’ 아래와 같이 폴더 파일 생성 

     → images 폴더 내에 이미지 파일 넣기 

 

 - sub.html 이미지 태그를 이용해 images 폴더 내에 있는 이미지를 불러옴 

 

- index.html (확장자가 파일에 해당) → 톰캣의 일부 기능인 서버가 동작함 

 

 

서블릿 생성 - MyServlet

package apple.orange;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="myServlet", urlPatterns="/my")
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		System.out.println("MyServlet.doGet()...");
		System.out.println("request := " + req);
		System.out.println("response := " + res);
		
		String msg = req.getParameter("msg");
		System.out.println("쿼리 문자열 msg = " + msg );
		
		res.setContentType("text/html;charset=utf-8");
		res.setCharacterEncoding("utf-8");
		
		String printMsg ="""
				<h1>#1 </h1>
				<h2>#1 </h2>
				<h3>#1 </h3>
				<h4>#1 </h4>
				<h5>#1 </h5>
				<h6>#1 </h6>
				""".replace("#1", msg);
		// 반복을 해야할 경우, # placeholder를 이용해 마크 표시(#1)
		// replace( 마크, 대체할 문자열 ) : 이 마크를 찾아 문자열로 대체함 
		
		// 응답객체의 값을 요청 웹 브라우저로 보내야 함 
		// 네트워크가 연결되면 하나의 입출력흐름이 됨 
		// 먼저 응답객체의 문자열 출력 스트림(PrintWriter)을 가져옴 : getWriter()
		// 출력스트림이 연결되었으면 출력 시작 : write()
		res.getWriter().write(printMsg);
			
	}
}

 

 

 

 

 - 콘솔창에서 clear , 서버에서 새로고침한 결과

   : msg가 null값이므로 NPE예외 발생 

 

 - 서버창에 Get방식으로 msg 값을 전달해 요청해보자 


 - 아래와 같은 화면 출력