[Inflearn] 스프링 설정 & 생성
김영한 강사님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의 정리
강의를 들으며 노션에 적어두었던 걸 보기 쉽게 정리해서 포스팅 해보려 한다.
처음으로 스프링을 시도해보았는데 재밌고 들떴던 기억이 난다.
아무래도 무료 강의다 보니, 뒤이어 학습한 스프링 핵심원리 기본편, MVC편과 겹치는 부분이 있어
스프링 환경설정 위주로만 정리했다.
프로젝트 환경 설정 및 생성
- IDE : IntelliJ
- 스프링 부트 스타터 사이트로 스프링 프로젝트를 생성 https://start.spring.io
- 프로젝트 선택
- Project : Gradle Project
- Language : Java
- Spring Boot : 2.3.x
- Project Metadata
- Group : 기업 도메인명
- Artifact : 프로젝트명
- Name :
- Package name : Group.Artifact 가 된다.
- Packaging : Jar / War
- JSP를 사용하지 않으면 Jar를 선택한다. Jar를 사용하면 항상 내장 서버(톰캣등)을 사용하고, webapp 경로도 사용하지 않는다. 내장 서버 사용에 최적화 되어 있는 기능이다. 최근에는 주로 이 방식을 사용한다.
- JSP를 사용할거면 War를 선택한다. War를 사용하면 내장 서버도 사용가능 하지만, 주로 외부 서버에 배포하는 목적으로 사용한다.
- Java : 11
- Dependencies : 필요한 라이브러리 선택 (test도구인 junit5 라이브러리가 기본으로 포함된다. 소스 라이브러리에 톰캣(웹 서버)도 내장되어 있다.
- Spring Web
- Thymeleaf ( html을 만들어주는 템플릿 엔진, 여러 종류가 있음)
- Lombok (애노테이션만 붙이면 Getter/Setter/생성자 등을 자동으로 만들어주는 라이브러리)
maven, gradle 이란? 필요한 라이브러리를 땡겨오고, 빌드하는 라이프사이클, 의존관계 까지 관리해주는 툴. 과거에는 maven을 많이썼지만 요즘에는 gradle로 넘어오는 추세이다.
라이브러리
[1] 스프링 부트 라이브러리
- 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-loggin
- logback, slf4j
- spring-boot
참고
- spring-boot-devtools : html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다. (인텔리J컴파일 방법 : 메뉴 build → Recompile)
[2] 테스트 라이브러리
- spring-boot-starter-test
- junit : 테스트 프레임워크
- mockito : 목 라이브러리
- assertj : 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
- spring-test : 스프링 통합 테스트 지원
[3] 기타 편의 라이브러리
- Lombok
- File Setting (윈도우) > Annotation Processors 검색 > Enable annotation processing 체크 (재시작)
- @Getter, @Setter 확인
빌드 설정
최근 IntelliJ 버전은 Gradle을 통해서 실행 하는 것이 기본 설정이다. 이렇게 하면 실행속도가 느리다.
다음과 같이 변경하면 자바로 바로 실행해서 실행속도가 더 빠르다.
- File Setting (윈도우) > Build, Execution, Deployment > Build Tools > Gradle
- Build and run using: Gradle > IntelliJ IDEA
- Run tests using: Gradle > IntelliJ IDEA
실행 테스트
@SpringbootApplication
가 붙은 클래스 이름 옆에 붙은 화살표를 누르거나, run 버튼을 눌러서
주소창에 localhost:8080 을 입력하고 이동했을 때 다음과 같은 페이지가 뜨면 실행 성공이다.
정적 컨텐츠
(톰캣 서버 → 스프링컨테이너) 컨트롤러가 없으면 static 폴더에 있는 html을 그대로 반환한다.
Welcome Page
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>
- Spring은
resources/static/index.html
경로에서 Welcome page 기능을 제공한다. - JSP 사용시에는 webapp 경로에 index.html 을 두면 http://localhost:8080 호출시 index.html 페이지가 열린다.
스프링 부트 서블릿 환경 구성
서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치하고,그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, 톰캣 서버를 실행하면 된다.
하지만 스프링 부트는 톰캣 서버를 내장하고 있으므로, 편리하게 서블릿 코드를 실행할 수 있다.
스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan
을 지원한다.
hello.servlet.ServletApplication
package hello.servlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
실제 동작하는 서블릿 코드를 등록 해보자
hello.servlet.basic.HelloServlet
package hello.servlet.basic;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("HelloServlet.service");
System.out.println("request = " + request);
System.out.println("response = " + response);
String username = request.getParameter("username");
System.out.println("username = " + username);
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello " + username);
}
}
- @WebServlet 서블릿 애노테이션
- name: 서블릿 이름
- urlPatterns: URL 매핑
HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행한다.
protected void service(HttpServletRequest request, HttpServletResponse response)
- 웹 브라우저 실행 확인
동적 컨텐츠
과거에는 컨트롤러와 뷰가 따로 분리되어 있지 않아 jsp로 모두 다 처리하는 model1 방식을 사용했다. view는 화면에 관련된 일만, controller는 비즈니스 로직으로 분리 하기 위해서는 템플릿 엔진이 필요하다.
템플릿 엔진이란? JSP, PHP와 같이, 서버에서 프로그래밍 해서 html을 동적으로 바꿔주는 것. 이를 위해 컨트롤러, 모델, 뷰가 필요 → MVC
서버 배포
Jar 파일 서버 배포
- 프로젝트 폴더에서 gradlew build 명령어로 빌드 실행
- 프로젝트 폴더/build/libs에 생성된 jar파일을 복사해서 서버에 넣는다.
- 서버에서 java -jar <jar파일>.jar 명령어를 입력해 실행