* 이 포스트는 인프런에 있는 김영한 님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의를 들으면서 내용을 정리한 글입니다. *

 

[메인 컨텐츠]

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의 (inflearn.com)

 

# 2022-03-03 #

 

#목차#

1. 스프링에서 뷰를 보여주는 원리

2. 스프링 구조의 기본인 컨트롤러 클래스

3. IDE가 아닌 터미널 창에서 스프링 프로젝트 실행하기

+ 예상 못 한 오류

+ 인상깊은 부분

+ 추가 공부할 부분


1. 스프링에서 뷰를 보여주는 원리

 

스프링에서 만든 뷰를 띄우려면 html 파일이 필요하다. html 파일은 resources>static 또는 resources>template 디렉토리에 저장한다. 그러나 두 디렉토리에 저장하는 것은 각각 다른 의미가 있다. 

 

1) resources>static

정적 파일(static files)들을 모아두는 디렉토리이다. 여기에는 정적 웹페이지도 포함된다. 별도의 코딩을 거치지 않고 그대로 html 파일을 띄우는 경우가 정적 웹페이지에 해당한다. 물론 여기에 assets, css, js 등의 디렉토리를 추가해서 css, js, 기타 jpg 파일 등을 추가하여 다른 종류의 정적 파일들도 저장할 수 있다. 

 

 

이 static 디렉토리를 이용하여 스프링에서 제공하는 기능이 있다. 바로 웰컴 페이지(Welcome Page) 기능이다. 

웰컴 페이지란, HTTP GET 메소드를 통해(주로 url 검색) 기본 주소(127.0.0.1:8080)로 들어갔을 때 나오는 페이지를 의미한다. 

 

웰컴 페이지를 설정하기 위해서는 resources>static 디렉토리에 index.html 파일을 추가하면 된다. HTTP GET 방법으로 기본 URL에 들어왔을 때(POST 등 다른 방식이면 웰컴 페이지 기능이 적용되지 않을 수 있다) index.html 파일이 웰컴 페이지로 사용된다. 

 

2) resources>template

여기에도 .html 파일을 저장할 수 있지만, 정적 파일이 아닌 파일을 저장한다. 말 그대로 일정의 양식을 따르는 '템플릿'으로 사용할 파일들을 저장한다. 사실 html 파일을 정적으로 사용하지 않고 여러 변수를 외부에서 받아오는 방법은 여러 가지가 있다. 그 중의 하나가 템플릿 엔진(template engine)이다. 

 

앞서 3강에서는 템플릿 엔진으로 사용할 Thymeleaf 라이브러리를 당겨 왔다. 파일의 기본 형식은 html과 큰 차이가 없지만, 이런 식으로 템플릿 엔진을 불러와서 'th'라는 변수로 설정하여 사용할 수 있다. 

<html xmlns:th="http://www.thymeleaf.org">

2. 컨트롤러(Controller class)

 

템플릿의 경우, 정적 파일과 달리 어떤 데이터를 입력하는지에 따라 뷰에서 출력되는 내용이 달라질 수 있다. Spring MVC(Model-View-Controller) 패턴에서는 뷰를 다루기 위해서 '컨트롤러' 클래스를 사용한다. 컨트롤러 클래스들은 보통 src>main 디렉토리 아래에 따로 controller 디렉토리를 설치하고 그 안에서 관리한다. 

 

컨트롤러의 특징

(1)

컨트롤러 클래스에는 반드시 @Controller 이라는 annotation(@)을 붙여 이 클래스가 컨트롤러로 사용됨을 명시해 주어야 한다. 그래야 스프링 내부에서 뷰를 처리할 때 해당 클래스의 메소드를 사용해서 사용자가 의도한 대로 뷰를 처리할 수 있다. 

 

(2)

컨트롤러 안에는 여러 메소드가 들어갈 수 있다. 메소드 위에도 @ annotation을 붙여서 해당 메소드의 역할을 명시해 주어야 한다. 

많이 사용되는 annotation 중 하나는 @GetMapping(url 주소)이다. 이게 붙은 메소드는 해당 url 주소로 HTTP GET 접근을 했을 때 어떤 식으로 뷰를 처리할지에 대한 내용을 담게 된다. 

( @GetMapping = @RequestMapping(method=RequestMethod.GET) )

 

(3)

해당 메소드는 매개변수로 Model(모델)을 받는다. MVC 중 하나인 모델은 외부에서 따로 컨트롤러에 할당하는 매개변수는 아니고, 스프링에서 자동으로 컨트롤러 클래스에 매개변수로 주입하는 것 같다. 

 

또한 모델에는 여러 메소드가 있다. 강의에서는 addAttribute() 메소드를 사용해서 모델에 속성을 부여했다. addAttribute 메소드는 '속성의 이름'과 '속성값'을 받는다. 

ex) addAttribute 메소드로 "data"라는 속성 이름과 "Hello" 라는 값을 모델의 속성으로 추가했다고 해 보자. 

 

(4)

컨트롤러는 뷰와 연결되며, 뷰를 리턴해야 한다. 이때 resource>template에 저장된 템플릿의 이름을 단순 문자열로 리턴한다면, 해당 뷰와 연결된다. 

ex) resource>template에 hello.html 파일이 있다고 해 보자. 컨트롤러 클래스에서 "hello"라는 문자열을 리턴했다면, 스프링은 자동으로 resource>template 에서 "hello"라는 이름의 템플릿 파일을 찾아서 뷰로 리턴한다.


3. IDE가 아닌 환경(터미널 창)에서 스프링 프로젝트 실행하기

 

앞서 프로젝트는 모두 인텔리제이 IDE에서 실행되었다. 그러나 사실 자바로 작성된 프로젝트의 경우, jar 파일이 있다면 로컬 터미널(윈도우의 cmd 창)에서도 실행할 수 있다. 물론 그러기 위해서는 몇 가지 과정이 필요하다. 

 

(1) 프로젝트 빌드

스프링 프로젝트가 설치된 디렉토리로 이동해서 프로젝트를 빌드해야 한다. 윈도우 cmd의 경우, cd 명령어를 통해 프로젝트의 디렉토리로 이동한다. 이후 gradlew.bat build 명령어를 입력하면 빌드가 실행되고, 프로젝트 내부에 build라는 새로운 디렉토리가 생긴다. 

 

(2) jar 파일 찾아서 실행

프로젝트에서 build>libs 디렉토리로 이동해서 dir 명령어를 통해 안에 어떤 파일이 있는지 본다.

빌드가 잘 실행되었다면 .jar 으로 끝나는 파일이 두 개가 있다. (하나만 있을 수도 있다.) 이 중 우리는 -plain이 아닌 그냥 jar 파일을 실행하면 된다. 

 

실행은 자바 환경변수를 이용해서 java -jar 프로젝트의-이름

이렇게 명령어를 입력하면 IDE 환경에서와 똑같이 스프링 시작화면이 뜬다. 그러면 성공이다. 이런 방식으로, 만약 다른 환경에서 스프링을 실행해야 할 경우가 생긴다면 jar 파일만 갖고 있으면 된다. 그러면 터미널에서 실행할 때도 필요한 라이브러리 등을 자동으로 설치해서 실행이 된다고 한다. 

 

+ 예상하지 못한 오류

실행은 잘 되었고 정적 파일로 설정한 웰컴 페이지도 그대로 나왔다. 그러나 앞서 사용했던 템플릿 엔진을 이용한 hello.html 파일이 제대로 실행되지 않았다. cmd 창에서 템플릿 엔진이 제대로 로딩되지 않았다는 오류가 떴다. 이유를 알아봐야겠다....


인상깊은 내용

 

스프링에서 모르는 내용을 검색하는 방법.

스프링은 너무 방대해서 모든 걸 다 알 수가 없다고 한다. 그래서 '모든 걸 알아야지!' 라고 접근하는 대신, 모르는 것을 찾는 방법을 아는 게 중요하다고 말씀하셨다. 

 

스프링 기본 홈(Spring | Home)화면으로 들어가서, Projects 탭에서 사용하는 스프링 라이브러리 이름을 누르면 해당 라이브러리에 대한 공식 문서 및 설명을 볼 수 있다. 이 강의에서는 Spring Boot를 사용했으므로 Projects>Spring Boot으로 들어가자. 이후 현재 사용하는 스프링 버전 옆의 'Reference Doc' 를 클릭하면 해당 버전에서 사용되는 기능들의 공식 문서들을 볼 수 있다. 


+ 추가로 알아볼 부분

1) 템플릿 엔진의 개념과 역할

2) spring REST와 spring MVC의 개념, 그리고 둘의 차이

3) 터미널 환경에서 실행했을 때의 템플릿 엔진 적용/로딩 오류

 

'server-side > spring' 카테고리의 다른 글

spring 개발일지 15-16강  (0) 2022.03.05
spring 개발일지 10-12강 + 개발 고민주제 틈틈이 정리  (0) 2022.03.04
spring 개발일지 4강  (0) 2022.03.03
spring 개발일지 1-3강  (0) 2022.03.02
spring 개발일지 #0  (0) 2022.03.01

+ Recent posts