Spring boot
Spring을 이용하여 개발하려면 톰캣 설치를 시작으로 여러 가지 복잡한 설정을 해야한다. 그러나 애너테이션기능이 강화되면서 점차 웹 어플리케이션도 일반 응용 프로그램을 개발하는 방식으로 바뀌기 시작했다. 이것바로 스프링 부트이다. 스프링부트는 의존성관리가 용이할 뿐만 아니라 배포 와 테스트 역시 스프링프레임워크보다 쉽고 빠르게 할 수 있다. 스프링 부트로 개발하면 메이븐의 라이버러리 자동 업데이트 기능을 이어받을 수 있을 뿐만 아니라 기존 스프링 프레임 워크의 복잡한 설정 과정을 최대한 줄일 수 있어 편리하다.
스프링부트의 장점
- 일반적인 응용 프로그램을 실행하는 수즌으로 스프링 어플리케이션을 구현 할 수 있다.
- 프로젝트 환경을 구축할 때 필요한 톰캣, Jetty, UnderFlow 같은 서버 외적인 툴이 내장되어 있어 따로 설치할 필요가 없다
- xml 기반 설정이나 코드 없이 환경 설정을 자동화 할 수 있다.
- 의존성 관리를 쉽게 자동으로 할 수 있다.
Spring boot 프로젝트 생성하기
1. 마우스 우클릭 후 Spring Starter Project를 선택한다
2. Name과 Group을 지정하여 패키지명을 정한다. 이때 pakaging을 war로 변경을 해야한다 배포할때 war로 배포를 할꺼기 때문이다.
3. selected에 선택된 항목을 추가한다. Available이 입력하여 찾아도 되고 항목을 선택해서 찾아도된다. 이과정을 하는것은 기존에 pom.xml에 넣는 작업을 미리 수행하는것 이라 보면된다. 또한 DevTools를 넣는 이유는 내장되어있는 톰이 auto reload 되게 만들기위해서 추가한것이다. Finish를 클릭하여 프로젝트를 생성한다.
4. 프로젝트 항목
static
HTML , CSS , 이미지 등 스태틱한 파일이 올라간다
templates
Thymeleaf 템플릿이 올란간다
aplication.propertis
servlet-context, root-context 와 같은 프로젝트 전체와 관련된 기능을 설정한다 key, value로 구성되어있기때문에 심플하고 가볍다.
BootexApplication
main 메소드를 가지고 있는 클래스 프로젝트를 실행하면 main메소드가 실행된다. 그럼으로 반드시 존재해야하는 한다. 이는 스프링 부트의 웹 어플리케이션을 일반 자바 어플리케이션 처럼 개발하려고 하기 때문이다.
ServletInitializer
SpringBootServletInitializer 클래스를 상속받는다. 스프링 부트 어플리케이션을 web.xml 없이 톰캣에서 실행하게 해준다.
webapp
일반적인 jsp파일들이 올라온다 sping의 경우 view가 있었지만 spring boot의 경우 jsp를 사용할 일이 적기 때문에 없다.
5. aplication.propertis 에 아래의 코드를 삽입
#server
server.port=9090
server.session.timeout=360000
#db연결
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/bootex?serverTimezone=Asia/Seoul
spring.datasource.username=root
spring.datasource.password=12345
#데브옵스와 타임리프 설정
spring.devtools.livereload.enabled=true
spring.thymeleaf.cache=false

6. 정상적으로 실행이 되는지 jUnitTest 실행
BootexApplicationTests
package com.example.demo;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
class BootexApplicationTests {
@Autowired
private DataSource ds;
@Test
public void testDataSource() throws Exception {
System.out.println("DS=" + ds);
try (Connection conn = ds.getConnection()) {
System.out.println("Cooooooooonn=" + conn);
assertThat(conn).isInstanceOf(Connection.class);
assertEquals(100, getLong(conn, "select 100"));
assertTrue( 100 > getLong(conn, "select count(*) from user"));
} catch (Exception e) {
e.printStackTrace();
}
}
private long getLong(Connection conn, String sql) {
long result = 0;
try(Statement st = conn.createStatement()){
ResultSet rs = st.executeQuery(sql);
if(rs.next()) {
result = rs.getLong(1);
}
}catch(Exception e) {
e.printStackTrace();
}
return result;
}
@Test
void contextLoads() {
}
}
결과
7. controller 생성
HelloController
package com.example.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hi")
public String hello() {
return "Hi pooney 오신걸 환영합니다.";
}
}
JUnitTest
HelloControllerTest
package com.example.demo.controller;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerTest {
//MockMvc 브라우저없이 가상의 request를 만든다 .
@Autowired
MockMvc mock;
@Test
public void testHello() throws Exception {
//첫번째 테스트방법
//.perform은 수행해라 get은 요청방식 ex)post, get
mock.perform(get("/hi"))
//정상적으로 응답하면 통과
.andExpect(status().isOk())
//content는 Hi ponn~~~랑 같으면 통과
.andExpect(content().string("Hi pooney 오신걸 환영합니다."));
//두번째 테스트방법 (첫번째 와 두번째 모두 같다)
MvcResult result = mock.perform(get("/hi"))
.andExpect(status().isOk())
.andReturn();
assertEquals("Hi pooney 오신걸 환영합니다.", result.getResponse().getContentAsString());
assertThat(result.getResponse().getContentAsString()).isEqualTo("Hi pooney 오신걸 환영합니다.");
System.out.println("RRR>>" + result.getResponse().getContentAsString());
}
}
결과
8. 프로젝트 실행 (실제로 BootexApplication.java 의 메소드가 실행되는 것이다 )
Run As -> Spring Boot App 클릭
브라우저창에 localhost:9090/hi/입력 하면 아래와 같은 결과를 출력한다.
'Spring boot' 카테고리의 다른 글
Spring boot @RequestBody 로 JSON 데이터 받을 시 JSON parse error (2) | 2020.05.19 |
---|---|
Spring boot jsp와 Thymeleaf 사용하기 (2) | 2020.05.16 |
Spring boot Controller test (0) | 2020.05.15 |
Spring boot Interceptor (0) | 2020.05.15 |
Spring boot mybatis 사용법 (2) | 2020.05.15 |