본문 바로가기
코딩도전기/Spring Boot

Spring Boot

by 코도꼬마 2023. 5. 24.

Spring Boot

  • Spring을 편리하게 사용할 수 있는 도구
  • 복잡했던 Xml 설정이 상당 부분 사라지고 JAVA 코드로 작성하도록 변경됨
  • JSON(ajax data type) 통신을 위한 라이브러리 불필요
  • JSP를 기본으로 지원하지 않음
  • TOMCAT 설치 없이도 서비스 작동 가능(내장 TOMCAT 사용 but 사용자가 많아지면 다운)
  • 작성한 웹 서비스를 독립된 자바 프로그램(JAR) 으로도 만들 수 있음
    • war는 tomcat 설치 후 실행 가능
    • jar는 tomcat 설치 하지 않아도 실행 가능

 

Spring Boot
Xml로 설정 JAVA 파일로 설정
설정이 어렵고 복잡함 설정이 간단
JSP 기본 지원 JSP를 지원하지 않음(Time leaf 지원)
많은 프로젝트에 사용(정부/공기업) 신규 프로젝트에 사용
Spring I.O에서도 지원을 줄이고 있음 SPRING 차세대 Framework 로 부상하고 있음

 

 

Spring Boot Project 생성

  • New > Spring Starter Project 선택
  • 프로젝트 name 작성
  • Spring Boot Version 설정(2.7.12)
  • 라이브러리 사용 시 선택해서 추가

 

 

Spring Boot Project 실행

  • Spring처럼 Controller를 자동으로 만들어 주지 않음
  • @Controller 대신 @RestController를 사용하면 @ResponseBody를 사용하지 않아도 됨

  • Application.java : Spring의 기본적인 Bean 등록을 자동으로 해줌

 

  • application.properties : 기본설정 파일(Spring 사용 시 xml에서 했던 설정을 여기서 함)
# server port
server.port=80

# encoding
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

 

  • MainController
// @RestController : @Controller + @ResponseBody
// jsp 파일이 없어도 data를 view에 뿌려줌
// jsp 파일 추가하여 사용할 경우 @Controller로 사용해야함 
@RestController
public class MainController {
	
	@RequestMapping(value="/")
	public String main() {
		return "Hello, Spring Boot";
	}

}

 

 

 

Ajax Project

  • ajax를 사용한 Spring Boot Project

 

  • AjaxController
    • @RestController를 사용하면 @ResponseBody를 사용하지 않아도 됨
    • 본래 client 파일과 server의 파일이 서로 다른 도메인에 존재하면 보안상의 이유로 ajax 통신을 막음(보안성 낮음)
    • 이를 cross domain issue라고 부르며 @CrossOrigin을 사용하면 통신 허용됨
// CORS policy: No 'Access-Control-Allow-Origin'
// CORS : cross domain
// 기본적으로 view와 server는 같은 서버에 존재하나 현재는 html이 서버 안에 존재하지 않음
// 서버와 뷰가 다른 곳에 있는 경우 보안상의 이유로 통신을 막음
// 특정 method 위에 위치한 경우 해당 method 요청에 대해서만 적용
// @CrossOrigin(origins= {"허용 URL1","허용 URL2", ...}) : 허용되는 url 선택
@CrossOrigin // 모든 url 허용
@RestController
public class AjaxController {
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public HashMap<String, Object> main(){
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("msg", "Hello main Page");
		return map;
	}
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public HashMap<String, Object> list(){
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		ArrayList<String> list = new ArrayList<String>();
		list.add("first");
		list.add("second");
		list.add("third");
		map.put("list", list);
		
		return map;
	}

}

 

  • ajax.html(같은 패키지에 있는게 아니라 html 파일에 직접 링크 걸어주어야 함)
<html>
    <head>
        <meta charset="UTF-8">
        <title>J-QUERY</title>
        <link rel="icon" href="../img/chrome.png">
        <script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
        <style>

        </style>
    </head>
    <body>
        <button onclick="ajaxCall('http://localhost:8080')">main</button>
        <button onclick="ajaxCall('http://localhost:8080/list')">list</button>
    </body>
    <script>
        function ajaxCall(url){
            $.ajax({
                url : url,
                type: 'get',
                data:{},
                success:function(data){
                    console.log(data);
                },error:function(e){
                    console.log(e);
                }
            });
        }
        
    </script>
</html>

 

 

 

ViewPage Project

  • jsp를 사용한 Spring Boot Project

 

  • pom.xml
    • 기본적으로 jsp를 지원하지 않기 때문에 jsp를 사용하기 위해서 dependency 사이에 라이브러리 추가
<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
		
		
		
		<!-- jstl -->
		<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
	      <dependency>
	         <groupId>javax.servlet</groupId>
	         <artifactId>jstl</artifactId>
         	 <version>1.2</version>	         
	      </dependency>
		
		<!-- jasper -->
		<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper -->
	      <dependency>
	          <groupId>org.apache.tomcat</groupId>
	          <artifactId>tomcat-jasper</artifactId>
	          <version>9.0.71</version><!-- 톰캣 버전에 맞게(dynamic module 4.0 부터는 tomcat 9.0 이상 사용 해야 한다.) -->
	      </dependency>
		
		
		
		
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.3.1</version>
		</dependency>

 

  • application.properties 
    • 설정 추가
# server port
server.port=80

# encoding
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

# view page path
spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp

 

  • MainCotoller
@Controller
public class MainController {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	@RequestMapping(value = "/")
	public String home() {
		return "main";
	}
	
	@RequestMapping(value = "/calc")
	public String calc(Model model,@RequestParam String su1, @RequestParam String su2, @RequestParam String oper) {
		
		logger.info(su1+oper+su2);
		int val1 = Integer.parseInt(su1);
		int val2 = Integer.parseInt(su2);
		int result = 0;
		
		switch (oper) {
			case "+":
				result = val1+val2;
				break;
			case "-":
				result = val1-val2;
				break;
			case "*":
				result = val1*val2;
				break;
			case "/":
				result = val1/val2;
				break;
		}
		
		logger.info("result : "+result);
		model.addAttribute("result",result);
		
		return "result";
	}
	
}

 

  • main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<style>

</style>
</head>
<body>
	<form action="calc" method="get">
		<input type="text" name="su1" value=""/>
		
		<select name="oper">
			<option value="+">+</option>
			<option value="-">-</option>
			<option value="*">*</option>
			<option value="/">/</option>
		</select>
		
		<input type="text" name="su2" value=""/>
		<button>전송</button>
	</form>
</body>
<script>

</script>
</html>

 

  • result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<style>

</style>
</head>
<body>
	정답 : ${result}
</body>
<script>
	
</script>
</html>

 

 

 

Mybatis Project

  • Mybatis를 활용하여 DB와 연결한 Spring Boot Project

 

Mybatis 연동

  • Spring Boot 에서는 프로젝트 생성 시 필요한 Library를 추가 할 수 있음
  • Mybatis 연동을 위해서 Mybatis Framework와 MariaDB Driver를 선택 후 프로젝트 생성

 

  • application.properties 
    • DB 접속 정보 명시
server.port=80

server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

#db info
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:1512/mydb
spring.datasource.username=web_user
spring.datasource.password=pass

# mapper location
mybatis.mapper-locations=mapper/*_mapper.xml

# type aliase
// DTO에 별칭 부여해서 사용할 경우 alias로 경로 설정해줌
mybatis.type-aliases-package=kr.co.gudi.dto

 

 

# Controller, Service, DAO, DTO는 기존대로 만듦

 

  • Controller
@RestController
public class MainController {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired MainService service;
	
	@RequestMapping(value = "/")
	public HashMap<String, Object> list(){
		
		logger.info("list 요청");
		HashMap<String, Object> map = new HashMap<String, Object>();
		ArrayList<BoardDTO> list = service.list();
		map.put("list", list);
		
		return map;		
	}

}

 

  • Service
@Service
// 이 Service에서는 해당 경로의 interface를 이용해 mapper와 연결
// 기존에는 mapper.xml에서 resultType에 DTO가 들어가면 경로를 직접 입력해줬으나 여기서 경로 설정을 해주므로 mapper.xml에서 따로 하지 않고 DTO 이름만 작성해주면 됨
@MapperScan(value = {"kr.co.gudi.dao"}) 
public class MainService {
	
	@Autowired BoardDAO dao;
	
	Logger logger = LoggerFactory.getLogger(getClass());

	public ArrayList<BoardDTO> list() {
		return dao.list();
	}
	
}

 

  • DAO
// Service에서 MapperScan을 안할 경우
//@Mapper를 통해 특정 클래스와 연결해줌
public interface BoardDAO {
	
	ArrayList<BoardDTO> list();

}

 

  • DTO
@Alias("bbs") //별칭부여하여 사용
public class BoardDTO {
	
	private int idx;
	private String user_name;
	private String subject;
	private String bHit;
	private Date reg_date;
	
	getter, setter 생략

 

  • mapper는 src/main/resources 하위폴더로 mapper폴더 생성 후 그 안에 mapper.xml 생성

 

  • bbs_mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC   "-//mybatis.org//DTD Mapper 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
   
<mapper namespace="kr.co.gudi.dao.BoardDAO">
	// service에서 mapperScan해주었고 DTO에 별칭 부여해주었기 때문에 resultType에 별칭만 써주면 됨
	<select id="list" resultType="bbs">
		SELECT * FROM bbs
	</select>
</mapper>