Java Category/Spring

[Spring 입문] 프로젝트 환경 설정

ReBugs 2024. 1. 19.

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.


라이브러리 살펴보기

External Libraries

Project 창에서 "External Libraries"를 찾을 수 있는데, 이 External Libraries를 보면 가져온 라이브러리들이 무엇인지 볼 수 있다.

해당 폴더를 펼치면 어떤 라이브러리들이 포함되어 있는지 알 수 있다.

하지만 항목들이 너무 많기 때문에 뭐가 뭔지 알기가 힘들다.

이럴 때에는 Gradle 탭을 활용하면 좋다.

 

Gradle 탭

Gradle 탭의 Dependencies를 보면 선택한 라이브러리를 볼 수 있다.

Denpendencies는 의존성이라는 뜻인데, gradle(maven)의 의존 관계를 관리해준다.

Dependencies 항목을 열어보면 각 항목이 있는 것을 볼 수 있는데, 다시 그 항목을 열어보면 다른 항목들이 있는 것을 볼 수 있다.

상위 항목이 하위 항목에 의존한다.

즉, 필요로 한다라는 뜻이다.

예를 들어 spring-boot-starter-web을 열어보면 다음과 같이 다른 항목들이 있음을 볼 수 있다.

spring-boot-starter-web을 보면 밑에 json, tomcat, spring-boot-starter, spring-web, spring-webmvc가 있다.

이는 spring-boot-starter-web을 사용하기 위해서는 위 항목들이 필요하다는 뜻이다.

이런 식으로 해당 기능을 사용하기 위해 다른 어떤 기능들이 필요한지 계층 구조로 보여준다.



중요한 항목은 아래와 같다.

  1. spring-boot-starter-web을 열어보면 하위에 tomcat이 있다. tomcat은 웹 서버에 내장되어 있다.
    이전에는 웹 서버에 tomcat을 직접 설치했어야 했지만 현재는 따로 설정을 하지 않아도 된다.
  2. spring boot starter web -> json -> web 에 들어가면 spring-core 또한 가져오고 있음을 알 수 있다.

 

Log

Java에서 텍스트를 출력할 때에 System.out.println 을 사용하지만, 실무에서는 저 함수를 사용하는 것이 아니라 Log로 출력해야 한다.

그 이유는 Log 파일을 따로 만들어야 심각한 에러들을 따로 모아보는 식으로 분류를 하여 로그 파일들을 관리할 수 있기 때문이다.

Log를 편하게 해주는 라이브러리
spring-boot-starter-thymeleaf를 열어보면 spring-boot-starter-logging이 있다.
다시 이 항목을 열어보면 slf4j와 logback이라는 항목이 있다.
slf4j는 인터페이스이고, 실제 로그를 어떤 구현체로 출력할까는 logback으로 선택한다. logback이 성능도 빠르고 지원하는 것들이 많다.
이 두 항목이 Log를 좀 더 편하게 사용할 수 있도록 도와준다.

 

test와 관련된 라이브러리

test와 관련된 라이브러리들도 확인할 수 있다.

java에서 많이 사용하는 junit을 확인할 수 있는데, spring은 java기반이기 때문에 spring 또한 junit을 많이 사용한다.

mockito, assertj도 있는데, 이 항목들은 test를  편리하게 해주는 라이브러리들이다.

spring-test 항목도 확인할 수 있는데, 이 라이브러리는 spring과 통합해서 test할 수 있게 해주는 라이브러리이다.

핵심은 junit 라이브러리이다.


View 환경설정

Welcome page 만들기

spring boot는 resources/static/index.html 파일을 넣으면 해당 파일을 welcome page로 만들어준다.

main - resources - static 폴더에 오른쪽 클릭을 하고 new File을 눌러서 indexl.html을 만들어주자.

그럼 이 페이지가 welcome page가 될 것이다.

이후 index.html에 내용을 적고 서버를 실행하면 해당 화면으로 바뀔 것이다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/hello">hello</a>
</body>
</html>
welcome page에 대해 좀 더 알고 싶다면 spring boot reference doc을 참고
https://docs.spring.io/spring-boot/docs/3.2.1/reference/htmlsingle/

 

Thymeleaf 템플릿 엔진(Template engine)

위에서 만든 것은 "정적 페이지 : static"이다. 

html에서 적어놓은 파일을 웹 브라우저에 그대로 넘기는 것이다. 파일을 그대로 넘긴 것이다.

하지만 Template engine을 사용하면 본인이 원하는대로 프로그래밍을 해서 html의 모양을 바꿀 수 있다.

우리가 이번에 사용하는 템플릿 엔진은 Thymeleaf라는 템플릿 엔진인데, 버전 3으로 넘어오면서 많은 부분이 개선되었다.

spring boot features에서 Template engines를 검색하면 어떤 종류의 템플릿 엔진이 있는지 볼 수 있다.

 

Controller와 Model을 이용하여 화면 만들기

Controller와 Model을 이용하여 동작하는 화면을 만들어보자.

1. 먼저 java - Practice1.practicespring 밑에 controller package를 하나 만든다.

그리고 HelloController 클래스를 하나 생성한다.

2. HelloController에 @Controller라는 어노테이션을 적어 spring에서 컨트롤러임을 인식하도록 한다.

해당 클래스 밑에 helloFunction이라는 메서드를 하나 생성하고, @GetMapping("hello")를 적어준다.

@GetMapping("hello") 어노테이션을 적게 되면 웹 어플리케이션 url에서 /hello가 붙게 되면 spring에서 해당 메서드를 호출한다.

package hello.hellospring.controller;

@Controller
public class HelloController {
    @GetMapping("hello")
    public String hello(Model model){
    
    }
}

 

3. hello() 를 정의해주자. 여기서 매개변수로 전달해준 Model은 MVC 패턴에서의 Model이다.

addAttribute를 통해 값을 추가해준다.

여기서 눈 여겨 볼 사항은 문자열 "hello"를 반환한 것인데, 간단하게 말하자면 resources/templates의 hello.html을 찾으라는 뜻이다.

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", "spring");
        return "hello";
    }
}

 

4. resources/templates에서 New File을 눌러 hello.html을 생성하고 다음과 같이 작성하자.



<!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>

두 번째 줄의 링크는 thymeleaf를 스키마로 선언한 것이며, 이를 통해 thymeleaf 템플릿 엔진의 문법을 사용할 수 있게 된다.

또한 중간 중간 보이는 th는 thymeleaf의 약자이다.

${data}를 볼 수 있는데, 이는 model 객체에 있는 data라는 key 값에 해당하는 value값으로 대입된다.

이후 intelliJ로 빌드를 하고, herf로 되어있는 hello를 누르면 "안녕하세요, hello!!"가 화면에 뜰 것이다.

 

 동작 환경 그림

1. 웹 브라우저에서 localhost:8080/hello 를 요청하면 spring boot에 내장되어있는 웹 서버인 tomcat에게 요청 사항을 전달한다. tomcat은 다시 spring에게 hello 요청을 전달한다.

 

2. spring은 우선 controller인 helloController에 @GetMapping("hello")로 맵핑 되어 있는 함수 hello()를 찾아서 실행한다.

 

해당 함수에서는 Model이 매개변수로 들어오는데, spring이 Model 객체에 key는 data이고, value는 hello!!인 attribute를 추가한다. 그리고 "hello"를 반환한다.

 

3. Controller에서 return 값으로 string을 반환하면, viewResolver가 화면(view)를 찾아서 처리를 해준다.

이 때, view mapping이 이루어지는데, view mapping이란 resources/templates/(ViewName).html 경로로 되어있는 파일을 찾는데 여기서 ViewName을 return 값인 hello로 대입하는 것을 말한다.

 

4. Thymeleaf 템플릿 엔진이 viewResolver가 찾아준 hello.html을 렌더링하여 웹 브라우저에 띄운다.

hello.html에 ${data}에는 Controller의 hello()에 있는 model 객체에 추가한 attribute의 key값이다.

실제로 이 view를 렌더링 할 때에는 key에 해당하는 value 값. 즉 hello!!로 렌더링이 된다.

 

spring-boot-devtools 라이브러리 추가
이 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다.

1. 의존성 추가 (build.gradle 수정)
dependencies {
	implementation 'org.springframework.boot:spring-boot-devtools'
}​


2. IntelliJ 설정
1) Setting > Build, Exeution, Deployment > Compiler > Build project autiomaically 체크


2) Advanced Settings > Allow auto-make to start even if developed application is currently running 체크


3. Reload Gradle Changes 클릭


이 설정이 처음이라면 인텔리제이를 재시작한다.

 

빌드하고 실행하기

윈도우 개발환경 기준

 

프로젝트 파일은 D:\Programming\intelij\Spring\hello-spring\hello-spring 경로에 있다.

따라서 cmd에서 이 경로로 이동해야한다.

D드라이브에 프로젝트 폴더가 있기 때문에 D 드라이브로 이동한다.

 

gradlew build 명령어를 이용하여 빌드를 한다.

build 폴더가 생긴것을 확인할 수 있다.

 

이제 실행을 하려면 아래의 과정을 거치면 된다.

bulid 폴더로 이동하고, 그 안에 있는 libs 폴더로 이동한다.

그 다음 dir 명령어를 통해 폴더 내부에 무엇이 있는지 살펴본다.

-plain 이 붙은 파일이 아닌 jar 파일을 실행한다.

java -jar hello-spring-0.0.1-SNAPSHOT.jar

이러면 정상적으로 실행이 된 것이다.

 

빌드 삭제하기
다시 D:\Programming\intelij\Spring\hello-spring\hello-spring 경로로 이동해야 한다.

이후 gradlew clean 명령어를 입력하면 build 폴더 통째로 사라진다.

댓글