반응형

Spring Boot 란?

  • Spring 프로젝트가 제공하는 다양한 라이브러리와 프레임워크로 빨리게 사용할 수 있게 하는 프레임워크.
  • Dropwizard의 Spring 버전 같은 것.
  • 빌드하면 단일 jar 파일이 생긴다.
    • Web 어플리케이션의 경우, 내장 Tomcat을 시작 (Jetty와 Undertow로 전환 가능).
    • Web 응용 프로그램이 아니라 보통의 Java 프로그램으로도 동작하게 할 수 있다.
  • Maven이나 Gradle 같은 빌드 도구를 사용한다(Ant로는 가능하지 않다)
  • 사용하려는 컨포넌트를 종속적으로 추가하면 결합에 필요한 설정이 자동으로 이루어진다.


Hello World

Hello World 생성하기

Gradle 프로젝트를 생성한다.

디렉토리 spring-boot-hello-world를 생성하고, Gradle 프로젝트를 초기화한다.

$ mkdir spring-boot-hello-world
$ cd spring-boot-hello-world

Gradle 프로젝트를 초기화한다.

$ gradle init

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

소스 코드 자바 디렉토리를 만든다.

$ mkdir -p src/main/java/sample/springboot

소스 코드를 작성한다.

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.6.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
}

jar.baseName = 'spring-boot-hello-world'

src/main/java/sample/springboot/Main.java

package sample.springboot;

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

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Main.class, args)) {
            Main m = ctx.getBean(Main.class);
            m.hello();
        }
    }

    public void hello() {
        System.out.println("Hello Spring Boot!!");
    }
}

디렉토리 구조

$ tree
.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    └── main
        └── java
            └── sample
                └── springboot
                    └── Main.java

어플리케이션 실행

Gradle로 실행

$ gradle bootRun
 

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.6.RELEASE)

(생략)
Hello Spring Boot!!
(생략)

BUILD SUCCESSFUL in 20s
3 actionable tasks: 3 executed

빌드 실행

$ gradle build
$ java -jar build/libs/spring-boot-hello-world.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.6.RELEASE)

(생략)
Hello Spring Boot!!
(생략)

설명

build.gradle 설정

Spring Boot 용 Gradle 플러그인이 포함되어 있기 때문에 처음에 이를 로드한다.

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.6.RELEASE")
    }
}

apply plugin: 'org.springframework.boot'

그리고 일반적인 Java 프로그램을 만들 뿐이라면, spring-boot-starter에 종속(dependencies)되도록 추가한다.

build.gradle

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter'
}

Spring Boot 기동

Spring Boot의 기동은 SpringApplication 클래스를 사용한다. 가장 간단한 방법은 SpringApplication#run (Object, String ...)을 사용하는 것이다.

Main.java

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

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Main.class, args)) {
            Main m = ctx.getBean(Main.class);
            m.hello();
        }
    }

    public void hello() {
        System.out.println("Hello Spring Boot!!");
    }
}
  • run () 메소드의 첫번째 인수는 @EnableAutoConfiguration으로 어노테이션 클래스의 Class 객체를 건네 준다.
    • Main 클래스는 @SpringBootApplication 어노테이션되어 있지만, 이것은 @Configuration, @EnableAutoConfiguration, @ComponentScan 3개의 클래스를 어노테이션 설정한 것과 동일하다.
    • @Configuration은 Spring의 다양한 설정을 Java 코드상에서 할 수 있도록 한 어노테이션이다.
      • 예전 Spring은 XML으로 설정을 썼지만, 지금은 Java 코드에서 설정하는 것이 주류를 이루고 있다 같다.
    • @EnableAutoConfiguration는 Spring 설정을 자동화하기 위한 어노테이션이다.
      • 이 종속성을 추가하는 것만으로 Spring MVC 등의 라이브러리를 설정 기입없이 사용할 수있게 된다.
    • @ComponentScan는 DI 컨테이너가 관리하는 Bean을 자동 등록하는 어노테이션이다.
      • 이제 주석 된 클래스를 기점으로 부하의 패키지를 재귀적으로 검색하여 @Component 어노테이션이 부여 된 클래스를 Bean으로 컨테이너에 등록한다.
    • 이 3 개의 어노테이션은 대체로 함께 사용하는 경우이 많기 때문에, @SpringBootApplication를 사용하면 조금 편해진다.
  • 두 번째 인수는 커멘드 라인의 인수를 전달한다.

Gradle에서 실행 빌드

어플리케이션의 기동은 spring-boot-gradle-plugin이 제공하는 bootRun 테스크를 사용한다.
jar 생성은, 보통의 build 테스크로 가능하다.
생성된 jar는 일반적으로 jar -jar <jar 파일>에서 실행할 수 있다.

소스 코드




Java 코드에서 Bean 정의

@Bean 어노테이션를 부여하여 Bean 생성하기

Hoge.java

package sample.springboot;

public class Hoge {

    private String name;

    public Hoge(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Hoge [name=" + name + "]";
    }
}

Main.java

package sample.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Main.class, args)) {
            Hoge h = ctx.getBean(Hoge.class);
            System.out.println(h);
        }
    }

    @Bean
    public Hoge getHoge() {
        System.out.println("Main#getHoge()");
        return new Hoge("hoge");
    }
}

실행 결과

Main#getHoge()
Hoge [name=hoge]

설명

  • @Bean 메소드를 어노테이션으로 설정하고 그 메소드를 통해 Bean의 인스턴스를 생성 할 수있게 된다.
  • 이런 방식의 Bean을 정의하는 방법은 @Configuration 어노테이션이 부여 된 클래스를 선언 할 수 있다.
    • @SpringBootApplication는 @Configuration 어노테이션이 부여 된 것과 같은 효과가 있다.

@Configuration 어노테이션이 부여 된 클래스를 별도로 생성하기

HogeProvider.java

package sample.springboot;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HogeProvider {

    @Bean
    public Hoge getHoge() {
        System.out.println("HogeProvider#getHoge()");
        return new Hoge("hoge provider");
    }
}

Main.java

package sample.springboot;

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

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Main.class, args)) {
            Hoge h = ctx.getBean(Hoge.class);
            System.out.println(h);
        }
    }
}

실행 결과

HogeProvider#getHoge()
Hoge [name=hoge provider]

설명

클래스에 @Configuration 어노테이션으로 부여하고 메소드에 @Bean 어노테이션으로 부여하면, 임의의 클래스 Bean을 생성하는 메소드를 정의할 수 있다.




Web 어플리케이션 기동

Hello World 수정하기

build.gradle

dependencies {
-   compile 'org.springframework.boot:spring-boot-starter'
+   compile 'org.springframework.boot:spring-boot-starter-web'
}

src/main/java/sample/springboot/Main.java

package sample.springboot;

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

@SpringBootApplication
public class Main {

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

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

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

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public String hello() {
        return "Hello Spring MVC";
    }
}

어플리케이션 실행

Gradle로 실행

$ gradle bootRun
(생략)
> :bootRun

curl으로 테스트하기

$ curl http://localhost:8080/hello
Hello Spring MVC

설명

Web 어플리케이션에 대한 의존성

build.gradle

dependencies {
-   compile 'org.springframework.boot:spring-boot-starter'
+   compile 'org.springframework.boot:spring-boot-starter-web'
}

Web 어플리케이션을 만드는 경우는 spring-boot-starter-web 모듈을 사용한다. 기본적으로 Spring MVC를 사용하여 Web 응용 프로그램을 만들게 된다.

기동 방법 변경

src/main/java/sample/springboot/Main.java

    public static void main(String[] args) {
-       try (ConfigurableApplicationContext ctx = SpringApplication.run(Main.class, args)) {
-           ....
-       }
+       SpringApplication.run(Main.class, args);

서버 시작 후 컨테이너가 종료 해 버리므로 try-with-resources 문장은 사용하지 않도록 변경한다.

Spring MVC 컨트롤러 클래스

src/main/java/sample/springboot/web/HelloController.java

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.GET)
    public String hello() {
        return "Hello Spring MVC";
    }
}

Web API의 진입 점(Entry point)이 되는 클래스를 만드는 경우 @RestController을 클래스에 부여한다.
Web API 대신 MVC에서 C가 되는 컨트롤러 원한다면 @Controller 어노테이션을 부여한다.
@RequestMapping에서 경로 및 HTTP 메소드의 매핑을 한다 (대략 JAX-RS와 같은 분위기).

소스 코드



서버 포트 번호 변경

서버 포트 번호 변경하기

application.properties

server.port=1598

어플리케이션 실행

$ gradle bootRun
(생략)
2017-08-17 22:30:13.211  INFO 14485 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 1598 (http)
(생략)

설명

  • server.port으로 포트 번호를 지정할 수 있다.
  • application.properties에 대한 설명은 여기.
  • 그 밖에도 다음과 같은 변경이 가능하다.
    • server.address : 서버 주소 (localhost로 하면 로컬에서만 액세스 할 수 없게 된다.)
    • server.sessionTimeout : 세션 타임아웃 시간.


응답과 요청 매핑

응답과 요청 매핑(Mapping Requests and Responses)

src/main/java/sample/springboot/web/Hoge.java

package sample.springboot.web;

public class Hoge {

    public int id;
    public String value;

    @Override
    public String toString() {
        return "Hoge [id=" + id + ", value=" + value + "]";
    }
}

src/main/java/sample/springboot/web/HelloController.java

package sample.springboot.web;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method=RequestMethod.POST)
    public Hoge hello(@RequestBody Hoge param) {
        System.out.println(param);

        Hoge hoge = new Hoge();
        hoge.id = 20;
        hoge.value = "Response";

        return hoge;
    }
}

어플리케이션 실행

curl으로 테스트하기

$ curl -H "Content-type: application/json" -X POST -d '{"id": 10, "value": "Request"}' http://localhost:8080/hello
{"id":20,"value":"Response"}

서버 콘솔 출력

Hoge [id=10, value=Request]

설명

  • 기본적으로 요청과 응답은 모두 JSON 의한 매핑이 되어 있다.
  • 매핑은 Jackson으로 하고 있고 있다 (그래서 매핑 조정은 Jackson 어노테이션으로 가능하다).



반응형
반응형
import java.io.UnsupportedEncodingException;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * 문자열 체크를 하는 유틸
 *
 * @author kimkc
 */
public class StringValidator {

    // IP 주소 패턴
    private static final Pattern PATTERN_IPADDRESS = Pattern
            .compile("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");
    // Email 주소 패턴
    private static final Pattern PATTERN_EMAIL = Pattern.compile("[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}\\@[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}(\\.[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25})+");
    // 비밀번호 패턴 (문자, 숫자, 특수문자의 조합으로 9~16자리)
    private static final Pattern PATTERN_PW = Pattern
            .compile("(?=([a-zA-Z].*[0-9].*[^0-9a-zA-Z].*)|([a-zA-Z].*[^0-9a-zA-Z].*[0-9].*)|([0-9].*[a-zA-Z].*[^0-9a-zA-Z].*)|([0-9].*[^0-9a-zA-Z].*[a-zA-Z].*)|([^0-9a-zA-Z].*[a-zA-Z].*[0-9].*)|([^0-9a-zA-Z].*[0-9].*[a-zA-Z].*)$).{9,16}");
    // 추가 비밀번호 패턴 (연속된 문자 3개 이상 금지)
    private static final Pattern PATTERN_SAME = Pattern.compile(".*(.)\\1\\1.*");

    /**
     * 엔코딩이 유효한지 체크
     *
     * @param value
     * @return
     */
    public static boolean isNotValidEncoding(final String value) {
        return !isValidEncoding(value);
    }

    /**
     * 엔코딩이 유효한지 체크
     *
     * @param value
     * @return
     */
    public static boolean isValidEncoding(final String value) {
        boolean result = true;
        try {
            new String("".getBytes(), value);
        } catch (UnsupportedEncodingException e) {
            result = false;
        }
        return result;
    }

    /**
     * 입력 받은 IP주소가 정규식 표현이 맞는치 체크
     *
     * @param ip
     * @return s
     */
    public static boolean isIPAddress(final String ip) {
        return PATTERN_IPADDRESS.matcher(ip).matches();
    }

    /**
     * 입력 받은 이메일 주소가 정규식 표현이 맞는치 체크
     *
     * @param email
     * @return
     */
    public static boolean isEmail(final String email) {
        return PATTERN_EMAIL.matcher(email).matches();
    }

    /**
     * 문자 조합 규칙 체크
     *
     * @param password
     * @return
     */
    public static boolean isPasswordCharacter(final String password) {
        return PATTERN_PW.matcher(password).matches();
    }

    /**
     * 3개 이상 동일한 문자 패턴 체크
     *
     * @param password
     * @return
     */
    public static boolean isSamePattern(final String password) {
        return PATTERN_SAME.matcher(password).matches();
    }

    /**
     * 3개 이상 연속된 문자 패턴 체크
     *
     * @param password
     * @return
     */
    public static boolean isContinuousPattern(final String password) {
        if (password == null)
            return false;

        int count = 0;
        char c = 0;
        char before = 0;
        for (int i = 0; i < password.length(); i++) {
            c = password.charAt(i);
            if (c >= 48 && c <= 57 && (before + 1 == c)) {
                count++;
                if (count >= 2)
                    return true;
            } else {
                count = 0;
            }

            before = c;
        }

        return false;
    }

    /**
     * 정규식 표현이 유효한지 체크
     *
     * @param regex
     * @return
     */
    public static boolean isInvalidRegularExpression(String regex) {
        try {
            Pattern.compile(regex);
        } catch (PatternSyntaxException e) {
            return false;
        }
        return true;
    }

}
반응형

'기타' 카테고리의 다른 글

C/C++와 JAVA 비교  (0) 2018.01.10
REST API란?  (0) 2017.12.10
JSON이란?  (0) 2017.12.10
마크다운(Markdown) 이란?  (0) 2017.12.10
문자열 체크 예제  (0) 2016.04.18
아두이노 동영상 강의  (0) 2016.04.17
반응형

Java 코드를 html로 변환하는 플러그인.

1. 아래 페이지에서 java2html_eclipse_150.zip 파일을 다운로드 받는다.
http://www.java2html.de/eclipse.html

2. 압축을 풀어서 이클립스 폴더의 plugins 폴더에 de.java2html_1.5.0 폴더전체를 복사해 넣는다.

3. 이클립스를 실행 및 재실행을 한다.

사용법
자바 소스에서 블럭을 잡고 마우스 우측버튼을 누르고 javaToHtml을 실행시키면 됩니다.
스크립보드로도 가능하고 파일 생성도 가능하다.

※ 주의
한글주석은 깨진다. 이는 html코드를 보면 charset=iso-8859-1 이부분을 charset=euc-kr로 고치면 해결할수 있다.

반응형
반응형
01강 처음 접하는 아두이노


02강 처음 만드는 아두이노 프로그래밍


03강 LED와 버튼 제어하기


04강 삼색 LED 제어하기


05강 피에조 스피커 사용하기


06강 조도센서 사용하기


07강 초음파센서 사용하기


08강 LCD 패널 사용하기


09강 7세그먼트 사용하기


반응형

'기타' 카테고리의 다른 글

C/C++와 JAVA 비교  (0) 2018.01.10
REST API란?  (0) 2017.12.10
JSON이란?  (0) 2017.12.10
마크다운(Markdown) 이란?  (0) 2017.12.10
문자열 체크 예제  (0) 2016.04.18
아두이노 동영상 강의  (0) 2016.04.17

+ Recent posts