스프링 입문 1. 강의 소개, 환경 설정

박철민·2023년 4월 13일
0

스프링 입문

강의 소개


강의 소개

실제 수강 날짜 : 23-04-10

강의의 목표

이 강의의 목표는 MVC 패턴과 실무적인 스프링부트 기술을 경험해보는 것입니다.
간단한 웹 애플리케이션을 개발하고 기초부터 차근 차근 하는 것이 목표입니다!

프로젝트 사용기술:
Spring Boot, JPA, Tomcat, Gradle, HIBERNATE, Thymeleaf

스프링 입문이라는 강의를 통해서 내가 어느 정도 스프링에 대해 알고 있는지를 알아보자!


프로젝트 환경설정

프로젝트 생성

실제 수강 날짜 : 23-04-10

statr.spring.io

스프링 프로젝트를 처음 생성을 도와주는 사이트인 https://start.spring.io/가 있습니다.
이를 통해서 우리는 환경 설정을 간단하게 할 수 있습니다.

Gradle, Maven 설정, 언어 설정, 스프링 부트 버전, 등등

이 사이트를 사용하지 않는다면 스프링 부트와 맞는 디펜던시를 일일이 찾아서 넣어줘야 합니다.

디펜던시 추가

이제 실습을 위해서 디펜던시를 넣어줍니다!

여기서 추가되는 디펜던시들은 Spring에서 권장하는 그리고 선택한 스프링 부트의 버전과 맞는 디펜던시들입니다.

디펜던시 목록

  • Spring Web : Spring Web provides integration features such as multipart file upload functionality and the initialization of the IoC container using Servlet listeners and a web-oriented application context. It also contains an HTTP client and the web-related parts of Spring remote support. Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.
  • Thymeleaf : HTML을 만들어주는 템플릿 엔진, 템플릿 엔진은 템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 합성하여 결과 문서를 출력하는 소프트웨어 또는 소프트웨어 컴포넌트를 말한다.

디펜던시란?
디펜던시 인젝션으로 우리에게 익숙한 디펜던시는 의존성이라는 뜻을 가지고 있습니다. 의존성은 어느 객체가 다른 객체에 의존하고 있는 것을 의미합니다.
여기서의 디펜던시는 외부 라이브러리라는 의미로 사용됩니다.

이렇게 설정한 프로젝트를 이제 Generate를 통해서 생성합니다. 생성된 프로젝트는 곧바로 실행할 수 있습니다.

프로젝트 보기

프로젝트를 이제 살펴봅시다.
프로젝트는 진행하는데 필요한 것들이 설정되어 있습니다.

다음과 같이 프로젝트들이 설정되었습니다.

main에는 서버 관련된 Java코드들이 있습니다.
test에는 테스트 관련 코드가 들어있습니다.
=> 공식에서 권장할 만큼 TDD가 중요하다는 것을 알수
있습니다.

resources에는 프로젝트에 필요한 파일들을 넣어두는 곳입니다.

이제 build.gradle을 한 번 보겠습니다.

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.5'
	id 'io.spring.dependency-management' version '1.1.0'
}

group = 'helllo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

이 build.gradle은 설정 파일입니다.
dependencies를 보면 우리가 설치한 외부 라이브러리들이 담겨 있는 것을 알 수 있습니다.

여기서 특이한 점이 있다. 우리가 설치한 라이브러리는 2개였는데 testImplementaion이라는 테스트 관련 라이브러리가 들어있음을 확인할 수 있습니다.
이는 스프링에서 기본적으로 Junit5를 내장하여 TDD권장하는 것입니다

여기 dependencies에 적은 라이브러리들은 mavenCentral을 통해서 다운로드가 됩니다.

프로젝트 실행

이제 설치된 프로젝트를 실행해봅시다.

다음과 같이 정상 작동을 확인 할 수 있습니다.

프로젝트가 실행이 되면 어떤 일이 벌어질까요?
SpringApplication.run 메서드가 실행됩니다.

이때 SpringBootApplication 어노테이션이 실행이 되면 이를 띄워서 내장되어 있는 톰캣을 자체적으로 띄우면서 스프링부트가 같이 올라가게 됩니다!

이에 대해서는 좀 더 자세히 조사하여 스프링 부트 동작 시 벌어지는 일이라는 내용으로 포스트 하겠습니다.


라이브러리 살펴보기

이제 다시 build.gradle을 살펴보면 우리는 총 3개의 디펜던시가 기록되어 있는 것을 알 수 있습니다.
그러나 설치된 라이브러리들을 보면 더 많은 라이브러리들이 있는 것을 확인할 수 있습니다.

왜 이렇게 많은 라이브러리들이 있는 걸까요?
-> 라이브러리들은 서로 서로 의존하고 있기 때문입니다!

그렇기 때문에 우리가 적은 라이브러리들이 의존하고 있는 다른 라이브러리들이 자동으로 다운로드 됩니다! 그렇기 떄문에 더 많은 라이브러리들이 설정되어 있습니다.

중요한 라이브러리들은 다음과 같습니다.

스프링 부트 라이브러리
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 환경 설정

이제 화면을 살펴 봅시다. 위에 그냥 실행하였을 때 에러 화면이 뜨는 것을 알 수 있습니다. 이는 홈 화면을 설정하지 않았기 때문에 벌어지는 에러입니다.

그렇다면 이제 홈 화면을 설정해봅시다!

홈 화면 설정

resources/static/index.html 파일을 만들어줍니다.

<!DOCTYPE HTML>
<html>
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>

다음과 같이 화면이 설정되는 것을 알 수 있습니다.

이것이 바로 스프링 부트가 제공하는 Welocme Page 기능입니다.
이는 static/index.html을 첫 화면으로 인식을 하는 것입니다.

정적 컨텐츠

웰컴 페이지는 첫 화면을 보여주는 것인데 이러한 static에 있는 html 파일을 그대로 보여주는 방식을 정적 컨텐츠라고 합니다.

Spring boot는 이러한 정적 컨텐츠를 보여주는 기능을 가지고 있습니다.

동적 컨텐츠

정적 컨텐츠가 파일을 있는 그대로 보여주는 것이라면 동적 컨텐츠는 템플릿 엔진을 사용하여 웹의 페이지를 가공해서 HTML로 보여주는 방식을 말합니다!

이제 동적으로 작동하는 웹을 실습해봅시다!

java에 controller 폴더를 만들고 helloController.java를 만들어봅시다.

package helllo.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";
    }
}

이제 resources/templates 폴더에 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>

이렇게 하면 "localhost:8080/hello"라는 URL을 들어가면 안녕하세요. hello라는 화면이 나오는 것을 확인할 수 있습니다.

무슨 일이 벌여졌는지 보면 다음과 같습니다.

  1. localhost:8080/hello라는 GET 요청이 들어오면 이것을 처리하는 controller가 있는지 확인합니다.
  2. 확인이 되었으니 해당하는 코드의 동작을 합니다. Model에다가 data, hello라는 키와 밸류를 담아줍니다.
  3. 뷰 리졸버가 해당하는 화면을 찾아서 처리를 해줍니다.
  4. Model에 data:hello가 들어왔으니 이것을 해당하는 HTML 코드에 적용해서 웹 브라우저에 띄워줍니다.

빌드하고 실행하기

이제 완성된 프로젝트를 배포하기 쉽도록 빌드를 해봅시다.

./gradlew명령어 실행 시 build/lib에 jar 파일이 빌드됩니다.
이 파일을 java -jar "이름".jar 명령어를 통해서 실행이 됩니다.
만약 빌드 파일을 지우고 싶다면 ./gradlew clean 명령어로 삭제합니다.

profile
멘땅에 헤딩하는 사람

0개의 댓글