본문 바로가기

백엔드 잡학사전

[스프링 입문] 스프링 관련 기본 개념들

2024.08.08 - 08.11: 김영한 님의 인프런 스프링 입문 강의를 듣고 작성한 자료

 

 

 

▶ Spring Boot, initilizr 시작

 

참고로 Spring 프레임워크의 다양한 모듈과 프로젝트 중 하나가 Spring Boot다.

자동구성(Autoconfig) 기능을 제공하고, 개발자가 설정파일을 최소화하고 앱을 신속하게 시작할 수 있도록 함.

Tomcat, Jetty 등의 내장 서버로 쉽게 실행할 수 있음.

 

Spring 프레임워크를 더 쉽게 자동화, 간소화해준 Spring Boot를 더 쉽게 시작하게 해주는 게 initializr.

initializr를 설정할 때, 다른 것들은 다 이해가 되는데 gradle-groovy, gradle-kotlin, maven 이 부분에서는 gradle-groovy를 설정하고는 하는데 대체 왜 하는지를 생각해보게 되었다.

 

groovy는 언어인데, 실상 Java와 100% 호환되기 때문에 Java라고 생각해도 무방하다. 그러니까 언어를 Kotlin을 쓸지 Java를 쓸지에 따라 설정하면 되는 것. 둘 중 뭘 선택해도 호환성에 문제 없지만, 통상적으로 groovy를 더 쓴다고 함.

 

maven과 gradle은 둘 다 빌드 도구인데, maven은 apache 재단에서 개발했고, gradle은 groovy와 kotlin을 사용한 빌드 도구라는 차이가 있다. maven은 안정성이 더 있고, gradle은 더 유연하고 빠른 빌드를 목표로 한다. 그런데 요새는 실무에서 gradle을 쓰는 추세라고 한다.

 

 

hello-spring이라는 프로젝트를 열었을 때의 첫 화면. .idea는 인텔리제이 관련 파일, gradle은 gradle 관련 (dependencies libraries 끌어오는 역할), 그리고 우리에게 중요한 폴더는 src인데, main과 test로 이루어져 있다. main에는 우리가 작성할 java 파일 등이 있고, 그게 아닌 다른 모든 파일들은 resources로 들어간다. test가 main과 병렬로 되어 있다는 게, 얼마나 현대 프로그래밍에서 test가 중요한지를 여실히 보여주는 대목이다.

 

 

이걸 실행해봐야 하는데, 나의 Application.java에는 런 표시가 뜨지 않아 런을 시킬 수가 없었다. not runnable program이란다. 알고보니 JAVA는 17을 다운받고, spring 설정 시에는 21을 선택해서 그런 거였다. 둘 다 17로 통일시켜주니 해결됐다.

 

그래서 실행창에 run 화면까지는 나오는데, 8080 포트에 tomcat 시작되었다고 뜨는데 실제로 들어가보면 아래와 같은 에러가 뜬다.

ERR_CONNECTION_REFUSED란다... 는 알고보니까 localhost가 8080이 아니라 8000으로 자동 실행되었다. 기록이 스토리지에 저장되어 있으니 이렇게 자동적으로 되는 것이다. 이런 사소한 실수인 경우가 많으니 유의하자!

 

그리고 intelliJ를 쓰면 JAVA를 직접 실행하는 게 아니라 Gradle을 통해서 실행되는 경우가 많은데, 이때는 preference에 들어가서 gradle을 쳐서 build and run using, run tests using 두 항목을 바꿔주면 된다. 이러면 속도가 더 빠르다.

 

 

 

▶ 프로젝트 라이브러리 살펴보기

 

기본템 라이브러리는, build.gradle에 들어가보면 처음 initializr에서 땡겨준 web, thymeleaf, 그리고 디폴트인 test 라이브러리 등의 3개가 있다. 그러면 프로젝트에서 겨우 세개만 쓰느냐? 그게 아니고 프로젝트 산하의 external libraries를 보면 엄청나게 많은 라이브러리들이 있다. 그냥 기본템 서버를 만드는 데에도 저렇게나 많은 라이브러리가 필요한 것이다. 물론 저기에는 우리가 땡겨온 라이브러리들이 땡겨오는 라이브러리들도 포함이다.

 

예를 들어, starter-web의 경우 tomcatwebmvc의 두 가지를 땡겨온다. starter의 경우 스프링 부트, 코어, 로깅의 세가지를 모두 기본으로 가져온다.

 

* 이 일련의 과정에서, "JAVA 메소드 하나 누르면 내장된 tomcat이 실행되면서 서버가 띄워진다"는 것에 대해서 강사님이 매우 강조하는 모습이 보이는데, 이를 통해 이전의 프로그래밍 환경에 비해 얼마나 쉽고 편해진 것인지를 알 수 있었다.

 

thymeleaf란?

백엔드 서버에서 HTML을 동적으로 렌더링 (서버사이드 SSR) 하는 용도로 사용함.

기본적으로 HTML 태그의 속성에 기능을 정의해서 동작함.

 

tomcat이란?

WAS의 일종. 자바 서블릿을 실행시키고 JSP 코드가 포함되어 있는 동적 웹 페이지를 구동시켜주는 프로그램.

일단은 skim thru만 하자. 카탈리나, 재스퍼 등의 용어들.

 

* Log 같은 경우 - 현업에서는 system.out.println 등의, log가 남지 않는 메소드는 안 쓰는 것이 원칙이다. 모든 것을 로그로 남겨둬야하기 때문에. 그러나 개인 프로젝트에서는 종종 쓰기도 한다고 한다. 그치만 어지간하면 실무에서처럼 시뮬레이션 해보자.

 

테스트는 junit을 핵심으로 한다. junit은 자바 개발자가 많이 사용하는 테스트 프레임워크다.

그 외에도 mockito는 mock library, assertj는 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리.

 

 

 

▶ View 환경설정 - 근데 여기에 controller와 model의 개념이 모두 들어감

 

src>main>resources>static에 index.html을 만들어준다. React랑 유사하게 페이지를 만들어주고, a 링크 태그로 다음 페이지로 넘어가는 등의 행위가 가능하다. 이걸 이제 이런식으로 쓰는 게 아니라 thymeleaf를 시전하여 업그레이드 시켜준다.

 

* 참고로, 플젝을 하면서 "음 이런 거는 spring으로 어떻게 하지...?" 이런 질문이 나오면 구글링해보면 무조건 나온다고 한다. 레퍼런스 중에는, spring.io > projects-spring boot > learn > refernce doc > features 에서 찾아보는 방식이 있다.

 

우선 main > java > hello.hello_spring 에 controller라는 패키지를 만들어준다. MVC의 그 C 맞다. 

그 안에 HelloController라는 클래스를 만들어준다.

 

controller 클래스의 구조는 이렇다.

 

Controller 예시

 

1 @Controller 필수다 - 내가 컨트롤러요! 인증하는 용도.

2 class 내부에는 @GetMapping("뭐시기") 필수다. - URI에 "뭐시기"가 들어오면 해당 컨트롤러랑 매치해주는 거다.

3 public String hello(Model model)의 model은 MVC의 그 모델이다. 이때 attribute로 data와 값을 넣어주면, 이게 해당 모델의 데이터에 커스터마이즈되어 들어간다.

4 return 값으로 template 이름(HTML 파일)을 넣어준다. hello라는 HTML 페이지를 return 하는 것.

 

이때 hello.html 파일이 아직 없으므로 그걸 만들어준다... 그 중 가장 중요한 부분은,

 

이 부분이다. 컨트롤러에서 넣어준 data attribute이 저기에 갖다가 들어가는 거다. 그러니까 화면에 보이는 건 이거다.

어렵지 않다. react랑 유사한 부분이 상당히 많다. 동작 원리를 그림으로 그리면 이렇다.

근데 갑자기 궁금한 점이, 잘 보면 안녕하세요. 손님 이렇게 되어 있는데 그 부분이 화면에는 아예 표시 되지 않는다.

그러면 저 p태그 사이의 공간에 들어가는 건 오로지 주석같은 역할인 것인가?

-> 아니다. 한마디로, th:text의 값이 없으면 해당 부분이 노출된다. th:text가 있으면 그걸로 대체되는 것.

MVC를 도식화하면 다음과 같아짐.

 

근데 문득 든 생각이, 왜 React가 아니라 Spring을 쓰지? 유사해 보이는데? 단순히 JAVA를 쓰고 싶어서 그런건가?

-> 지금까지는 백엔드와 프론트엔드가 겹치는 부분을 다뤄서 그런거고, 백엔드의 핵심으로 들어가면 차이가 보임.

 

그리고 React가 아니라 Spring과 같은 계열의 Django, Nodejs와 비교해서 왜 Spring을 쓰지? 하는 근본적인 의문.

-> 러닝커브가 높고 Java를 쓴다는 단점이 있는 Spring이지만, 보안 및 성능이 뛰어나고 모듈이 다양하다는 장점이 있다.

덩치가 큰 프로젝트의 경우 Spring이 더 좋다고 한다. 그리고 번외로, 한국 백엔드 사회에서는 Spring을 써버릇하기 때문.

 

 

 

IntelliJ 내부에서 실행한 지금까지의 방법이 아닌, 정식으로 빌드하고 실행하는 방법을 알아보려고 한다.

 

intelliJ의 포트는 끄고 (8080을 중복으로 사용할 수 없으니까), 해당 프로젝트 폴더에 가서 cmd에 gradlew.bat 을 시전해주면 된다. 그러면 빌드가 되고, 빌드된 폴더에 들어가 보면 파일 이름 있고 java -jar로 실행해주면 된다.

./gradlew build
cd build/libs
java -jar hello-spring-0.0.1-SNAPSHOT.jar