IntelliJ 게시판 만들기 - IntelliJ gesipan mandeulgi

IntelliJ IDEA the Java IDE

Code-centric IDE, focused on your productivity. Full Java EE support, deep code understanding, best debugger, refactorings, everything right out of the box...

www.jetbrains.com

spring security 기본 로그인 화면 나타나는 경우

[build.gradle]

dependencies {
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation('org.springframework.boot:spring-boot-starter-integration')
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation('org.springframework.boot:spring-boot-starter-security')
implementation('org.springframework.boot:spring-boot-starter-validation')
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
implementation('org.springframework.session:spring-session-jdbc')
runtimeOnly('org.springframework.boot:spring-boot-devtools')
runtimeOnly('com.microsoft.sqlserver:mssql-jdbc')
compileOnly('org.projectlombok:lombok')
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation('org.springframework.restdocs:spring-restdocs-mockmvc')
testImplementation('org.springframework.security:spring-security-test')
}

스프링부트 어플리케이션을 구동시키고 아래 사진과 같이 주소창에 http://localhost:8080 을 실행하면 

build.gradle파일 spring security depengency에 의해 spring의 기본 보안 인증이 적용되어 

스프링에서 제공하는 기본 로그인 폼 화면 http://localhost:8080/login으로 redirect된다.

Username은 user, Password는 아래 사진과 같이 실행 로그에 적힌 Using generated security password를 넣어준다

IntelliJ 게시판 만들기 - IntelliJ gesipan mandeulgi

로그인되면 Whitelabel Error Page가 나타난다.

만약 build.gradle의 dependency에 spring security에 관한 라인을 지우면 

localhost:8080화면에 바로 Whitelabel Error Page가 나타나는것을 알 수 있다.

view는 아직 안만들었으니 일단 어플리케이션 메인 클래스에서 텍스트를 출력하는 예제를 만들어 보자.

* 어플리케이션 실행시 RestFul API 따라 텍스트 출력하기 

- @Controller와 @RestController 사용 비교 

코드 비교를 위해 결과값은 동일하게 구현한다.

@RestController어노테이션은 @ResponseBody 어노테이션기능을 포함한다.

@Controller어노테이션 사용하면 @ResponseBody 어노테이션을 이용하여 텍스트를 리턴해야한다.

@Controller의 주용도는 view(화면)을 리턴하는 것이고, @RestController는 데이터를 리턴하는 것이 주용도라고 할 수 있다. @Controller의 경우 서비스 함수에@ResponseBody를 사용하여 객체를 리턴할 수 있다.

[DemoApplication.java]

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} @RequestMapping("/")
public String hello() {
return "Hello World!";
}
}

ackage com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@Controller
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

@RequestMapping("/")
@ResponseBody
public String hello() {
return "Hello World";
}
}

실행 결과 화면


gradle에서 spring loaded 적용하기

spring loaded를 적용하면

어플리케이션 java클래스에서 문자열 Hello World를 수정하고 저장했을때 바로 변경이 적용되는지 확인해보자.

정적인 java, css, html등의 수정작업을 반영하려면 tomcat같은 WAS를 재가동 시켜야 한다.

이때 spring프로젝트는 Hot Swapping기능을 제공하는 spring loaded를 사용하여 

tomcat과 같은 컨테이너 재시작 없이 수정한 코드의 변경 내역을 반영할 수 있다.

JReble은 유료이므로 spring loaded를 사용하자.

spring loaded 최신 버전을 https://mvnrepository.com/artifact/org.springframework/springloaded 에서 확인하고 

build.gradle에서 아래 파란 영역을 추가한다.

[build.gradle]

buildscript {
ext {
springBootVersion = '2.1.0.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath 'org.springframework:springloaded:1.2.8.RELEASE'
}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'idea'

idea { module { inheritOutputDirs = false outputDir = file('$buildDir/classes/main/') } }

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
mavenCentral()
}

dependencies {
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation('org.springframework.boot:spring-boot-starter-integration')
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation('org.springframework.boot:spring-boot-starter-security')
implementation('org.springframework.boot:spring-boot-starter-validation')
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
implementation('org.springframework.session:spring-session-jdbc')
runtimeOnly('org.springframework.boot:spring-boot-devtools')
runtimeOnly('com.microsoft.sqlserver:mssql-jdbc')
compileOnly('org.projectlombok:lombok')
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation('org.springframework.restdocs:spring-restdocs-mockmvc')
testImplementation('org.springframework.security:spring-security-test')
}

* 어플리케이션 실행시 RestFul API 따라 jsp뷰 출력하기 

1. 일단 view파일들이 위치할 패키지를 만들어준다,

spring initializr로 만든 프로젝트에는 webapp 폴더가 없으므로 직접 만들어준다.

나는 src > main > webapp > WEB-INF > view > hello.jsp를 만들어 보았다.

[hello.jsp]

2. view에 관한 설정을 적어준다.

spring initializr로 프로젝트를 만들면 src > main > resource에 [application.properties]라는 빈 파일이 존재한다.

여기에 view 관련한 설정을 적어준다.

prefix : 뷰 경로 지정

suffix : 뷰 확장자 지정

[application.properties]

spring.mvc.view.prefix: /WEB-INF/view/
spring.mvc.view.suffix: .jsp

 또는 main함수에 viewResolver Bean을 만든다.

[DemoApplication.java]

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

@Bean
public InternalResourceViewResolver setupViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/view/");
resolver.setSuffix(".jsp");
return resolver;
}
}

이제 controller에서 RequestMapping에 맞게 return "view파일명(jsp뷰)"; 하면

view파일명에 view의 prefixsuffix가 붙어 

webapp/WEB-INF/view/view파일명.jsp이 호출 된다.

3. spring boot는 기본적으로 jsp를 지원하지 않는다.

따라서 우회하는 방법을 사용하여 jsp를 읽도록 만들어야 한다.

[build.gradle]

dependencies {
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation('org.springframework.boot:spring-boot-starter-integration')
implementation('org.springframework.boot:spring-boot-starter-jdbc')
// implementation('org.springframework.boot:spring-boot-starter-security')
implementation('org.springframework.boot:spring-boot-starter-validation')
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
implementation('org.springframework.session:spring-session-jdbc')
runtimeOnly('org.springframework.boot:spring-boot-devtools')
runtimeOnly('com.microsoft.sqlserver:mssql-jdbc')
compileOnly('org.projectlombok:lombok')
compile('org.springframework:springloaded:1.2.4.RELEASE')
compile('org.apache.tomcat.embed:tomcat-embed-jasper')
compile('javax.saervlet:jstl')
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation('org.springframework.restdocs:spring-restdocs-mockmvc')
// testImplementation('org.springframework.security:spring-security-test')
}
compile('org.apache.tomcat.embed:tomcat-embed-jasper')

spring boot가 내장된 tomcat을 구동시켜 jsp를 읽게 만들는 코드이다.(내가 이해한 바로는...)

compile('javax.saervlet:jstl')

뷰 파일에서 jstl문법을 사용할 예정이 아니라면 추가하지 않아도 된다. 

4. 이제 controller를 만들어서 jsp를 호출해보자.

기본으로 생성되어있던 경로 src > main > java > com.example.demo 에

> controller > IndexController 를 만들어보았다.

[IndexController.java]

package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {
@RequestMapping(value = "/hihi")
public String hihi () {
return "hello";
}
}

[hello.jsp]

<%@ page language="java"
contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<h2>jsp 파일입니다!</h2>

이제 http://localhost:8080/hihi 를 입력하면 

IndexController가 작동하면서 '/hihi'에 맞는 RequestMapping를 찾아 함수를 실행시킨다.

이때 application.properties파일에 view에 대해 설정해 놓은 prefix, suffix에 의해

webapp/WEB-INF/view/hello.jsp를 보여준다.

아래는 실행한 hello.jsp뷰의 모습이다.