개요
지난 글에서 Spring5 MVC 프로젝트 개발 환경을 구축하는 방법을 다뤘었습니다.
인텔리제이 무료 버전으로 스프링5 MVC개발하기(Maven)
이번에는 최신 버전(2018.1.1)의 인텔리제이 커뮤니티 에디션을 이용해 차근차근 Spring Boot 개발환경을 셋팅해가겠습니다.
단, Maven대신 Gradle 기반으로 개발환경을 구축하는 기초적인 방법을 꼼꼼하게 다루겠습니다.
1. 다운로드 & 설치
A. OpenJDK 설치
Oracle이 제공하는 JDK가 유료로 전환됨에 따라서 OpenJDK를 사용하기로 합니다. 이와 관계가 없다면 이 내용은 무시하세요. 저는 이전 Oracle JDK를 전부 삭제했고요. OpenJDK를 아래 링크에서 다운로드 받습니다.
적당한 위치에 다운받아 압축을 풀어두세요. 윈도우OS에 D:\java\jdk-10.0.2 에 두었다고 가정합니다. CMD에서 환경변수 PATH를 확인해 봅니다.
echo %PATH$
PATH에 OpenJDK 경로를 추가할 것입니다. 아래처럼 java 실행파일 경로 설정하세요.
set PATH=%PATH%;D:\java\jdk-10.0.2\bin
환경이 잘 잡혔는지 java –version으로 확인하세요.
만약 아래와 같은 에러가 나오면 그 아래 3개의 항목들을 시도해 보세요.
- 기존에 설치된 오라클 JDK는 모든 삭제
- C:\ProgrameData\Oracle 폴더가 있으면 삭제
- C:\Windows\System32 나 C:\Windows\SysWOW64 에 있는 java.exe, javaw.exe, javaws.exe 삭제
이후 다시 java –version로 정상임을 확인하셔야 합니다.
B. 인텔리J 커뮤니티버전 다운로드 및 설치
https://www.jetbrains.com/idea/download/에서 최신버전의 인텔리제이 커뮤니티 버전을 다운로드하여 설치합니다.
2. 빈 프로젝트 생성
인텔리제이를 실행하시고 새로운 프로젝트를 생성합니다.
위 두가지 방식으로 프로젝트를 생성을 할 수 있습니다.
먼저 Empty Project를 선택합니다. 실무에서는 모듈단위로 개발하는 경우가 많아서, 처음부터 Maven이나 Gradle을 선택해서 만들기 보다, Empty Project를 만들고 거기에 모듈을 추가하는 방식이 더 좋은 것 같습니다.
그리고 프로젝트 명과 프로젝트 위치를 입력 후 Finish버튼을 눌러 빈 프로젝트를 생성합니다.
3. 프로젝트내에 모듈 생성
만들어진 빈 프로젝트에 Gradle 모듈을 생성해 보겠습니다.
프로젝트를 생성하면 위와 같은 Project Structure 창이 자동으로 뜹니다. 나중에 필요하면 메뉴에서 File > Project Structure(Ctrl+Shift+Alt+S)로 다시 열 수 있습니다.
Gradle을 선택하고 Project SDK로 Java1.8이상을 선택합니다. 위에서 OpenJDK를 설치했다면 그것을 선택해주세요. Additional Libraries and Frameworks에 Java가 기본 선택된 것을 확인합니다. Next를 클릭하세요.
GroupId와 ArtifactId, Version을 적고 Next를 클릭합니다.
Use auto-import가 체크되어 있는지 확인하세요. 그리고 Use default gradle wrapper (recommended)가 체크되어 있으면 Gradle을 프로젝트에서 지정한 Gradle버전을 사용하게 됩니다. 그러므로 이 옵션을 선택하는 것을 추천드립니다.
다 확인하셨으면 Next를 클릭하세요.
모듈명을 입력하고 Content root와 Module file location을 확인하세요. 여기서는 모듈명을 test로 해봤습니다.
프로젝트 생성시 Gradle이 동작하며 필요한 프로젝트 요소들을 가져오게 됩니다. 윈도우에서 아래처럼 보안경고 뜨면 액세스 허용하세요.
드디어 모듈이 1개인 프로젝트가 생성되었습니다.
4. Gradle 설정
Gradle 프로젝트이므로 Spring boot 환경을 구축하기 위해 Gradle설정을 해야 합니다.
방금 생성한 test 모듈에서 build.gradle을 열면 위와 같은 gradle 코드를 볼 수 있습니다.
Spring boot 환경을 만들기 위한 기본 gradle 설정을 해보겠습니다. 위 코드를 지우고 아래 코드로 덮어 씌우세요.
buildscript { ext{ springBootVersion='2.0.4.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group 'com.bsidesoft' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-web') testCompile group: 'junit', name: 'junit', version: '4.12' }
대략 보면 Spring boot를 사용하기 위한 가장 기본적인 코드가 작성되었습니다. Auto-import를 해뒀기 때문에 잠시 후 자동으로 다운로드 받아 모듈에 관련 라이브러리들이 받아와질 것입니다.
5. 코드 작성
Spring boot를 테스트 해보기 위해 Application과 Controller 클래스를 만들 것입니다.
위 화면처럼 main/java/com/bsidesoft에 Application 클래스를 만들고 같은 위치에 controller 패키지를 만든 다음 HomeController 클래스를 만드세요. 그리고 각각 아래 내용을 복사에서 붙여 넣으세요.
//Application.java package com.bsidesoft; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String arg[]){ SpringApplication.run(Application.class, arg); } }
위처럼 @SpringBootApplication 애노테이션을 붙이면 이 클래스가 Spring Boot 애플리케이션이 실행시 진입 클래스임을 가리키게 됩니다. 실행하면 static main()함수가 맨처음 실행하게 됩니다. SpringApplication.run()함수를 실행하면 비로소 스프링이 구동됩니다.
//MainController.java package com.bsidesoft.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HomeController { @RequestMapping("/") public String index(){ return "확인!"; } }
위 코드는 HTTP환경에서 http://도메인:포트/로 접근할 때 “확인!”을 출력해줍니다. @RestController 애노테이션을 붙이면 @ResponseBody를 안붙여도 메서드에서 반환한 String문자열이 응답값이 됩니다.
Spring boot는 별다른 설정없이도 개발코드를 작성하면 바로 실행할 수 있는 환경을 갖춰줍니다. 너무 쉽게 되어 기존 Spring이라면 생각할 수도 없는 일이네요.
6. 실행하기
A. gradlew로 빌드하고 실행하기
이제 빌드 후 실행해볼 차례입니다. 우리가 만든 test모듈에는 아래 파일이 존재합니다.
gradlew와 gradlew.bat가 그것인데요.
gradlew는 유닉스용 실행 스크립트입니다. Terminal에서 gradle build로 gradle을 직접 실행할 때 발생할 수 있는 컴파일이나 빌드 호환성 문제를 gradlew를 이용해 해소할 수 있습니다. gradlew.bat는 윈도우에서 실행하기 위한 점만 다릅니다.
이제 인텔리제이 하단에 Terminal 탭을 열고 아래처럼 cd 명령어로 test모듈로 들어가 gradlew로 test를 빌드해봅니다. gradlew build로 합니다.
잠시후 위처럼 화면이 나오면 성공입니다. 그럼 만든 test 모듈을 gradlew bootRun 명령으로 실행합니다.
위 화면처럼 나오면 성공입니다. 그럼 여러분은 웹브라우져를 열고 http://localhost:8080/ 으로 접근해보세요. 아래와 같은 화면이 나오면 정상적으로 동작한 것입니다.
Terminal에서 Ctrl+C를 누르시고 아래 화면처럼 Y를 입력을 하면 종료됩니다.
참고로 아래처럼 실행할 수 없는 경우도 생길 수 있습니다.
에러 로그를 찾아봐서 아래와 같이 출력되어 있다면 사용을 시도한 8080포트가 이미 다른 프로세스에 의해 사용중일 가능성이 큽니다.
이런 경우엔 아래처럼 netstat -ano | findstr :8080 로 점거중인 프로세스를 찾아주세요.
그리고 아래처럼 taskkill 명령으로 해당 프로세스를 강제로 종료할 수 있습니다.
하지만 위처럼 종료되지 않는 경우라면…. src/main/resource 폴더에 application.properties를 만들고 server.port=8888를 잡고 다시 gradlew bootRun을 다시 해보세요. 8080이 아닌 http://localhost:8888로 접근하면 정상적으로 실행될 것입니다.
application.properties는 Spring boot가 읽어들이는 설정파일입니다. 자세한 내용은 Spring boot 공식 문서를 직접 확인하세요.
B. 인텔리제이에서 직접 실행하기
인텔리제이를 쓰고 있기 때문에 통합도구를 이용하면 더욱 편하게 실행할 수 있습니다.
위 화면처럼 Application 클래스를 열고 코드 위에서 마우스 오른쪽 버튼을 누른다음에 Run ‘Application.main()’을 선택하시면 실행이 됩니다.
이렇게 실행하면 위 화면처럼 Configurations에 자동으로 등록되고 실행됩니다.
Edit Configurations로 들어가면 아래 화면처럼 자동등록된 Configuration정보를 보실 수 있습니다.
Spring boot는 첫 Spring 개발을 하는데 정말 편리한 기능을 제공해주는 것 같습니다.
7. 템플릿 엔진, 타임리프 사용해보기
JSP가 아닌 타임리프(Thymeleaf) 템플릿 엔진을 이용해 HTML 화면을 출력해 보겠습니다. 인텔리제이 무료버전은 JSP에 코드 하이라이트를 제공해주지 않아서 불편하기에 순수 html기반의 타임리프를 쓰면 훨씬 좋을 것 같습니다. 먼저 build.gradle에 위처럼 타임리프 의존성을 추가해 줍니다.
그리고 controller패키지에 아래처럼 TestController를 추가해줍니다.
package com.bsidesoft.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { @RequestMapping(value = "test1") public String tmpl(Model model){ model.addAttribute("id", 1); model.addAttribute("name", "지용호"); model.addAttribute("nickname","지돌스타"); model.addAttribute("photo", "images/test.jpg"); return "test1"; } }
@RestController가 아닌 @Controller 애노테이션을 사용했음을 확인하세요. 그리고 http://localhost:8080/test1으로 접근했을 때 실행될 메소드 tmpl()를 정의합니다. 인자값에 model이 전달되며 이 model에 템플릿 엔진에 전달할 데이타를 추가했습니다. 그리고 return “test1″로 이 실행할 템플릿 파일 이름을 반환합니다.
이제 컨트롤러에서 전달할 데이타를 렌더링할 템플릿을 만들어 보겠습니다.
resource폴더에 templates폴더를 만들고 아래처럼 test1.html을 만듭니다. 컨트롤러에서 “test1″으로 반환했으므로 html 이름을 “test1.html”로 한 것입니다.
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"&amp;amp;amp;gt; <title>Test1</title> </head> <body> <p>ID : <span th:text="${id}"></span></p> <p>NAME : <span th:text="${name}"></span></p> <p>NICKNAME : <span th:text="${nickname}"></span></p> <p> PHOTO : <br> <img th:src="${photo}"> </p> </body> </html>
xmlns:th=”http://www.thymeleaf.org”는 이 html이 타임리프 템플릿임을 가리킵니다. 그리고 태그에 th:text=”${id}”이나 th:src=”${photo}”식으로 데이타를 출력할 수 있도록 변수를 선언합니다. 타임리프 사용하는 방법은 다음 링크에서 자세하게 공부할 수 있습니다.
정적 리소스인 http://localhost:8080/images/test.jpg를 로드할 수 있도록 resource폴더에 static/images폴더를 만들고 test.jpg를 추가합니다. 이렇게 resource/static에 정적 파일을 두는 규칙은 Spring boot에서 제공합니다. 개발자는 이 규칙에 따라 정적파일을 배치하면 됩니다. 물론 바꿀 수 있는 방법도 제공합니다.
위에서 지시한 것 같이 파일들을 작성했다면 다음 화면과 같이 각 파일들이 배치될 것입니다.
이제 실행 후 브라우저에서 http://localhost:8080/test1 으로 접근해보세요.
위처럼 나오면 타임리프 템플릿을 이용해 데이터를 성공적으로 출력한 것입니다.
8. JSP 기반으로 만들기
고객 사정에 따라서 JSP를 사용해야 하는 경우는 얼마든지 있습니다. 그러므로 JSP도 사용해보겠습니다. 안타깝게도 Spring boot는 jsp를 제대로 지원해 주지 않습니다. 그래서 몇가지 추가를 해야합니다.
A. 타임리프 의존성 삭제, jasper 및 jstl 을 의존성 추가
build.gradle에서 의존성 부분에 타임리프는 삭제하고 jasper와 jstl을 추가합니다.
dependencies { compile('org.springframework.boot:spring-boot-starter-web') compile('org.apache.tomcat.embed:tomcat-embed-jasper') compile('javax.servlet:jstl:1.2') testCompile group: 'junit', name: 'junit', version: '4.12' }
B. jsp 폴더 지정
application.properties를 resources폴더에 만들고 내부에 아래 코드를 추가합니다.
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
C. jsp 추가
resources 폴더에 META-INF/resources/WEB-INF/jsp 폴더를 만듭니다. 그리고 test1.jsp를 아래처럼 작성하세요.
<%@page contentType="text/html; charset=utf-8"%> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JSP</title> </head> <body> <p>ID : ${id}</p> <p>NAME : ${name}</p> <p>NICKNAME : ${nickname}</p> <p> PHOTO : <br> <img src="${photo}"> </p> </body> </html>
위 jsp코드에서 title을 JSP로 했습니다. 나중에 제대로 만들어졌다면 웹브라우저 제목에 JSP가 표시될 것입니다.
아쉽게도, 무료 인텔리제이에서 JSP 코드는 하이라이트 표시가 안됩니다. 복잡하게 작성할 때는 많이 불편할 것 같습니다.
이미 작성한 컨트롤러는 수정할 필요가 없습니다.
이제 실행한 뒤, http://localhost:8080/test1 에 접속해 보세요.
브라우저 제목에 JSP가 표시되었다면 jsp로 만들어졌음을 알 수 있습니다.
결론
무료 버전 인텔리제이에서 간단히 Boot Spring 에 대한 기본 설정을 잡아 실행해 봤습니다. 처음 시작하는 분들에게 도움이 되었으면 합니다. 감사합니다.
글은 괜찮은데 음영이랑 글씨색이랑 너무 비슷해서 보기 힘드네요..ㅠ
지적 감사합니다! 저희 홈페이지 테마가 바뀌면서 문제가 생겼는데요. 조만간 수정하도록 하겠습니다.
수정완료했습니다. 이제 편히 보시길 바랍니다.
안녕하세요, 작성하신 내용 진행해보고있는데 구글링으로 해결되지 않는 문제가 있어 문의드립니다.
build.gradle 을 group, version 모두 동일하게 하여 소스 그대로 copy하였는데.
What went wrong:
A problem occurred configuring root project ‘Test’.
> Could not resolve all artifacts for configuration ‘:classpath’.
> Could not resolve org.springframework.boot:spring-boot-gradle-plugin:2.0.4.RELEASE.
Required by:
project :
> Could not resolve org.springframework.boot:spring-boot-gradle-plugin:2.0.4.RELEASE.
> Could not get resource ‘https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-gradle-plugin/2.0.4.RELEASE/spring-boot-gradle-plugin-2.0.4.RELEASE.pom’.
> Could not GET ‘https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-gradle-plugin/2.0.4.RELEASE/spring-boot-gradle-plugin-2.0.4.RELEASE.pom’.
> Connection reset
계속하여 Connection reset 에러가 발생 중입니다. 여러 구글링 통하여 문제점 해결해 보려했으나 풀리지 않아 문의드려봅니다..
혹시 예상되는 문제 포인트가 있으실까요.. ?감사합니다.
open JDK 11버전, gradle 6.8.3 입니다..
C:\Users>gradle -v
Gradle 6.8.3
Build time: 2021-02-22 16:13:28 UTC
Revision: 9e26b4a9ebb910eaa1b8da8ff8575e514bc61c78
Kotlin: 1.4.20
Groovy: 2.5.12
Ant: Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM: 11.0.10 (AdoptOpenJDK 11.0.10+9)
OS: Windows 10 10.0 amd64
C:\Users>java -version
openjdk version “11.0.10” 2021-01-19
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.10+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.10+9, mixed mode)
네 안녕하세요. 글이 오래되었고 스프링은 더 버전업 했으니 최신 스프링으로 해보시길 바랍니다. open JDK 14로 해보시길 바랍니다.
https://start.spring.io/ 를 이용하셔도 좋습니다. 여기서 프로젝트를 만들어 생성한 뒤 인텔리제이에서 열어서 작업하셔도 될 것 같습니다.
아니제가 찾던문제가 여기있었네요 너무감사합니다. community 버전으로 하려고 했는데 거의 1주일을 헤맸네요 …. 복받으세여