목차

sun cloud


스프링부트로 프로젝트 생성하기

본 수업은 인프런에서 제공하는 김영한님의 무료 강의 스프링 입문 강좌의 복습 내용입니다.

수업 때 다루지 않은 내용들을 위주로 글을 작성할 예정이며, 사전 준비로 Java 11 버전과 IntelliJ를 설치를 권장합니다.


스프링 프로젝트는 스프링에서 운영하고 있는 https://start.spring.io에서 간단히 생성할 수 있습니다.

image

Project 항목은 과거에는 Maven을 많이 사용했지만, 최근 대부분의 회사들에서는 Gradle을 사용한다고 합니다.

스프링 부트 버전은 정식 릴리즈(다른 문자가 붙지 않은) 버전 중 최신 버전으로 선택하였고, 연습용 프로젝트이기에 Group(주로 기업 고객명)과 Artifact(빌드되어 나오는 결과물) 등을 위와 같이 간단히 작성했습니다.

Dependencies가 중요한데, 어떤 라이브러리를 가져와 사용할 지 선택하는 부분입니다.
Spring web(웹 프로젝트 생성 시 사용)과 Thymeleaf(html을 만들어주는 템플릿 엔진)를 추가해주시면 됩니다.

설정을 마친 후 GENERATE 버튼을 눌러 압축 파일을 다운받을 수 있으며, 압축을 해제한 뒤 IntelliJ에서 열어서 사용하게 됩니다.

처음 프로젝트를 가져올 때에는 외부에서 파일들을 받아와야 하기 때문에 다소 시간이 소요될 수 있습니다.



설치가 되었다면 build.gradle이라는 파일을 찾아 볼 수 있는데, Gradle이 버전 설정과 라이브러리를 가져오는 것을 확인할 수 있습니다.

dependencies에는 라이브러리들이 명시되어 있는데, JUnit의 경우 스프링 부트에서 자동적으로 지원해주는 라이브러리입니다.

위에서 명시한 라이브러리들은 repositories에 명시된 mavenCentral()을 통해 mavenCentral이라는 공개된 사이트에서 받도록 설정되어 있습니다.(필요 시 특정 사이트의 url을 명시할 수 있습니다)


.gitignore파일 또한 자동적으로 생성해주는데, 필요한 소스 코드 파일만 올라갈 수 있도록 작성되어 있습니다.

gradlewgradlew.bat 파일은 Gradle 빌드 과정에서 설명하도록 하겠습니다.

다음으로 자동으로 생성된 클래스 파일을 열어보면 아래와 같이 어노테이션과 메인 메서드가 미리 작성되어 있는 것을 확인할 수 있습니다.

image

실행 결과 Cause: invalid source release:11 에러가 발생한다면 설치된 IntelliJ에 설정된 버전 정보를 확인하신 후 11로 맞춰주시면 됩니다.(file - Project Structure - Project 설정을 보시면 버전을 확인하실 수 있습니다.)

java 11


그 외에도 혹시 8080 포트를 이미 사용중이셨다면 src/main/resources/application.propertiesserver.port = 9090 내용을 추가해주시면 9090 포트를 사용하실 수 있습니다.



실제 라이브러리들

External Libraries로 가보시면 저희가 가져오지 않은 상당히 다양한 라이브러리들이 이미 들어와 있습니다.

빌드 시 꼭 필요한 기본적인 라이브러리들이 들어있는데 여기에는 저희가 받아온 라이브러리들이 의존하고 있는 라이브러리들 역시 포함되어 있습니다.

image

위 그림의 항목을 보시면 tomcat이 들어있는 것을 볼 수 있습니다.
스프링 부트를 사용하기 전에는 서버와 연결하기 위해 서버를 설치하고, 정보를 직접 설정했어야만 사용할 수 있었던 것을 라이브러리를 통해 정말 간단히 사용할 수 있게 되었습니다.

최근 세미 프로젝트를 진행했을 때에도 연습 삼아 처음부터 다시 세팅을 했는데. 이게 생각보다 시간을 꽤 잡아먹었어서 고충을 잘 알고 있습니다만, 스프링 부트를 사용하면 앞으로 그런 고생을 할 필요가 없을 것 같아 무척 기쁘군요👏


그리고 spring-boot-starter를 보시면 정말 최근 수업에서 사용했던 logging 라이브러리 역시 확인할 수 있는데, 현업에서는 System.out.println() 메서드는 사용하지 않고, 꼭 로깅을 한다고 합니다.

수업에서는 log4j2를 사용했었지만 최근에는 slf4jlogback을 함께 많이 사용해서 이 두 라이브러리들이 표준에 가까워졌다고 합니다.

간단히 설명을 덧붙이자면, slf4j는 로깅 관련 라이브러리들을 추상화한 interface이고, logbacklog4j의 단점을 개선하기 위해 만든 로깅 라이브러리입니다.


강의 중 정리주신 주요 라이브러리 목록을 보면 다음과 같습니다.

스프링 부트 라이브러리

  • spring-boot-starter-web
    • spring-boot-starter-tomcat: 톰캣(웹서버)
    • spring-webmvc: 스프링 웹 MVC
  • spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
  • spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
    • spring-boot
      • spring-core
    • spring-boot-starter-logging
      • logback, slf4j

테스트 라이브러리

  • spring-boot-starter-test
    • junit: 테스트 프레임워크
    • mockito: 목 라이브러리
    • assertj: 테스트 코드를 조금 더 편하게 작성할 수 있도록 도와주는 라이브러리
    • spring-test: 스프링 통합 테스트 지원



View 환경설정

src/main/resources/static/index.html을 생성해서 Welcome page를 만들어보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>Hello</title>
</head>
<body>
    Hello
    <a href="/hello">hello</a>
</body>
</html>


다음으로 템플릿 엔진이 잘 작동하는지 확인해볼텐데 우선 Controller(웹 어플리케이션에서 첫 번째 진입점)를 작성해야 합니다.

hello.hellospring.controller 패키지에 HelloController입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello";
    }
}


브라우저에서 get 방식으로 http://localhost:8080/hello url을 요청하면, Controller에서는 helloGetMapping 되어 있는 HelloController를 찾습니다.
그리고 hello() 메서드가 실행되어 modeldata라는 키로 hello!! 값을 할당한 뒤 return 값인 "hello"가 호출됩니다.
그러면 이름이 hello인(templateshello.html을 작성할 예정입니다) 파일을 찾아 model을 넘기면서 렌더링을 시도하게 됩니다.(동작 과정은 템플릿 파일 작성 후 보여드리도록 하겠습니다)

이제 템플릿에 가서 hello.html을 작성합니다.

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
    <p th:text="'안녕하세요. ' + ${data}">안녕하세요. 손님</p>
</body>
</html>

8번 라인의 코드를 보시면 p 태그 안에 th:text=""가 있는데, 2번 라인에서 타임리프로 선언한 코드입니다. text="" 안에 작성된 data는 Controller에서 model.addAttribute() 했던 key이고 결과적으로 value를 가리킵니다.

(URI is not registered 주의 문구가 생성되는 것은 무료 버전을 사용할 경우 자동완성 기능을 지원해주지 않기에 유료 버전을 사용하시거나 2번 라인 코드에서 alt + enter를 누르신 후 Ignore external resource를 선택하시면 됩니다..😭)

그래서 http://localhost:8080/hello 실행 결과 다음과 같이 출력되는 것을 확인할 수 있습니다.

image


위와 같은 동작이 이루어지는 과정은 아래의 그림과 같습니다.

image

(_본 강의는 김영한님의 <스프링 입문=""> 무료 강의입니다. 위의 그림은 수업 자료의 일부입니다_)

앞에 설명드렸듯이 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버(viewResolver)가 화면을 찾아 처리하게 됩니다.(스프링부트 템플릿엔진 기본 viewName이 매핑되는데, resources:templates/ + {ViewName} + .html 과 같이 처리가 됩니다.)




빌드하고 실행하기

빌드와 실행은 ./gradlew => gradlew.bat 를 실행하면 됩니다.

명령 프롬프트에서는 gradlew.bat build 명령어로 실행할 수 있습니다.

정상적으로 실행이 된다면 build 디렉토리에 파일들이 생성될텐데 해당 경로에서 dir 명령어로 파일 목록을 확인한 뒤 java -jar명령어의 뒤에 실행 할 jar 파일을 붙여주시면 됩니다.

java -jar hello-spring-0.0.1-SNAPSHOT.jar와 같이 실행할 수 있습니다.



그런데 저는 IntelliJ에서 jdk 버전 설정을 11로 마쳤음에도 빌드가 정상적으로 처리되지 않아 다소 어려움을 겪었습니다.
수업에서 java 8 버전을 사용하기에 환경변수의 JAVA_HOME 설정을 1.8 그대로 두었는데 이전 버전을 삭제하자니 수업에 어려움이 있기에 다른 방법으로 해결하고자 노력했지만 모두 실패하고 말았는데, 정말 감사하게도 함께 수업을 듣고 있는 동기분께서 도움을 주셔서 극적으로 해결을 했습니다.

(참고: https://pasudo123.tistory.com/419)

위의 블로그 글을 토대로 진행했습니다.

우선 C:\develop\env 경로에 java8.bat, java11.bat 파일을 생성합니다.

내용은 다음과 같습니다.

java8.bat

1
2
3
4
5
@echo off
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_301
set PATH=%JAVA_HOME%\bin;%PATH%
echo Display Java8 version
java -version


java11.bat

1
2
3
4
5
@echo off
set JAVA_HOME=C:\Program Files\Java\jdk-11.0.12
set PATH=%JAVA_HOME%\bin;%PATH% 
echo Display Java11 version 
java -version


그리고 환경변수에서 파일들을 생성한 디렉토리를 path에 추가해주신 뒤 cmd로 해당 위치에서 사용하고자 하는 java8 또는 java11을 입력해주시면 두 가지 버전의 jdk를 별도의 설치와 제거 없이 간단히 변경하며 사용하실 수 있습니다.




맨 위로 이동하기

Spring 카테고리 내 다른 글 보러가기

댓글남기기