1. banner.txt??


 - 위 이미지를 이쁘게 꾸며보자!.

2. 변경할 파일

 1) src/main/resources/banner.txt 

 

  - banner.txt 내에 원하는 텍스트를 넣으면 된다.


 2) 파일 위치도 변경하기

  (1) 기본 설정(application.yml or application.propertioes)

banner.location=classpath:banner.txt # Banner file location.


- 원하는 경로로 변경하면 된다.


3. 이쁜 text 만들기

 1) https://devops.datenkollektiv.de/banner.txt/index.html 


 2) http://patorjk.com/software/taag/#p=display&f=Ogre&t=Memorynotfound.com




4. 결과

 - 위에서 만든 텍스트를 banner.txt 파일에 넣으면 아래와 같이 볼 수 있다.



5. 좀더 이쁘게

 1) 컬러도 적용 가능하다.

 2) 아래 링크를 들어가면 Spring version 등의 값들을 노출 시킬 수 있다.

- 링크

 3) 이미지를 넣을 수도 있다.

banner.image.location=classpath:banner.gif # Banner image file location (jpg/png can also be used).

banner.image.width= # Width of the banner image in chars (default 76)

banner.image.height= # Height of the banner image in chars (default based on image height)

banner.image.margin= # Left hand image margin in chars (default 2)

banner.image.invert= # If images should be inverted for dark terminal themes (default false)


 4) 이미지를 ancii 로 변경할 수 있다.

- 링크


1. X-Application-Context Header????

 - response header를 보면, 아래와 같은 header 값이 있다. 

 - application name과 port가 노출된다.

X-Application-Context:
application:8080


 - 사용자에게 알려줄 필요없는 정보다.

 - 지우자!!


2. 옵션 설정

management:
add-application-context-header: false

3. 참고 

 - 해당 Header 값은 OncePerRequestFilter에서 ApplicationContext ID를 추가한다.

1. Goal

 - spring boot에 spring-boot-starter-web를 사용 중이다.

 - was가 initialization을 마친 뒤 첫 호출 시점에 dispatcherServlet이 initialization을 한다.

 - was가 initialization을 할 동안 같이 dispatcherServlet이 initialization을 했으면 좋겠다.


2. Log

2018-02-14 13:43:58 [user-PC] [INFO ] o.a.c.c.C.[Tomcat].[localhost].[/]:179 - Initializing Spring FrameworkServlet 'dispatcherServlet'

2018-02-14 13:43:58 [user-PC] [INFO ] o.s.web.servlet.DispatcherServlet:489 - FrameworkServlet 'dispatcherServlet': initialization started

2018-02-14 13:43:58 [user-PC] [INFO ] o.s.web.servlet.DispatcherServlet:508 - FrameworkServlet 'dispatcherServlet': initialization completed in 17 ms


3-1. 수정

 1) jdk 1.8 이하

@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
return new BeanFactoryPostProcessor() {

@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bean = beanFactory.getBeanDefinition(
DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);

bean.getPropertyValues().add("loadOnStartup", 1);
}
};
}


 2) jdk 1.8 이상

@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
return beanFactory -> {
BeanDefinition bean =
beanFactory.getBeanDefinition(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
bean.getPropertyValues().add("loadOnStartup", 1);
};
}


3-2. 수정(추천!!)

 - application.yml에 해당 내용 추가. (기본으로 -1로 되어 있다.)

spring:
mvc:
servlet:
load-on-startup: 1

  - application.properties일 경우

spring.mvc.servlet.load-on-startup=1


* 참고자료

https://stackoverflow.com/questions/31322670/how-to-configure-dispatcherservlet-load-on-startup-by-spring-boot

1. Goal 

 - Spring boot web, H2 Database, JPA 를 사용해보기

 - 간단한 REST API 만들기

 - H2 web console 접속해보기


2. 세팅하기

0) main Class

 - 프로젝트 생성하면 알아서 생성해준다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class H2JpaApplication {

public static void main(String[] args) {
SpringApplication.run(H2JpaApplication.class, args);
}
}

1) pom.xml

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- h2 database -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
</dependencies>

2) application.yml

# Database Settings
spring:
datasource:
url: jdbc:h2:mem:h2_jpa_sample;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
platform: h2
username: sa
password:
driverClassName: org.h2.Driver
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
use_sql_comments: true
format_sql: true

# H2 Settings
h2:
console:
enabled: true
path: /console
settings:
trace: false
web-allow-others: false

3) Entity Class

import javax.persistence.*;
import java.io.Serializable;

/**
* Book Entity
*
* @author akageun
*/
@Entity
@Table(name = "book")
public class BookEntity implements Serializable {
private static final long serialVersionUID = 810457109758530244L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(length = 50)
private String name;
private int price;

@Lob
@Column
private String desc;

public BookEntity() {
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getPrice() {
return price;
}

public void setPrice(int price) {
this.price = price;
}

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}
}

4) DAO Class

import kr.geun.sample.entity.BookEntity;
import org.springframework.data.repository.CrudRepository;

/**
* BOOK DAO
*
* @author akageun
*/
public interface BookDAO extends CrudRepository<BookEntity, Long> {
}


5) Controller Class

import kr.geun.sample.dao.BookDAO;
import kr.geun.sample.entity.BookEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.transaction.Transactional;

/**
* WEB Rest Controller
*
* @author akageun
*/
@RestController
public class WebController {

@Autowired
private BookDAO bookDAO;

/**
* Get All Book Data
*
* @return
*/
@GetMapping("/book/list")
public Iterable<BookEntity> getList() {
return bookDAO.findAll();
}

/**
* View specific Book by id
*
* @param id
* @return
*/
@GetMapping("/book/{id}")
public BookEntity getDetail(@PathVariable Long id) {
return bookDAO.findOne(id);
}

/**
* New Book Data
*
* @param param
* @return
*/
@Transactional
@PostMapping("/book")
public BookEntity addBook(BookEntity param) {
return bookDAO.save(param);
}

/**
* Modify Book Data
*
* @param param
* @return
*/
@Transactional
@PutMapping("/book/{id}")
public BookEntity modifyBook(BookEntity param) {
return bookDAO.save(param);
}

/**
* Delete Book Data
*
* @param id
* @return
*/
@Transactional
@DeleteMapping("/book/{id}")
public String deleteBook(@PathVariable Long id) {
bookDAO.delete(id);
return "SUCCESS";
}
}

6) data.sql

 - src/main/resources 하위에 data.sql을 만들어놓으면 초기화시에 해당 sql파일 내에 있는 쿼리들을 실행시켜준다.

INSERT INTO book (`id`, `name`, `price`, `desc`) VALUES (1, 'Book no 1', 5000, 'This is Sample Book');


3. 동작 확인해보기

 - Rest Client인 'POSTMAN'으로 호출하였다.


1) 리스트 

 - 응답데이터 내용을 확인해보면 위에 data.sql이 잘 추가되어 있는걸 볼 수 있다.


2) 추가

 - POST 로 호출 한 다음 위 '리스트' API를 호출해보니, 잘 저장되어 있다.

- 리스트 API 호출 


3) 상세보기

 - 방금 전 저장한 데이터를 조회해보자.



4) 수정

 - 추가 입력했던 id가 2번인 데이터를 수정해보자


5) 삭제

 - 2번 글을 삭제해보자



4. Web Console 접속해보기

 - http://localhost:8080/console

 - 해당 페이지에서 언어선택도 변경할 수 있다.

 - 접속해보자


- 생성한 BOOK 테이블이 보인다. 



5. 결론

 - jpa를 사용하면 간단한 CRUD 만드는건 정말 편하다.

 - H2 database를 개발환경에서 사용하면, 편리하다.


6. 소스

 https://github.com/akageun/spring_boot_sample/tree/master/h2_jpa 

1. Spring Interceptor에서 redirect 체크

 - 아래와 같은 경우 등

return "redirect:/testPage";


2. 소스

/**
* Request Checker
* - Redirect
*
* @param modelAndView
* @return
*/
private boolean isRedirect(ModelAndView modelAndView) {
return modelAndView.getView() instanceof RedirectView || modelAndView.getViewName().startsWith("redirect:");
}


1. DevTools 란

 - spring boot 1.3.0부터 추가된 기능

 - 소스가 변경되면 알아서 재시작 해줌.


2. 의존성

 - Maven

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>

 - Gradle

compile("org.springframework.boot:spring-boot-devtools")


3. 영상


4. 링크

https://spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3


-----------2018.07.19 수정-------------------

5. LiveReload

 - 리소스가 변경될 때 브라우저를 갱신시켜주는 서버를 포함하고 있음.

 - http://livereload.com/extensions/ 에서 extension을 다운받을 수 있음.


 - 해당기능을 사용하고 싶지 않을 경우 

spring.devtools.livereload.enable=false

 - 또한 한번에 하나의 서버만 제공함. 여러개를 동작시킬 경우, 제일 처음 동작시킨 서버만 동작함.

아래 소스는 간단한 파일업로드 기능에 ajax를 추가한 간단한 예제 코드 입니다.


1. JAVA Code

 1) Controller

package kr.geun.bootStartSample.www.controller;


import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.multipart.MultipartFile;


@Controller

public class FileUploadController {

    private static final Logger LOG = LoggerFactory.getLogger(FileUploadController.class);


    private final String UPLOADPATH = "C:\\temp";


    /**

     * File Upload Page

     * 

     * @return

     */

    @RequestMapping(value = "/fileupload", method = RequestMethod.GET)

    public String fileUpload() {

        return "fileupload";

    }


    /**

     * File Save

     * 

     * @param uploadfile

     * @return

     */

    @RequestMapping(value = "/fileupload", method = RequestMethod.POST)

    public ResponseEntity<?> fileUpload(@RequestParam("uploadFile") MultipartFile uploadfile) {

        

        try {

            String fileNm = uploadfile.getOriginalFilename();

            String filePath = UPLOADPATH + File.separator + fileNm;


            BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(filePath)));

            stream.write(uploadfile.getBytes());

            stream.close();


        } catch (Exception e) {

            LOG.error(e.getMessage(), e);

            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

        }


        return new ResponseEntity<>(HttpStatus.OK);

    }

}



 2) Jsp

- HTML Code(fileupload.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>

<form id="upload_file_frm" onsubmit="return false;">

<table>

<tr>

<th>Upload File </th>

<td>

<input id="upload_file" type="file" name="uploadFile" accept="*" />

</td>

<td>

<button id="upload_file_btn">Upload Btn</button>

</td>

</tr>

<tr>

<td colspan="3" id="uload_result_msg"></td>

</tr>

</table>

</form>


- Javascript

<script type="text/javascript">

$(document).ready(function(){

$("#upload_file_btn").click(function(){

uploadFileFunc();

});

});

function uploadFileFunc(){

$.ajax({

url:"/fileupload",

type: "POST",

data: new FormData($("#upload_file_frm")[0]),

enctype: 'multipart/form-data',

        processData: false,

        contentType: false,

        cache: false,

        success: function () {

            $("#uload_result_msg").text("File Upload Success");

        },

        error: function () {

            $("#uload_result_msg").text("File Upload Error");

        }

});

}

</script>


1. Actuator란

어플리케이션의 health check를 손쉽게 할 수 있는 Spring boot 자원이다.


2. pom.xml 에 추가

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>


3. Endpoints

Reference


4. run


5. 기타

  1) App info(application.properties에 위 소스 추가)

info.app.name=Sample

info.app.description=Spring Boot Start Sample 

info.app.version=1.0.0-snapshot


  - 실행화면 


  2) Custom Endpoint(application.properties에 위 소스 추가)

management.context-path=/monitor



  3) 실행화면

1. Spring Boot 특징

 - 따로 tomcat을 사용하지 않고도 내장 tomcat or jetty를 사용할 수 있다.(war로 배포하여 tomcat을 따로 사용할 수도 있다.)

 - 복잡한 Spring의 xml or java config 설정들을 일부 자동으로 설정해준다.


2. Spring boot 시작하기

 1) 프로젝트 만들기

   - STS에서 NEW -> Spring Starter Project 선택 




기본 정보 입력



기본 라이브러리 선택

- spring-boot-starter-web을 추가했다.


 2) Controller 만들기


package kr.geun.bootStartSample.www.controller;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


/**

 * Test Controller

 * 

 * @author geunspage

 *

 */

@RestController

public class TestController {


    /**

     * 테스트 데이터

     * 

     * @return

     */

    @RequestMapping("/test")

    public String getTest() {

        return "{\"result\":true,\"resultMsg\":\"성공입니다.\"}";

    }

}




 3) Project Run

  - Project 이름 우클릭

  - Run As -> Spring Boot App 클릭 




3. 결과 화면

Boot 기본 port는 8080이다.

port 변경을 하고 싶으시면, ~/resources/application.properties 내에 아래 코드를 추가하면 된다.

server.port=8081

+ Recent posts