brunch

You can make anything
by writing

- C.S.Lewis -

by 에디의 기술블로그 Jan 09. 2021

스프링부트 백엔드 프로그래밍 (1)

1주차 1교시 - 스프링부트란 무엇인가?

"스프링부트 백엔드 프로그래밍"이라는 주제로 약 8주간 글을 작성할 예정입니다. 제가 잘못된 길로 가지 않도록, 댓글로 의견 및 조언 부탁드립니다. 


1주차 - 스프링부트란 무엇인가?, 간단한 API 서버 만들어보기

       1. 스프링부트란 무엇인가?

       2. [다음글]간단한 API 서버 만들어보기 (커리큘럼 소개)

[미정]2주차 - 스프링 프레임워크 기본 개념, Rest API

       3. 스프링 프레임워크 DI(의존성주입), Bean, ComponentScan

       4. HTTP 기본 개념, Rest API 

[미정]3주차 - 스프링부트 테스트 코드 작성하기, 예외 처리하기

       5. 테스트 코드 작성하기

       6. 예외 처리하기

[미정] 4주차 - 캐싱

[미정] 5주차 - MQ, Pub/Sub

[미정] 6주차 - 보안(인증)

[미정] 7주차 - 병렬, 비동기 프로그래밍

[미정] 8주차 - Spring Cloud

[미정] JPA, Spring Data, Spring Session 등





스프링부트 경험자는 2장으로 바로 넘어가세요. 

https://brunch.co.kr/@springboot/531


1."스프링부트"란 무엇인가?



준비과정

- 인텔리J Ultimate 30일 무료평가판 설치

- Lombok 플러그인 설치

- 포스트맨 설치

- 크롬 브라우저 설치


https://www.jetbrains.com/ko-kr/idea/download/

https://www.postman.com/downloads/


1.1 스프링부트란?

스프링부트 소개는 공식 레퍼런스를 읽어보시면 됩니다. 

https://spring.io/projects/spring-boot

읽어봐도 아직 무슨 얘기인지 알 수 없습니다. 저도 잘 모르겠습니다. 스프링부트를 시작한 지 3년이 된 지금 저는 이제 조금은 알 것 같기는 합니다. 스프링부트라는 기술이 쉬워 보이지만, 하다 보면 마냥 쉽지는 않습니다. 


영어를 읽어보면, 스프링부트는 자동으로 컨피그 구성을 해줍니다. 또한, 임베디드 서버(톰캣, 네티 등)를 사용해서 단독 실행 가능한 애플리케이션을 구축할 수 있습니다. 또한, 의존성 관리를 해주며, Actuator 등 모니터링 기능도 제공합니다. 당장 모든 내용을 이해할 필요는 없습니다. 스터디를 진행하면서 조금씩 깨닫게 되면 됩니다. 어쨋든, 스프링부트에 대한 설명을 한줄로 표현하면 이렇습니다.

Spring Boot applications need minimal Spring configuration.


현재 최신 버전은 2.5.0-SNAPSHOT 입니다. 

스터디에서는 최신 Release 버전 중에서 2.3.7.RELEASE 버전을 사용하겠습니다. 2.4.1 은 아직 마이너 낮은 버전이라서 조금 부담이 되네요.


1.2 인텔리J 에서 스프링부트 처음 시작하기

이런 것까지 설명을 해야 하나 싶지만... 암튼 인텔리 J 를 시작합니다. 


Spring Initializr 를 선택합니다.


Gradle Project 를 선택합니다. 

Spring Boot 버전을 2.3.X 최신 RELEASE 버전을 선택합니다. 

그리고, web, Lombok 을 추가합니다. 

인텔리J 에서는 자동으로 Gradle Import 를 합니다. 그리고, Lombok 을 추가하게 되면 아래와 같은 빨간 메시지가 표시됩니다. 

Enable 를 클릭합니다. 만약 해당 메시지를 놓쳤다면, 아래 설정에서 체크해줍니다. 


자, 이제 애플리케이션을 시작해봅니다. 우측 상단의 버튼을 클릭해주면 됩니다. 


애플리케이션 시작됩니다...


Lombok 에 대한 플러그인 설치 방법은 아래와 같습니다.



참고, 아래 사이트에서도 초기 프로젝트를 생성해서 다운로드 할 수 있습니다. 

https://start.spring.io/



1.3 부담 없이 이것저것 재미 삼아 소개합니다.

사실, 스터디 초기 계획에서는 스프링 프레임워크의 DI 개념부터 정리를 할까 했습니다. 이미 다들 아시겠지만 "토비의 스프링"이라는 정말 좋은 책이 있습니다. 저도 오래전부터 책장에 꽂아놓고 가끔 찾아서 봅니다. 하지만, 스프링부트를 처음 접하는 아무것도 모르는 꼬맹이에게, "토비의 스프링"을 먼저 읽으라고 한다면, 쉽게 포기해버릴지도 모릅니다.(실제로 포기하는 개발자는 본 적 없지만..) 어쨌든, 스프링부트는 곧 스프링프레임워크 입니다. 그래서, 결국에 우리는 나중에 스프링프레임워크의 핵심 개념을 전부 공부해야 하며, 언젠가는 "토비의 스프링"을 읽게 될 것입니다. 하지만, 지금 아무것도 모르는 취업을 준비하는 분들에게 "토비의 스프링"을 정독하라고 말해주기에는 취준생에게 주어진 시간이 많지 않습니다. 솔직히, 스프링프레임워크 및 스프링부트를 잘한다고 취업이 상대적으로 잘 되는 것도 아닙니다. 코딩 테스트가 더 중요하며 알고리즘, 컴퓨터 공학, 데이터베이스, 네트워크 등 기본기를 쌓는 것이 더 중요할 수 있습니다.


이번 스터디의 목적은, 

시간이 부족한 취준생 분들에게 짧은 시간 안에 스프링부트를 쉽고, 재미있고, 빠르게 이해할 수 있도록 소개하는 것이 저의 목적입니다. 하지만, 3주 차로 넘어가면 내용은 절대 쉽지 않을 것입니다..ㅠㅠ 



어쨌든... 이것저것 재미 삼아해 봅시다.


애플리케이션을 실행하면, Console 탭에 실행 로그가 올라오는데, 반드시 확인해야 하는 로그가 있습니다. 바로 임베디드 톰캣 서버가 실행된 것을 확인해야 합니다. 8080 포트로 실행이 됩니다. 


우리는 아무것도 코딩하지 않았지만, 자동으로 톰캣 서버(API 서버)가 실행됩니다. 이유는 바로, spring-boot-starter-web 의존성을 추가했기 때문입니다. 스프링부트는 web 의존성을 추가하면, 임베디드 톰캣을 자동으로 구성해줍니다. 자세한 얘기는 좀 이따가...


[라떼는...스프링부트가 도입되기 전에는 어떻게 했나요? 

외장 톰캣을 별도로 구축하거나, (돈 주고 구매하는) 상용화 서버를 사용했습니다. 클라우드 환경이 대중화되기 전에는 배포가 쉽지 않았습니다. 그래서, 스프링 빌드 파일을 서버에 배포한 후 외장 톰캣을 연동해서 서버를 운영해야 했습니다. 스프링부트가 도입되면서, 좀 더 빠르고 간편하게 배포가 가능해졌습니다. 이유는, 스프링부트에서 임베디드 톰캣을 사용하기 때문에, 스프링 애플리케이션만 재시작하면 톰캣 서버를 띄울 수 있기 때문입니다. 그래서, 마이크로서비스 아키텍처 환경에서도 매우 적합한 기술입니다. 하지만, 초창기 스프링부트가 처음 개발되기 시작한 이유는 마이크로서비스 아키텍처를 위해서 시작된 것은 아니었습니다. 현재 MSA 아키텍처에 매우 적합하며, Pivotal 에서도 그렇게 홍보하고 있지만, 사실 일체형 아키텍처에서 스프링부트를 사용하지 못할 이유는 없으니깐요.


localhost:8080 를 크롬 브라우저에서 실행합니다. 아래와 같이 페이지를 찾을 수 없다는 메시지가 나올 것이다. 우리는 그 어떤 코딩도 하지 않았지만, 스프링부트는 에러 페이지를 자동으로 보여주네요. (사실 이 기능은 쓸모는 없습니다.)

이번에는 크롬의 개발자 도구를 확인해봅니다. 개발자 도구의 네트워크 탭에서 방금 호출했던 히스토리를 확인할 수 있어요. 자세히 보시면 Headers 에 404 라는 HTTP 상태 값을 확인할 수 있습니다. 



만약, 브라우저 외에 다른 환경에서 호출하면 어떻게 될까요? 또 다른 결과가 나옵니다. 응답 포맷이 다르네요. (404 상태 코드는 동일합니다.)

신기하게도, 포스트맨에서 호출하면 JSON 형태의 응답을 받을 수 있습니다. error 코드에는 "Not Found" 라고 친절하게 알려주네요. 보신 바와 같이 스프링부트의 에러 처리 로직은 요청하는 환경에 따라서 다르게 응답합니다. 당장 중요한 내용은 아니며, 알고만 있길 바랍니다. 어차피 우리는, 스프링부트에서 자동으로 에러 처리하는 것을 사용하지 않고, 에러에 대한 예외 처리를 별도로 구성할 예정입니다. 3주 차에서 다룹니다. 


재미있나요? 재미 드럽게 없나요? ㅠㅠ 어떻게 하면 재미있다고 느끼게 할 수 있으려나요.. 사실 글을 쓰는 저도 너무 재미없는데... 재미가 있을 리가 없지요. 어쨌든 좀 더 같이 봅시다.


build.gradle 확인합니다. 스프링부트를 처음 시작할 때 선택했던 2.3.7.RELEASES 버전이 정의되어 있습니다. 


인텔리 J 의 우측을 보면 의존성을 확인할 수 있습니다. 우리는, spring-boot-starter-web, Lombok 두 개의 의존성을 추가했습니다. 하지만, 실제로 추가된 모듈은 두 개가 아닙니다. 아래와 같이 꽤 많습니다. 

스프링부트가 해주는 의존성 관리에 의해서 이미 설정된 각종 의존성(라이브러리) 등이 자동으로 추가된 것입니다. 아래 링크를 봐주세요. 

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web

spring-boot-starter-web 에 대한 Maven 저장소입니다. 우리가 선택했던 2.3.7.RELEASE 을 선택합니다.

Complile Dependencies 를 확인해봅니다.

spring-boot-starter-web 의존성에 같이 따라오는 컴파일 의존성은 5개입니다. 


spring-web

spring-webmvc

spring-boot-starter

spring-boot-starter-json

spring-boot-starter-tomcat


이게 끝이 아닙니다.


spring-boot-starter-tomcat 을 클릭해서 봅시다. spring-boot-starter-tomcat 의존성에 따라오는 컴파일 의존성이 또 4개 입니다. 

물론, 인텔리J 에서도 확인할 수 있습니다. 인텔리J 의 좌측 하단을 확인해봅시다.



[라떼는...] 스프링부트가 도입되기 전에는, 필요한 의존성 라이브러리를 전부 버전과 함께 정의해줘야 했습니다. 사실, 어떤 버전끼리 서로 궁합이 좋은지 개발자는 판단하기 쉽지 않았습니다. 버전이 변경될 때마다 모든 버전을 명시해줘야 하는 불편함이 컸습니다. 스프링을 개발할 때 각종 설정을 하는데 많은 시간을 투자해야 했습니다. 하지만, 스프링부트가 도입되면서, 라이브러리 의존성 관리가 매우 편리해졌습니다. 


그렇다면, 스프링부트에서 추가해 준 의존성은 정해진 버전만 사용해야 하나요? 네, 별도로 수정하지 않는다면 그렇습니다!. 하지만, 개발자의 의도에 의해서 명시적으로 변경할 수는 있습니다. 만약 Lombok 버전을 다른 버전을 사용하고 싶다면 아래와 같이 변경해주면 됩니다. 


이번 스터디에서는, 별도의 버전을 커스텀하게 정의하지 않고, 스프링부트의 의존성을 그대로 따를 예정입니다. 



이번에는 AutoConfiguration 에 대해서 재미 삼아서 해봅시다. 참고로, AutoConfiguration 은 8주차 스터디 끝날 때까지 계속 등장하게 될 핵심 개념입니다. 하루에 모두 배울 순 없습니다. 대충 맛만 볼까요.. 


application.properties 파일을 수정합니다. 


서버의 포트를 8080 이 아니라, 8081 로 수정하였습니다. 애플리케이션을 다시 시작하면 8081 포트로 실행합니다.


브라우저에서 확인하면 역시 localhost:8081 로 접근해야 합니다. 

스프링부트의 가장 중요한 기능은 바로 AutoConfiguration 입니다. 스프링부트 웹서버는 개발자가 따로 설정을 하지 않으면 8080 포트를 기본으로 시작하도록 자동 구성해줍니다. 기본 설정을 따르고 싶지 않다면 별도로 설정을 추가해주면 됩니다. 아래 링크를 확인해주세요.

https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html

문서를 자세히 읽어보면, server.port 기본 값을 확인할 수 있습니다.

스프링부트가 쉬우면서도 어려운 이유가 바로 AutoConfiguration 때문입니다. 처음 우리가 스프링부트를 시작할 때는, AutoConfiguration 기능에 의해서, 너무 쉽게 스프링부트를 시작할 수 있었습니다. 매우 빠르게 개발할 수 있었습니다. 그래서, 스프링부트를 너무 사랑했습니다. 하지만, 그때는, 서비스를 운영하다 보면 그 숨은 설정으로 인해서 수많은 장애와 이슈를 만나게 될 것이라는 것을 몰랐으니깐요. 당장 생각나지는 않으니... 스터디하면서 하나씩 생각나는 대로 글을 남기도록 하겠다. 



스프링부트는 

잘 모르면 쉽고, 

적당히 알면 어렵고, 

제대로 알아야 그제야 쉽습니다.



1.4 드디어, 코드를 수정해보자. 

사실, 스프링 공부를 처음 시작하면 DI, AOP 등 기본 중요 개념과 함께 테스트코드 작성에 대해서 먼저 배우는 경우도 많습니다. 하지만. 이번 스터디에서는... 일단 빠르게 뭐든지 해보자는 마인드로 아무 코드나 작성해보기로 하겠습니다... 


Movie 클래스를 정의합니다. 영화 정보를 객체화 한 모델 클래스입니다.

MovieService 클래스를 정의합니다. 영화 정보를 제공하는 서비스 클래스입니다.

SearchController 클래스를 정의합니다. 클라이언트(브라우저, 사용자)에게 제공하는 엔드포인트 클래스이다. 

아래와 같이, 확인할 수 있습니다.



1.5 마무리

1주 차의 첫 번째 글을 마무리합니다. 스프링부트에 대해서 소개하는 시간이었습니다. 다음 글(1주 차의 두 번째)에서는 간단한 API 서버를 만들어볼 예정입니다. 또한, API를 만들면서 앞으로의 커리큘럼에 대해서도 소개합니다. 



다음 글

https://brunch.co.kr/@springboot/531

에디의 기술블로그 소속 직업개발자
구독자 666
매거진의 이전글 스프링부트 백엔드 프로그래밍

매거진 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari

브런치 로그인