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>
'코딩도전기 > Spring Boot' 카테고리의 다른 글
Spring Boot - Properties / AOP(Interceptor) (0) | 2023.06.02 |
---|---|
Spring Boot - REST API (0) | 2023.05.31 |
String Boot - Restful Service (0) | 2023.05.30 |
Spring Boot - Transaction / Connection Pool / CSS 일괄적용 (0) | 2023.05.26 |
Spring Boot - 쿼리문 로고 찍기 / 동적쿼리 (0) | 2023.05.25 |