[웹개발] 서버와 Springboot?

LTT·2024년 10월 27일

Introduce


본 강의는 Springboot를 활용한 전반적인 API 서버 개발에 대한 백엔드 강의이다. 이론적인 개념보단 서버에 대한 기초 개념부터, 목표 프로그램의 배포까지 전반적으로 이루어진다.

구글링, 강의자료들 등 각종 자료를 참고하며 진행할 예정이다.

Java에 대한 개념은 따로 다루지 않을 예정이라, 따로 공부를 추천한다.

직접 처음 강의(?)를 해보는거라 조금 횡설수설할거다…

이 게시물은 백엔드를 처음 입문하는 대학 후배를 위해 만들어본다.

강의 목표


간단한 커뮤니티 웹사이트

Version Information


  • Framework: SpringBoot 3.3.5
  • Java: Java 17
  • Database: MySQL
  • Publish: AWS EC2 , ElasticBeanstalk
  • Storage: Amazon S3
  • IDE: IntelliJ IDEA

이번 주 학습목표


  1. 서버-클라이언트란
  2. Springboot란

서버-클라이언트


웹 개발 공부를 처음 시작하면서 이것 저것 찾아보는데, Client와 Server라는 말을 접해봤을 것이다. 하지만 이것들이 무엇인가 라는 질문에는 어떻게 답변을 해야 될까. 간단한 개념부터 짚고 넘어가 보자.

Client?


서버의 서비스를 받아 사용하는 장치

프로그램서버와 대응되는 개념으로 특정 서비스를 이용하는 사용자(고객)을 뜻하는 말인데 크게 봐서는 장치나 프로그램이 클라이언트라고 할 수 있겠다.

클라이언트 프로그램은 사용자가 웹을 통해 요청할 수 있도록 해주는 프로그램, 대표적인 예시로는 웹 브라우저를 의미한다.

Server?


네트워크를 통해 클라이언트에게 서비스를 제공하는 시스템

일반적으로 클라이언트의 요청(Request)에 대해 응답(Response) 해주는 시스템이라고 이해를 하면 된다.

이 서버와 클라이언트가 어떤 식으로 동작하는지 실생활로 예시를 들어보겠다.

예시


한 식당을 예시로 들고 가정해 보겠다.

일반적으로 우리가 식당을 가면, 직원이 메뉴판을 나누어 주고, 해당 메뉴판을 보고 음식을 주문한다. 그럼 그 음식은 주방에서 요리사가 요리를 하고 손님에게 전달되어, 해당 손님이 음식을 먹음으로서 식당 이용 과정이 종료가 된다.(대충(?) 나가는 것은 생략한다)

여기서 이 상황을 위의 클라이언트-서버로 구분을 해 보자면

  • 클라이언트 : 음식을 먹으러 온 손님.
  • 서버 : 음식을 조리하는 주방.
  • 요청 : 음식 주문
  • 응답 : 주문한 음식

이 될 수 있겠다. 이제는 웹사이트에 특정 상황에 비교를 해 보겠다.

예를 들어, 학교 홈페이지의 기숙사 신청에 대한 공지사항을 보려고 게시판의 특정 게시물을 클릭했다.

  • 클라이언트: 웹 브라우저(본인)
  • 서버: 학교 홈페이지의 시스템(?)
  • 요청: 기숙사 신청 공지사항 보여주세요
  • 응답: 기숙사 신청 공지사항 내용

과 같이 구조가 잡힐 것이다. 감이 잡히는가?

API?


앞서, 식당에 대한 예시를 들어봤다. 하지만 컴퓨터공학쪽은 언제나 세부적으로 생각해야 된다. 이런 의문점이 있다. 억지일수 있다…

아니, 이 음식. 누가 갖다주나요?

그렇다. 앞선 예시는 자세한 상황이 생략된 설명이다. 손님(클라이언트)이 한 주문을 누가 받아서 주방(서버)에게 전달할 것인가. 홀서빙 직원 이다.

  1. 손님(클라이언트)이 자리에 앉아. 직원(API) 에게 주문을 한다.
  2. 직원(API)는 손님의 주문(request)주방(서버)에 전달한다.
  3. 요리를 한 주방(서버)직원(API)에게 주면, 직원(API)손님(클라이언트)에게 음식(response)을 가져다 준다.

API는 요약해서 말하자면, 홀서빙 직원인 것이다.

API : 프로그램을 위한 인터페이스

쉽게 정리해, 데이터를 주고 받기 위한 방법과 그 규격이다.

오늘은 개념적인 내용만 다루고, API 개발은 앞으로 질리도록 할 것이기 때문에 실제 코드에 대한 내용은 생략한다.

+) API는 API Document(API 문서) 없이는 사용할 수 없다.
API에 대한 사용법을 사용할 사람들에게 제공이 되어야 한다.(당연하다. 메뉴판도 없이 주문을 할 수 있는 것이 아니지 않는가)

+) 인터페이스 : 말 그대로 어떤 기계간의 장치끼리 정보를 교환하기 위한 수단이나 방법을 의미

요약


뭐라뭐라 어렵게 떠들긴 했지만, 웹 개발 실무로 쉽게 생각을 해보자면

  • 클라이언트 → 프론트엔드
  • 서버 → 백엔드

라고 대략적으로 생각하고 넘어가도 될 것 같다.(아닌가?)

Spring?


자 이제, 우리가 앞으로 사용할 Spring에 대해 알아보자.

Java를 이용해 엔터프라이즈급 개발을 편리하게 만들어주는 ‘오픈소스 경량급 애플리케이션 프레임워크’

뭐, 와닿지도 않는 일반적으로 정의되어 있는 멋진 말이다. 개념보단 특징이 중요하니 특징을 살펴보자.

Spring의 특징


  • 제어의 역전 (IoC, Inversion of Control)
  • 의존성 주입 (DI, Dependenty Injection)
  • 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)

자세한 설명은 넘어가고, 기본적인 개념 위주로만 설명하고 넘어가도록 하겠다. 이런게 있구나 하고 넘어가면 된다.

나중에 자세히 다루도록 하자.

IoC (Inversion of Control, 제어의 역전)


일반적으로 Java 개발을 할 경우, 객체(Object)를 사용하기 위해, 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용하게 된다.

즉, 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조.

의존성(dependency) 이란?
객제 지향 프로그래밍(OOP) 에서 클래스나 모듈 간의 관계

IoC를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 라이프사이클 관리를 스프링 컨테이너나 IoC컨테이너라고 불리는 외부에 위임한다.

DI (Dependency Injection, 의존성 주입)


IoC의 방법 중 하나, 사용할 객체를 직접 생성하지 않고, 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식

AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)


객체 지향 프로그래밍(OOP)와 구분되며, AOP는 OOP를 더 잘 사용하도록 돕는 개념이라고 이해하면 될 것같다. AOP는 관점이라는 기준으로 묶어 개발하는 방식을 의미한다.

관점
어떤 기능을 구현할 때, 그 기능을 “핵심 기능”과 “부가 기능”으로 구분해 각각의 관점으로 보는 것을 의미

Springboot?


쉽게 얘기하자면, Spring도 기존의 개발 방식의 문제들을 극복하기 위해 다양한 기능을 제공하는 프레임워크로 나왔다. 하지만 기능이 다양한 만큼 설정들이 많이 복잡하다. 어떡하지…?

그래서 Springboot라는 놈이 튀어나왔다.

Spring에서 수동으로 설정해야되는 다양한 것들이 기본적으로 설정되어서 나온 Framework라고 이해하면 될 것이다.

Spring과 한번 간단하게 비교해볼까?

구분SpringSpringboot
의존성 관리- 개발에 필요한 각 모듈의 의존성을 직접 설정해야 됨
- 호환되는 버전을 명시해야 됨(버전 관리가 많이 빡셈)
- spring-boot-starter라는 dependency(의존성)을 제공함
- 기본적인 여러 dependency를 많이 버전을 맞춰서 묶어서 spring-boot-starter라는 곳에 묶어 제공해줌
자동 설정?- Spring Framework의 기능을 사용하기 위한 자동 설정(Auto Configuration)을 지원
→ 애플리케이션을 개발하는 데 필요한 의존성을 추가하면, Framework가 알아서 관리해줌
내장 WAS?각 웹 애플리케이션에는 내장 WAS(Web Application Server)가 존재한다. 대표적으로 tomcat 등 특별한 설정 없이 가능하다.
모니터링?서비스를 운영하는 시기에는 스레드, 메모리, 세션 등의 요소들을 모니터링 해야 하는데, spring boot actuator라는 모니터링 도구 존재

?는 springboot 강조라 안적었다…

이러한 각종 특징이 있는 Springboot를 다음에는 직접 써보면서 익혀보자.

질문이 있다면 언제든지 얘기 바란다…ㅎ

profile
개발자에서 엔지니어로, 엔지니어에서 리더로

0개의 댓글