스프링부트 (3)

 

 

 

 

 

 

백엔드 측 애플리케이션은 기본적으로 클라이언트 유형과 무관하게

공통의 정보를 제공하도록 디자인이 되어야 한다.

하지만 특정 클라이언트 유형에 맞는 정보를 추가적으로 제공하기 위한 확장을 고려해야 하는 경우도 빈번하다.

 

애플리케이션을 설계할 때 기능을 다 넣어서 만들어 버리면 범위가 너무 넓어져서 구현하기 힘들다.

요구사항에 맞춰서 애플리케이션의 기능을 특정 범위까지만 제한하는 것을

애플리케이션 경계를 설정한다” 고 한다.

 

 

 

 

Spring MVC Architecture

 

 

➤ Spring MVC란?

 

스프링 모듈 중에 웹 계층*을 담당하는 몇가지 모듈이 있다.

 

Sevlet API를 기반으로 클라이언트의 요청을 처리하는 모듈도 있다.

이 모듈이 spring-webmvc 이다.

 

 

✔️ web layer(웹 계층)?

 

Spring MVC layer architecture

 

  • Spring MVC layer architecture의 최상위 계층 이다.
  • 클라이언트의 요청을 받고 응답을 전달하는 계층이다.
  • 다른 계층에서 발생한 예외를 처리한다.
  • 인증을 관리하여 권한이 없는 사용자의 인가를 거부하는 역할도 한다.

 

Spring MVC 레퍼런스

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html

 

17. Web MVC framework

@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, Model model, BindingResult result) { … } Note, that there is a Model parameter in between Pet and BindingResult. To get this working you have to reor

docs.spring.io

 

 

 

▶️ Servlet 이란?

 

클라이언트의 요청을 처리하도록 규약에 맞추어서 Java 코드로 작성하는 클래스 파일이다.

아파치 톰캣(Apache Tomcat)은 이런 서블릿들이 웹 애플리케이션으로 실행이 되도록 해주는 Servlet Container 중 하나이다.

특징

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
  • html을 사용하여 요청에 응답한다.
  • Java Thread를 이용하여 동작한다.
  • MVC패턴에서 Controller로 이용된다.
  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
  • HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.

 

 

 

 

MVC의 의미

 

 

API 계층

구현하려는 Spring MVC는 계층형 아키텍처에서 API 계층에 해당한다.

 

➤ Model(M)

 

MVC에서 M에 해당한다.

클라이언트에게서 받은 요청을 기반으로 처리한 결과인 데이터Model이라고 한다.

클라이언트에게 응답으로 Model 데이터를 돌려준다.

 

 

➤ View(V)

 

MVC에서 V에 해당한다.

Model 데이터를 이용해서 클라이언트 애플리케이션의 화면에 보여지는 리소스(Resource)를 제공한다.

 

Spring MVC에는 다양한 View기술이 포함되어 있다.

  • HTML 페이지의 출력
  • PDF, Excel 등의 문서 형태로 출력
  • XML, JSON 등 특정 형식의 format으로 변환

 

 

※ JSON(JavaScript Object Notation)이란?

 

데이터를 통신하는 포맷 형식 중의 하나이다.

웹 애플리케이션에서 가장 많이 사용한다.

Spring MVC에서 클라이언트 애플리케이션과 서버 애플리케이션이 주고 받을 때 JSON 형식을 사용한다.

과거에는 XML 형식이 가장 많이 사용되었지만 JSON이 상대적으로 가볍고 복잡하지 않아서 대세이다.

기본 포맷 : {“속성”:”값”}

 

※ 참고) JSON to Java Converter

https://json2csharp.com/code-converters/json-to-pojo

 

JSON to POJO Object Online Converter - Json2CSharp Toolkit

 

json2csharp.com

 

 

 

➤ Controller

 

MVC에서 C에 해당된다.

Controller는 클라이언트 측의 요청을 직접적으로 전달 받는 엔드포인트(Endpoint)이다.

Model과 View의 중간에서 상호 작용을 해주는 역할을 한다.

Model 데이터를 View로 전달하는 역할을 한다.

 

 

➤ Model, View, Controller 간의 처리 흐름

 

Client가 요청 데이터 전송

➡️ Controller가 요청 데이터 수신 ➡️ 비즈니스 로직 처리 ➡️ Model 데이터 생성

➡️ Controller에게 Model 데이터 전달 ➡️ Controller가 View에게 Model 데이터 전달

➡️ View가 응답 데이터 생성

 

 

 

※ Gson 클래스 찾을 수 없는 오류

 

Gradle 방식

스프링 프로젝트 내에 build.gradle로 들어가서

“dependencies” 에  implementation 'com.google.code.gson:gson:2.9.0' 추가 ➡️ gradle reload

 

Maven방식

<dependency>

	<groupId>com.google.code.gson</groupId>

 	<artifactId>gson</artifactId>

 	<version>2.9.0</version>

</dependency>

 

사용하려는 위치에서 import com.google.gson.Gson;

 

 

 

 

Spring MVC 동작 방식과 구성 요소

 

 

Spring MVC 동작방식

 

※ DispatcherServlet의 역할

많은 일을 처리하는 것 같지만 실제로는 요청에 대한 처리는 다른 구성 요소들에게 위임(Delegate)하고 있다.

 

애플리케이션의 가장 앞단에 배치되어 다른 구성 요소들과 상호작용 하면서 클라이언트의 요청을 처리하는 패턴을 ‘Front Controller Pattern’이라고 한다.

 

※ Handler메서드

@GetMapping

@PutMapping

@DeleteMapping

@PatchMapping

@PostMapping

 

 

 

Controller

 

 

➤ 패키지 구조 생성

 

Spring Boot 기반의 애플리케이션에서 주로 사용되는 자바 패키지 구조에는

기능 기반 패키지 구조(package-by-feature)계층 기반 패키지 구조(package-by-layer)가 있다.

 

 

▶️ 기능 기반 패키지 구조(package-by-feature)

 

애플리케이션의 패키지를 구현해야 하는 기능을 기준으로 패키지를 구성하는 것이다.

패키지 안에는 하나의 기능을 완성하기 위한 계층별(API 계층, Service 계층, DataAccess 계층) 클래스들이 모여있다.

상대적으로 테스트와 refactoring이 용이하여 많이 사용한다.

 

 

▶️ 계층 기반 패키지 구조(package-by-layer)

 

패키지를 하나의 계층으로 보고 클래스들을 계층별로 묶는 구조이다.

ex) controller, dto, model, repository, service,...

 

 

 

➤ 실습 예제

 

예제를 따라하면서 정리해보았다.

Mock 데이터를 응답으로 넘기는 형태로 작성하였다.

프론트에 요청과 응답이 정상적으로 통신되는지만 확인하기 위해

실제 안에서 동작하는 로직은 구현하지 않았다.

 

실습 내용 : 커피 주문 애플리케이션 Controller 설계하기

 

▶️ 기능 요구 사항

커피 주문 앱에 넣을 수 있는 기능을 모두 넣으면 구현하기 어렵고 복잡해진다.

따라서 동작에 필요한  기능을 넣어서 먼저 애플리케이션 경계를 설정해야 한다.

  • 주인이 커피 정보를 관리하는 기능
    • 커피 정보 등록 기능
    • 등록한 커피 정보 수정 기능
    • 등록한 커피 정보 삭제 기능
    • 등록한 커피 정보 조회 기능
  • 고객이 커피 정보를 조회하는 기능
    • 커피 정보 조회 기능
  • 고객이 커피를 주문하는 기능
    • 커피 주문 등록 기능
    • 커피 주문 취소 기능
    • 커피 주문 조회 기능
  • 고객이 주문한 커피를 주인이 조회하는 기능
    • 커피 주문 조회 기능
    • 고객에게 전달 완료한 커피에 대한 주문 완료 처리 기능

 

커피 주문 애플리케이션에 필요한 리소스: Member, Coffee, Order

리소스에 해당하는 Controller 클래스를 작성

 

▶️ 엔트리포인트(Entrypoint) 클래스

Spring Boot 기반의 애플리케이션이 정상적으로 실행되려면 main() 메서드가 포함된

애플리케이션의 엔트리포인트를 작성해야 한다.

 

(Spring Initializr을 통해 생성한 프로젝트는 엔트리포인트 클래스가 이미 작성되어 있다.)

 

 

▶️ @SpringBootApplication

  • String Boot의 자동 구성을 활성화한다. (@EnableAutoConfiguration)
  • 애플리케이션 패키지 내에서 @Component 가 붙은 클래스를 검색한 후(scan), Spring Bean으로 등록하는 기능을 활성화 (@ComponentScan)
  • @Configuration 이 붙은 클래스를 자동으로 찾아서 Spring Bean을 등록하는 기능을 활성화 (@SpringBootConfiguration)

 

 

▶️ SpringApplication.run(~.class, arrgs);

  • Spring 애플리케이션을 부트스트랩하고 실행하는 역할

 

 

➤ Controller 만들기

 

▶️ @RestController

  • 클래스에 추가하면 해당 클래스가 REST API의 리소스를 처리하기 위한 API 엔드포인트로 동작함을 의미한다.
  • @RestController가 추가된 클래스는 애플리케이션 로딩 시, Spring Bean으로 등록된다.

 

▶️ @RequestMapping

  • 클라이언트 요청과 클라이언트 요청을 처리하는 Handler Method를 매핑해주는 역할을 한다.
  • 클래스 레벨에 추가하여 클래스 전체에 사용되는 공통 URL(Base URL)을 설정해준다.
  • Attribute
    • value : URL을 넣어준다.
    • produces : 응답 데이터를 어떤 미디어 타입으로 전송할지 설정한다.

 

 

※ 추가학습) URI 작성 기본 규칙

  • 마지막이 ‘/‘로 끝나지 않아야 한다.
  • 동사보다는 명사를 사용한다.
  • 단수형 보다는 복수형 명사를 사용한다.
  • 기본 소문자를 사용한다.
  • 언더스코어(_) 대신에 하이폰(-)을 사용한다.
  • 파일 확장자는 URI에 포함하지 않는다.

 

 

➤ Handler Method 작성하기

 

▶️ @PathVariable

괄호 안에 입력한 문자열 값은 밑의 @~Mapping 의 attribute의 중괄호 안의 문자열과 동일해야 한다.

다르면 “MissingPathVariableException” 발생

 

 

▶️ @PostMapping

클라이언트가 HTTP 메서드 POST를 이용해서 보낸 request body를 서버에 생성할 때 사용, 메서드 위에 작성

  • 원하는 HTTP 메서드에 맞추어서 GetMapping, DeleteMapping, PatchMapping 등 다양하게 지원된다. 반드시 요청하는 HTTP Method 타입과 동일하게 맞춰주어야 정상적으로 매핑된다.
  • 괄호() 안에 몇 가지 Attribute를 넣어줄 수 있다.
  • attribute에 HTTP URI의 일부를 지정해 줄 수 있다.

 

 

▶️ @RequestParam

클라이언트 쪽에서 전송하는 요청 데이터를 쿼리 파라미터(Query Parameter 또는 Query String), 폼 데이터(form-data), x-www-form-urlencoded 형식으로 전송하면 이를 서버 쪽에서 전달 받을 때 사용하는 애너테이션

  • 쿼리 파라미터 : 요청 URL에서 물음표(?)를 기준으로 붙는 key/value 쌍의 데이터를 말한다.
  • 괄호()안에 전달받을 key값 작성
  • 애너테이션이 붙는 변수는 전달받은 value

 

 

 

➤ ResponseEntity

 

클라이언트의 응답으로 전송하는 JSON 형식의 문자열을 직접 타이핑해서 작성하면 문제가 생기기 쉽고  수정이 번거롭다.

ResponseEntity 객체로 리턴값을 변경하면 JSON을 수작업으로 작성할 필요가 없다.

ResponseEntity를 사용하면 JSON 형식에 타이핑할 필요없이 응답 정보를 map에 담아서 보내면 된다.

ResponseEntity 객체를 생성하면서 생성자 매개변수로 응답 데이터(map)와 HTTP 응답 상태를 함께 전달한다.

리턴 값으로 Map 객체 그대로 리턴해도 클라이언트에서 JSON 형식으로 정상적으로 응답 데이터를 받을 수 있지만 ResponseEntity 객체로 응답 데이터 래핑함으로써 더 세련된 방식으로 응답 데이터를 생성할 수 있다.

 

  • HttpEntity의 확장 클래스이다.
  • ResponseEntity에 Custom header를 포함하려면 HttpHeaders에 원하는 헤더를 추가하고 ResponseEntity의 생성자 매개변수로 객체를 전달하면 된다.
  • BodyBuilder 클래스를 이용하면 각각의 항목들(body, header, HttpStatus)을 메서드 체인 방식으로 전달할 수 있다.

 

HTTP 상태 코드

https://developer.mozilla.org/ko/docs/Web/HTTP/Status

 

HTTP 상태 코드 - HTTP | MDN

HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 응답은 5개의 그룹으로 나누어집니다: 정보를 제공하는 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고

developer.mozilla.org

 

 

 

 

 

프로젝트 코드 깃허브 링크

https://github.com/WiseJade/SpringBoot-practice/tree/main/section2-week3

 

 

 

 

읽어주셔서 감사합니다. 스프링 공부 어려운 데 화이팅하세요!

오개념에 대한 지적은 환영입니다.

 

 

 

 

 

❑ Architecture (아키텍처)

 

 

➤ 아키텍처란?

 

▶️ Architecture?

아키텍처는 건축 분야에서 유래된 용어로 건축물을 짓는데 있어 청사진 같은 역할을 한다.

쉽게 생각하면 건축의 조감도이다.

 

컴퓨터 시스템에서도 시스템을 만들기 전에 이해 당사자들이 모여서 시스템의 구조를 알기 쉬운 도형이나 이미지로 만들어놓는다.

 

 

 

➤ 컴퓨터 시스템에서 아키텍처 유형

 

▶️ 시스템 아키텍처

하드웨어 + 소프트웨어를 모두 포함하는 시스템의 전체적인 구성을 큰그림으로 표현한 것

시스템의 구성 및 동작원리를 나타낸다.

시스템의 구성요소에 대해 설계 및 구현을 지원하는 수준으로 자세히 기술

구성 요소 및 시스템 외부 환경과의 관계 묘사

요구 사양과 시스템의 전체 수명 주기를 고려

시스템의 전체적인 최적화가 목표

 

 

참고 사이트

https://www.edrawsoft.com/kr/program-review/architecture-drawing-program.html

 

아키텍처 구성도 쉽게 그리는 프로그램?

아키텍처란 건축학이라는 의미 외에도 컴퓨터를 기능면에서 본 구성 방식을 의미하기도 합니다. 아키텍처 구성도를 그리는 프로그램을 사용하여 간단한 아키텍처 구성도를 직접 그려보도록 하

www.edrawsoft.com

 

 

 

▶️ 소프트웨어 아키텍처

 

하드웨어를 제외한 컴퓨터 내의 모든 프로그램을 포괄하는 소프트웨어의 구성을 큰 그림으로 표현한 것

 

소프트웨어 아키텍처의 예시

Java 플랫폼 아키텍처

 

Java SE 아키텍처 (출처: https://docs.oracle.com/javase/1.5.0/docs/index.html)

 

 

▶️ 애플리케이션 아키텍처

 

애플리케이션은 소프트웨어의 종류 중 하나이다.

데스크탑이나 스마트폰에서 사용하는 응용 프로그램이다.

넓게는 클라이언트의 요청을 처리하는 서버 애플리케이션을 의미한다.

 

애플리케이션 아키텍처 중에 앞으로 자주 볼 웹 애플리케이션 아키텍처인 계층형 아키텍처(N-Tier) 정도는 기억해두자.

 

계층형 아키텍처

 

API 계층(API Layer)

클라이언트의 요청을 받아들이고 응답하는 계층

일반적으로 표현 계층(Presentation Layer)라고 불림

REST API를 제공하는 애플리케이션의 경우엔 API 계층이라고 표현한다.

 

 

서비스 계층(Service Layer)

API 계층에서 전달받은 요청을 업무 도메인의 요구 사항에 맞게 처리하는 계층

Domain(Business) 계층이라고도 불림

서비스의 핵심 로직이 포함되어 있음

API 계층에서 전달받은 데이터의 유효성(Validation) 검사

어떤 Data Access를 선택할지 결정

 

※ 도메인(Domain)이란?

애플리케이션 개발에서의 도메인은 비즈니스적인 어떤 업무 영역과 관련이 있다.

예를 들어 배달 주문 앱을 만들어야 할때 고객과, 음식점, 배달원, 카드사 또는 은행 등 배달 주문 앱을 구현하기 위해 필요한 업무들을 자세히 알아야 높은 퀄리티의 애플리케이션을 만들 수 있다.

도메인 지식(Domain Knowledge) 들을 서비스 계층에서 비즈니스 로직으로 구현해야 한다.

예시) 고객이 주문을 하는 과정, 주문 받은 음식을 음식점에 전달하는 과정, 배달 기사를 매칭하는 과정 등

 

 

데이터 액세스 계층(Data Access Layer)

서비스 계층에서 처리된 데이터를 데이터베이스같은 데이터 저장소에 저장하기 위한 계층

 

 

 

➤ 아키텍처로 보는 Spring Framework 모듈(Module) 구성

 

아래는 스프링에서 제공하는 기능들을 나타낸 그림이다.

 

Spring Framework 모듈 아키텍처 (출처: Spring Framework Reference)

 

Spring Framework에서는 약 20개의 모듈을 통해 다양한 기능을 제공

 

▶️ 모듈(Module) 이란?

Java에서 일반적으로 지원되는 여러가지 기능들을 목적에 맞게 그룹화하여 묶어 놓은 것

모듈은 Java의 패키지 단위로 묶여 있고, 이 패키지 안에는 관련 기능을 제공하기 위한 클래스들이 포함되어 있다.

일반적인 모듈은 재사용이 가능하도록 라이브러리 형태로 제공되는 경우가 많다.

 

 

 

❑ Spring Boot 란?

 

➤ Spring Boot 란 무엇일까?

 

Spring Framework는 enterprise 애플리케이션을 개발하기 위한 핵심 기능을 제공하는 Spring Project중 하나이다.

Spring의 복잡한 설정을 해결하기 위해 나온 것이 Spring Boot이다.

 

 

➤ Spring Boot를 사용해야하는 이유?

 

1. XML 기반의 복잡한 설계 방식 지양

2. 의존 라이브러리의 자동 관리

3. 애플리케이션 설정의 자동 구성

4. 프로덕션급 애플리케이션의 손쉬운 빌드

5. 내장된 WAS를 통한 손쉬운 배포

 

지금은 아직 의미가 와닿게 이해되진 않지만 Spring을 계속 공부하다보면 언젠가 의미를 깨닫는 날이 오겠지..?

 

 

 

※ 심화학습

 

아파치 톰캣(Apache Tomcat) 이외에 Spring Boot에서 사용할 수 있는 서블릿 컨테이너(WAS)에는 어떤 것들이 있을까?

 

▶️ Tomcat

자바에서 가장 널리 사용되는 WAS

Spring Boot에서 기본 내장된 WAS

 

▶️ Jetty (추억의 제티 음료가 생각난다..)

경량 WAS이다.

적은 메모리를 사용하고 속도도 빠르지만

그만큼 대규모 트래픽엔 취약하다.

 

▶️ Undertow

유연한 고성능 웹서버

대규모 트래픽으로부터 톰캣보다 안정적

 

▶️ Netty (얘는 뭘까 Jetty 친구인가..?)

 

 

 

 

읽어주셔서 감사합니다 🤗

스프링 어려운데.. 동기분들 모두 힘내세요..!

오개념에 대한 지적은 언제나 환영입니다~

 

 

 

 

❑ Spring Framework 들어가기전

 

지금까지 Java의 기본과 핵심을 배웠다.

Java의 기본문법만으로 어떤 소프트웨어를 만들 수 있을까?

지금까지 배운것으로는 콘솔 출력 프로그램 또는

Java GUI API인 AWTSwing을 사용한 데스크탑 애플리케이션을 만들 수 있을 것이다.

 

 

➤ AWT(Abstract Window Toolkit)

AWT (출처: 위키)

자바의 본 플랫폼에 의존하는 윈도, 그래픽스, 사용자 인터페이스 위젯 툴킷

GUI를 제공하는 표준 API인 자바 파운데이션 클래스(JFC)의 일부

AWT는 수많은 자바 ME(Java Platform Micro Edition, 임베디드를 위한 자바 플랫폼)를 위한 GUI툴킷이다.

 

 

➤ 스윙(Swing)

Swing (출처: 위키)

자바에서 GUI를 구현하기 위해 JDK에서 기본적으로 제공하는 개발 툴킷

선마이크로시스템즈의 자바기반클래스의 일부

기존에 발표되었던 AWT가 OS및 윈도 시스템의 자원을 그대로 제공하기 때문에 자바에서 지향하는 “Write Once, Run Everywhere(WORE)”를 구현하기 위해 각종 시스템에서 공통적으로 제공하는 버튼, 대화창 등만을 구현했다.

그래서 여러 환경에서 동일한 화면을 보여줄 수 있지만 대신 해당 시스템의 고유한 모습을 보여줄 수 없다.

 

 

 

 

❑ 스프링 실습 환경 구성

 

먼저 설정해야 하는 것들이 몇 가지 있다.

  1. JDK-11 설치
  2. 환경변수에 JAVA_HOME 설정
  3. IntelliJ Community Edition 설치

 

Spring Initializr 공식 사이트로 이동

https://start.spring.io/

원하는 Spring Boot 실행 환경과 필요한 모듈을 포함하는 템플릿 프로젝트를 생성해 준다.

 

Spring Boot 애플리케이션은 WAS 배포용인 War 파일 형태로 배포할 수 있지만, 일반적으로 Spring Boot 애플리케이션은 WAS를 내장하고 있는 Jar 파일 형태로 배포해서 실행한다.

 

 

스프링 != 스프링 부트

스프링 부트는 스프링을 잘 활용하기 위해 스프링에서 나온 프로젝트

 

Packaging : 개발한 코드를 빌드해서 하나의 결과물로 만들어 낸다

 

ADD DEPENDENCIES 에서 ‘Lombok’ 과 ’Spring Web’을 선택하고 GENERATE를 누른다.

그러면 zip 파일이 다운로드 된다.

다운로드한 zip 파일은 압축해제 한다.

그 다음에 intelliJ에서 Open으로 압축을 푼 프로젝트를 열면 된다.

 

 

 

 

❑ Spring Framework 소개

 

 

➤ Framework란?

 

Frame은 틀, 구조, 뼈대 등의 의미이다.

벽에 거는 액자를 프레임이라고 부르기도 한다.

자동차에서는 뼈대가 되는 강판을 프레임이라고 부른다.

이처럼 Frame은 어떤 대상의 큰 틀이나 외형적인 구조를 의미한다.

지금까지 배웠던 것 중에 Framework는 Collections Framework가 있다.

Collections Framework 안에 있는 Map, Set, List 등은 데이터를 저장하기 위해 자주 사용되는 자료구조를 바탕으로 자바에서 제공하는 클래스이다.

그렇다면 콜렉션에 왜 framework라는 말을 붙일까?

자바에서 framework, 틀 하면 제일 먼저 생각나는 것이 인터페이스(Interface)이다.

자바의 콜렉션은 Map, List, Set같은 인터페이스와 그 인터페이스를 구현한 구현체들의 집합이다.

이렇게 Framework는 프로그래밍을 하기 위한 기본적인 틀이나 구조를 제공한다.

그 외에도 프레임워크는 다양한 기능들을 제공한다.

개발하고자 하는 애플리케이션이 다른 애플리케이션과 통신하고 데이터를 데이터 저장소에 저장하는 등의 기능들도 프레임워크나 라이브러리에서 제공한다.

이를 통해 개발자는 애플리케이션의 핵심 로직을 개발하는 것에만 집중할 수 있도록 해준다.

 

 

➤ Framework 와 Library?

 

프레임워크와 라이브러리는 얼핏 보면 같은 개념이지만 차이점이 있다.

프레임워크와 라이브러리는 여러가지 필요한 기능들을 제공한다는 점에서는 비슷하지만 중요한 차이점이 바로 애플리케이션에 대한 제어권이다.

 

라이브러리는 애플리케이션 흐름의 주도권이 개발자에게 있다.

개발자가 짜 놓은 코드내에서 필요한 기능이 있으면 호출해서 자유롭게 사용이 가능하다.

 

이에 반해 프레임워크는 애플리케이션 흐름의 주도권이 개발자가 아닌 프레임워크에 있다.

프레임워크는 불러오면 코드 상에서 보이지 않는 상당히 많은 일들을 한다.

개발자가 메서드내에 코드를 작성해두면 스프링 프레임워크에서 개발자가 작성한 코드를 사용하여 애플리케이션의 흐름을 만들어낸다.

이것이 Spring Framework의 핵심개념 중 하나인 IoC(Inversion Of Control,  제어의 역전)이다.

 

 

 

 

❑ Spring Framework를 배워야 하는 이유

 

 

➤ Spring Framework란?

 

스프링 프레임워크는 Java 기반의 웹 애플리케이션을 개발하는데 필요한 프레임워크이다.

2004년 버전 1.0이 처음 릴리즈 된 이후로 Java 기반의 웹 애플리케이션을 개발하는데 있어 표준이라 해도 과언이 아닐만큼 대세가 되었다.

 

그런데 자바 기반의 웹 애플리케이션을 개발하기 위한 프레임워크는 스프링만 있는 것은 아니다. Apache Struts2, Apache Wicket, JSF(Java Server Faces), Grails 와 같은 자바 또는 JVM 기반의 웹 프레임워크들이 존재한다.

 

▶️ 그런데 왜 스프링 프레임워크가 각광받는 걸까?

대부분의 기업들이 기업용 Enterprise 시스템용 애플리케이션 개발에 있어 Framework를 선택할 때, 개발 생산성을 높이고 어떻게하면 유지보수를 더 용이하게 할 것인가에 많은 초점을 맞춘다. 스프링 프레임워크는 개발 생산성을 향상시키고 유지보수를 용이하게 해주고 그 이상도 달성할 수 있게 해준다.

*기업용 Enterprise 시스템 : 기업의 업무(조직의 업무, 고객을 위한 서비스 등)를 처리해주는 시스템, 대량의 사용자 요청을 처리해야 하기 때문에 서버의 자원 효율성, 보안성, 시스템의 안전성이나 확장성 등을 충분히 고려해서 시스템을 구축한다.

 

Spring Framework를 사용하는 이유는 이전의 기술들을 알아보면 이해할 수 있다.

 

➤ Spring Framework 이전의 기술들

 

▶️ JSP를 이용한 애플리케이션

JSP(Java server page)

백엔드/프론트엔드의 구분없이 코드에 html/Javascript, Java가 뒤섞여 있는 방식이다.

가독성이 떨어지고 유지보수도 매우 어렵다.

프론트엔드/백엔드를 구분하지 않았던 예전엔 양쪽을 모두 개발하는 개발자들이 많았기 때문에 이런 방법을 이용했다.

 

▶️ 서블릿(Servlet)을 이용한 애플리케이션

JSP 방식과 Spring에서도 내부적으로 Servlet 방식을 사용한다.

서블릿은 클라이언트 웹 요청 처리에 특화된 Java 클래스의 일종이다.

서블릿 방식을 이용한다는 의미는 서블릿을 위한 자바 코드가 클라이언트 측 코드에서

분리되어 별도의 자바 클래스로 관리된다는 것을 의미한다.

하는 일에 비해 코드가 너무 길어보인다는 단점이 있다.

 

▶️ Spring MVC를 이용한 애플리케이션

서블릿 방식의 코드를 Spring MVC 방식의 코드로 바꾸면 코드가 간결해진다.

서블릿 방식은 클라이언트의 요청에 담긴 데이터를 꺼내오는 작업을 개발자가 직접 코드로 작성해야하고, 캐릭터셋도 지정해주어야 한다.

하지만 Spring MVC 방식의 코드에서는 눈에 보이지 않지만 그런 작업들을 Spring에서 알아서 처리해준다.

그런데도 Spring 기반의 애플리케이션의 기본 도구를 잡는 설정 작업이 여전히 불편하다는 단점이 있다.

그래서 이러한 문제를 대부분 개선한 Spring Boot가 나왔다.

 

▶️ Spring Boot을 이용한 애플리케이션

이전 기술에서 구현한 것을 더 짧은 코드로 간결하게 작성할 수 있다.

Spring MVC에서 겪었던 설정의 복잡함을 Spring Boot에서는 찾아볼 수 없다.

Spring의 복잡한 설정 작업도 Spring이 대신 처리해주기 때문에 개발자는

애플리케이션의 핵심 비즈니스 로직에만 집중할 수 있게 되었다.

 

 

※ 심화 학습

 

자바 서블릿이란?

자바 서블릿 자체를 사용하는 기술은 현재 거의 사용하고 있지 않지만 Spring MVC같은 자바 기반의 웹 애플리케이션 내부에서 여전히 사용되고 있다.

 

서블릿 컨테이너란?

서블릿 기반의 웹 애플리케이션을 실행해주는 것부터 시작해서 서블릿의 생명주기를 관리하며, 쓰레드 풀을 생성해서 서블릿과 쓰레드를 매핑시켜 주기도 한다.

아파치 톰캣(Apache Tomcat)은 서블릿 컨테이너의 한 종류로써 Spring MVC 기반의 웹 애플리케이션 역시 기본적으로 아파치 톰캣에서 실행 된다.

 

 

 

 

읽어주셔서 감사합니다. 좋은하루 되세요 🦾

오개념 지적은 환영입니다~

 

1