정신 없던 학기가 끝나고, 번아웃이 오는 바람에 소홀했던 백엔드 공부와 블로그를 제대로 시작하려 합니다.
많은 기업들의 서버 프레임워크인 스프링에 대해 공부하고 잊지 않고 공유하기 위해 기록합니다.
공부 자료는 인프런 김영한 강사님의 스프링 입문편을 들었습니다.
그럼 시작하겠습니다 !
https://inf.run/K6kK
프로젝트 시작
시중에는 편리한 IDE가 많이 있습니다. 저는 IntelliJ IDEA를 사용하여 프로젝트를 개발하였습니다.
처음 스프링 프로젝트를 생성할 때, 대부분 스프링부트 기반으로 스프링 프로젝트를 생성합니다. 편리한 사용을 위해 스프링부트에서는 프로젝트 생성 사이트를 제공하고 있습니다.
https://start.spring.io/
위 사이트에 접속하게 되면 아래와 같은 화면이 출력됩니다.
천천히 하나씩 설명하겠습니다.
- 프로젝트 라이브러리 관리 방식으로 Maven, Gradle 방식이 있습니다. 요즘은 대부분 Gradle 방식을 많이 사용하고 관리한다고 합니다.
- 언어 또한 정통 언어인 Java와 요즘 핫한 Kotlin 그리고 Groovy가 있습니다. 수업에서는 Java를 사용하였기에 Java를 선택하시면 됩니다.
- Spring Boot 라이브러리 버전 사용에 관한 부분입니다. 버전에 따라 문법이 바뀌고 공식 참고 문서 또한 다르기 때문에 잘 선택하셔야 합니다. SNAPSHOT과 M1으로 나오는 부분은 정식버전이 아니기 때문에 정식버전 중 가장 최신 버전을 선택해주시면 됩니다.
- 프로젝트 이름과 패키지 이름에 대한 부분입니다. 보통 Group 부분에는 기업의 도메인을 사용합니다. Artifact는 빌드 시 결과물에 해당하는 부분입니다. 저는 공부용으로 프로젝트를 만들었기 때문에 딱히 수정하지 않았습니다. 패키징과 자바 버전은 수업과 동일하게 선택하였습니다.
- 마지막으로 라이브러리 의존성에 관한 부분입니다. 수업에서는 스프링 웹 프로젝트에 필수 라이브러리인 Spring Web 라이브러리와 HTML 템플릿 엔진 중 하나인 Thymeleaf 라이브러리를 추가해 프로젝트를 생성하였습니다.
GENERATE 버튼을 클릭하면, zip파일 하나가 다운로드 됩니다. 압축을 풀고, build.gradle 파일을 각자 IDE에서 열게 된다면 프로젝트가 성공적으로 생성되는 것을 확인 할 수 있습니다.
웹 개발 렌더링 방식
프로젝트를 생성하면 위 사진과 같은 구조로 생성됩니다. 요즘 개발 트렌드가 main과 test 코드가 함께 구성되어 생성되며, test 코드를 작성하는 것이 중요하다고 합니다. 또한 java 파일을 제외한 모든 파일은 resources 폴더로 넘어가 화면을 구성하는 등 해당에 맞는 동작을 실행합니다.
HTML 파일을 렌더링 하는 방식은 3가지로 나뉩니다. 렌더링이 무엇인지, 어떠한 방식으로 렌더링을 진행하는지 자세히 알아보겠습니다.
렌더링이란 ?
렌더링이란 서버로부터 HTML 파일을 내려 받아 브라우저에 출력하는 과정입니다.
대부분 모든 파일은 서버에 저장되며, 다양한 통신 기법으로 파일을 주고 받습니다.
받은 파일은 브라우저를 통해 출력됩니다. 다음과 같은 3가지 방식이 있습니다.
렌더링 절차 이미지에 대한 저작권은 김영한 강사님에게 있음을 알립니다.
- 정적 컨텐츠 (static)
- MVC와 템플릿 엔진
- API
정적 컨텐츠
정적 컨텐츠 방식이란 말 그대로, url에 해당하는 파일을 resource/static 폴더에서 찾아 그대로 브라우저에게 뿌려 출력합니다. 정적 파일을 그대로 내려 받기 때문에 상황에 맞는 프로그래밍이 불가합니다. 렌더링 절차를 순서대로 설명하겠습니다.
- 웹 브라우저가 hello-static.html 파일을 로컬 서버에게 요청합니다.
- Spring-web 라이브러리와 함께 설치된 내장 톰켓 서버 라이브러리에서 해당 요청을 Controller 에 넘깁니다.
- Controller 에서 hello-static 에 대한 내용을 찾지 못 했기 때문에 resource/static 폴더에서 hello-static.html 파일을 찾습니다.
- 해당 파일이 있다면 그대로 웹 브라우저에게 넘겨 출력합니다.
MVC와 템플릿 엔진
MVC 패턴은 현재 가장 많이 사용하는 개발 방식입니다. 초기에는 각각의 역할이 구분되지 않고 view 파일 안에 데이터베이스에 대한 접근 및 데이터 처리 코드가 함께 구성되었습니다. 그러다보니 코드의 길이는 기하급수적으로 길어지고 가독성 또한 떨어지는 악순환이 발생하였습니다. 이는 비즈니스 로직에 큰 타격을 가져왔기에 각각의 역할을 구분짓고 해당 역할에만 집중하는 코드를 작성하였습니다. MVC 패턴은 Model, View, Controller 의 약자로 Model 은 데이터 형식, 모델에 대한 정의를 담당합니다. View 는 말 그대로 사용자 화면에 보여지는 부분을 담당합니다. Controller 는 클라이언트 요청에 대한 처리를 담당합니다. Controller를 정의할 때에는 @GetMapping("")을 통해 어떠한 요청을 다룰 건지에 대한 정의가 꼭 필요합니다. 아래 예제에서는 @GetMapping("hello-mvc")로 작동됩니다. MVC 패턴과 템플릿 엔진의 렌더링 절차는 다음과 같습니다.
- 웹 브라우저가 hello-mvc 요청을 로컬 서버에게 요청합니다.
- Spring-web 라이브러리와 함께 설치된 내장 톰켓 서버 라이브러리에서 해당 요청을 Controller 에 넘깁니다.
- 정의된 helloController 에서 hello-mvc에 대한 컨트롤러 정의가 있기 때문에 해당 메소드를 실행합니다. ( 예제에서는 name 파라미터를 hello-template 으로 넘겨 출력하는 메소드입니다. )
- 컨트롤러는 메소드에 맞게 모델을 변경해 viewResolver 를 호출하며, viewResolver는 Thymeleaf 템플릿 엔진 처리를 통해 변환한 html 파일을 브라우저에게 넘겨줍니다.
API
보통 안드로이드, ios 과 같은 웹 앱 애플리케이션을 다룰 때에는 API 방식을 사용하여 데이터를 주고 받습니다. API 기법 역시 해당 요청을 받기 위해 @GetMapping("") 태그가 필수이며, API 기법을 알리기 위해 @ResponseBody 태그 또한 있어야 합니다. 이 때 Body는 HTML의 Body 태그 의미가 아닌, HTTP Request의 Body 부분을 의미합니다. 렌더링 절차는 다음과 같습니다.
- 웹 브라우저가 hello-api 요청을 로컬 서버에게 요청합니다.
- Spring-web 라이브러리와 함께 설치된 내장 톰켓 서버 라이브러리에서 해당 요청을 Controller 에 넘깁니다.
- 정의된 helloController 에서 hello-mvc에 대한 컨트롤러 정의가 있기 때문에 해당 메소드를 실행합니다. 다만 @ResponseBody 태그를 확인하였기 때문에 viewResolver 가 아닌, HttpMessageConverter 로 해당하는 반환 값을 넘겨줍니다.
- 반환 값이 객체라면 JsonConverter 를, 문자열이라면 StringConverter 를 호출하여 처리합니다. 예제에서는 Hello 클래스를 생성해 반환 값으로 hello 객체를 넘겼으므로, JsonConverter 가 호출이되며 메소드에 맞게 Json 객체인 {name: spring} 객체가 브라우저에 출력됩니다.
지금까지 스프링 프로젝트에 대한 생성과, 기본적인 웹 HTML 파일 렌더링 방식에 대해 알아보았습니다.
추가로 김영한 강사님 또한 IntelliJ IDEA 를 사용하고 계셨으며, 개발에 유용한 단축키를 알려주셨습니다.
이 또한 함께 공유합니다. 참고로 Mac OS 기반입니다.
- 코드 자동완성 : shift + cmd + Enter
- Generater ( 클래스 get, set method 와 같은 ,, ) : ctrl + n
'개인 공부 > Spring' 카테고리의 다른 글
[Spring] #6 스프링 빈 등록 (0) | 2022.01.19 |
---|---|
[Spring] #5 회원 서비스 구현 (0) | 2022.01.19 |
[Spring] #4 회원 리포지토리 테스트 케이스 작성 (0) | 2022.01.14 |
[Spring] #3 회원 도메인과 리포지토리 구현 (0) | 2022.01.12 |
[Spring] #2 예제로 통한 백엔드 개발 (0) | 2022.01.12 |