소프트웨어학부/스프링 부트 3 개발자 되기 자바 편

02장 스프링 부트 3 시작하기

Mt.Hwang 2024. 5. 15. 17:36

 * 핵심 키워드
 1. IoC (제어의 역전)
 2. DI  (의존성 주입)
 3. AOP  (관점 지향 프로그래밍)
 4. PSA  (이식 가능한 서비스 추상화)


앤터프라이징 애플리케이션 : 대규모의 복잡한 데이터를 관리하는 애플리케이션

IoC : 객체의 생성과 관리를 프레임워크가 대신하는 것

DI : 외부에서 객체를 주입받아 사용하는 것

AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점으로 나누어서 개발하는 것

PSA : 어떤 기술을 사용하던 일관된 방식으로 처리하는 것


 * 앤터프라이즈 애플리케이션
대규모의 복잡한 데이터를 관리하는 애플리케이션

소프트웨어 분야가 발전하면서 앤터프라이즈 애플리케이션이 점점 복잡해짐
-> 서버 성능, 안정성, 보안을 신경쓰면서 개발하기 힘들어짐
-> 기능 개발에만 집중할 수 있는 스프링 프레임워크가 등장

 스프링 프레임워크
서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구


 * 스프링 부트
스프링은 설정이 매우 복잡하다는 단점이 있음
-> 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있는 스프링 부트의 등장

빠르게 스프링 프로젝트 설정 가능

스타터 (의존성 세트)를 사용해
간편하게 의존성을 사용하거나 관리 ㄱㄴ

즉, 스프링 부트는
 1. 스프링 프레임워크를 더 쉽고 빠르게 이용 ㄱㄴ
 2. 개발자가 비즈니스 로직 개발에만 집중할 수 있게 해줌

스프링 부트의 특징은
 1. 웹 애플리케이션 서버 (WAS)가 내장되어 있어서 따로 설치할 필요 x
 2. 스프링 부트 스타터 제공 (빌드 구성을 단순화해주는 것)
 3. XML 설정 없이 자바 코드를 모두 작성 ㄱㄴ
 4. JAR을 이용해 자바 옵션만으로 배포 ㄱㄴ
 5. 스프링 액츄에이터 제공 (애플리케이션의 모니터링 및 관리 도구)

수동으로 개발 환경을 구성할 필요 x


 * 웹 애플리케이션 서버  WAS  web application server
웹 애플리케이션을 실행하기 위한 장치

스프링 애플리케이션은 일반적으로
톰캣과 같은 WAS에서 배포됨

스프링 부트는 WAS를 자체적으로 가지고 있으므로
jar만 만들면 별도의 WAS 설정 없이 애플리케이션 실행 ㄱㄴ


스프링 부트 for 스프링 for 앤터프라이즈 애플리케이션 for 대규모 데이터 처리


 * 제어의 역전  IoC
Inversion of Control

다른 객체를 직접 생성하거나 제어하는 것이 아니라
외부에서 관리하는 객체를 가져와 사용하는 것

스프링 컨테이너가 객체를 관리, 제공한다

어디선가 객체를 받아온 후에
할당한다


 * 의존성 역전  DI
Dependency Injection

제어의 역저을 구현하기 위해 사용하는 방법

DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻


 * 빈
스프링 컨테이너에서 관리하는 객체

스프링에서 제공해주는 객체

@Autowired를 통해서 빈을 주입받는다

빈을 등록하는 방법은 여러가지가 있다

ex)
@Autowired
myCar Car;
ㄴ 이러면 스프링 컨테이너가 객체를 만들어서 클래스에게 준다

순서는
 1. 클래스에서 객체 사용을 요청
 2. 스프링 컨테이너가 생성 후 건내줌


즉, 정리하자면

제어의 역전  IoC
 1. 객체를 직접 생성 x
 2. 객체를 다른 곳에서 가져옴

의존성 주입  DI
 1. 제어의 역전을 구현
 2. 스프링 컨테이너가 의존성 주입을 해주는 것


 * 스프링 컨테이너
빈을 생성하고 관리


 * 관점 지향 프로그래밍  AOP
Aspect Oriented Programming

프로그래밍을
 1. 핵심 관점
 2. 부가 관점
으로 나눠서 관심 기준으로 모듈화하는 것

부가 관점 코드를
핵심 관점 코드에서 분리할 수 있게 해준다


 * 이식 가능한 서비스 추상화  PSA
Portable Service Abstraction

개발자가 쉽게 사용하는 인터페이스

일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 제공

WAS를 톰캣이 아니라 다른 곳에서 실행해도
기존 코드를 그대로 사용할 수 있다


http://localhost:8080/test
ㄴ localhost는 사용 중인 컴퓨터
ㄴ 8080은 포트 번호
ㄴ test는 경로


 * 스프링 부트 스타터
의존성이 모여 있는 기능

스타터를 사용하면
필요한 기능을 간편하게 설정 ㄱㄴ

 스타터 명명 규칙
spring-boot-starter-{작업유형}

 spring-boot-starter-web
Spring MVC를 사용해서 RESTful 웹 서비스를 개발할 때 필요한 의존성 모음

 spring-boot-starter-test
테스트하기 위해 필요한 의존성 모음

 spring-boot-starter-validation
유혀성 검사를 위해 필요한 의존성 모음

 spring-boot-starter-actuator
모니터링을 위한 의존성 모음

 spring-boot-starter-data-jpa
ORM을 위한 JPA를 더 쉽게 사용하기 위한 의존성 모음


 * MVC
M : Model
V : View
C : Controller

애플리케이션의 개발 영역을
MVC로 구분하여 각 역할에 맞게 코드를 작성하는 개발 방식

UI 영역과 도메인 (비즈니스 로직) 영역으로 구분되어
서로에게 영향을 주지 않으면서 개발과 유지보수가 가능하게 해준다

 Model
클라이언트의 요청 사항을 처리
클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 함

 View
Model을 이용하여 애플리케이션의 화면에 보이는 리소스를 제공

 Controller
클라이언트 측의 요청을 직접적으로 전달받고
Model과 View의 중간에서 상호 작용을 해준다

 서비스 계층  Service layer
클라이언트의 요총을 구체적으로 처리하는 영역

 비즈니스 로직  Business Logic
요청 사항을 처리하기 위해
코드로 구현한 것


 * 도메인
도메인 네임

인터넷에 연결된 컴퓨터를
사람이 쉽게 기억하고 입력할 수 있도록
문자로 만든 인터넷 주소 (영문, 한글로)

외우거나 식별하기 어려운 IP 주소를
기억하기 쉽게 만들어주는 네트워크 호스트 이름

ex)
240.10.20.1이 기억하기 어려우니까
example.com으로 기억할 수 있게 하는 것


 * 톰캣  Tomcat
아파치 소프트웨어 재단에서 개발하는
java 기반의 서블릿 컨테이너이자 웹 서버

웹사이트를 구축할 때 사용된다


 * 서블릿 컨테이너  Servlet Container
서버에서 실행되고
서블릿과 상호작용할 수 있는 프로그램

웹 애플리케이션을 서버에서 실행하려면
 1. 서블릿 컨테이너를 먼저 배포
 2. 그 안에 서블릿을 배치


 * 서블릿  Servlet
동적 웹 페이지를 만들 때 상요되는
자바 기반의 웹 애플리케이션 프로그래밍 기술

웹 요청과 응답의 흐름을
간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해준다

서블릿 동작 과정은
 1. 클라이언트가 웹 서버에 요청
 2. 웹 서버가 그 요청을 WAS에 위임
 3. WAS는 각 요청에 해당하는 서블릿 실행
 4. 서블릿은 요청에 대한 기능을 수행한 후 결과를 반환하여 클라이언트에게 전송


build.gradle 파일을 통해서
의존성을 확인 할 수 있다


 * 자동 구성
스프링 부트는
애플리케이션이 최소한의 설정만으로도 실행되게
여러 부분을 자동으로 구성

자동 구성되는 클래스는 AutoConfiguration이,
속성값을 정의해놓은 클래스는 Properties가
이름 끝에 붙어 있다


 configure
(컴퓨터의) 환경을 설정하다

 configuration
(컴퓨터) 환경 설정
배열, 배치, 배열 형태


 * 텍스트 블록
여러 줄의 텍스트를 작성할 때
\n 없
""로 감싼 텍스트를 사용해 여러 줄의 텍스틀를 표현할 수 있게 해주는 것


 * formatted()
값을 파싱하기 위한 메서드


 * 파싱  parsing
구문 분석

특정 형식으로 구성된 데이터를 분석하고
그 의미를 이해하는 과정

코드가 프로그래밍 언어의 문법에 맞는지 확인하는 과정


 * 패턴 매칭
타입 확인을 위해 사용하던 instanceof 키워드를
조금 더 쉽게 사용할 수 있게 해주는 것

형변환 코드의 조합 없이
instanceof 키워드를 바로 사용할 수 있다


 * 스프링 부트의 시작
public class 안에 main() 메서드를 넣어두면
그 클래스러부터 스프링 부트가 시작

 @SpringBootApplication
스프링 부트 사용에 필요한 기본 설정 해줌

 SpringApplicatoin.run()
애플리케이션을 실행
SpringApplicatoin.run(name.class, args);
ㄴ 첫 번째 인수인 name.class는 메인 클래스로 사용할 클래스를 의미
ㄴ 두 번째 인수인 args는 커맨드 라인의 인수들을 전달

@SpringBootApplication 구성은
 1. @SpringBootConfiguration
 2. @ComponentScan
 3. @EnableAutoConfiguration

 @SpringBootConfiguration
스프링 부트 관련 설정을 나타냄
@Configuration을 상속해서 만든 애너테이션

 @ComponentScan
빈을 읽고 등록하는 애너테이션
@Component라는 애너테이션을 가진 클래스들을 찾아 빈으로 자동 등록

 @EnableAutoConfiguration
자동 구성을 활성화
스프링 부트 서버가 실행될 때
스프링 부트의 메타 파일을 읽고
정의된 설정들을 자동으로 구성

 @Configuration
설정 파일 등록

 @Repository
ORM 매핑

 @Controller
라우터
@Component 애너테이션을 가지고 있음
ㄴ 빈으로 등록 가능

 @RestController
라우터

 @Service
비즈니스 로직


 * ORM
Object Relational Mapping

객체로 연결 받는다

데이터베이스 연결 시
SQL 언어가 아닌 자연적으로 개발 언어로 데이터베이스에 접근할 수 있게 해주는 도구

SQL 언어 사용없이
개발 언어의 일관성과 가독성을 높여줌


* 라우터 (스프링)
HTTP 요청과 메서드를 연결하는 장치

라우터가 있어야
클라이언트의 요청에 맞는 메서드를 실행 ㄱㄴ

@RestController가 라우터 역할을 한다

ex)
@RestController
public class TestController {
  @GetMapping("/test")
  public String test() {
    return "Hello, world!";
  }
}
ㄴ @RestController은 라우터 역할
ㄴ /test 요청이 오면 test() 메서드 실행
ㄴ /test 요청은 인터넷 주소를 말함


 * 라우터  Router (네트워크)
한 개 이상의 근거리 통신망 (LAN) 간에
데이터를 전달하는 게이트웨이

인터넷 프로토콜 (IP)을 사용하여
데이터가 포함된 IP 패킷을 전송하며
분리된 각각의 근거리 통신망 (LAN)에 위치한 원본 및 대상 디바이스의 IP 주소를 사용

상위 통신망과 하위 통신망 사이를
중계해주는 기계


 * 패킷  Packet
네트워크 전송의 용량 단위


 * 메타 데이터
데이터에 대한 설명을 담고 있는 데이터

..~~~~..

 * 스프링
앤터프라이즈 애플리케이션을 쉽게 개발할 수 있도록 도와주는
프레임워크


 * IoC
제어의 역전


 * DI
의존성 주입


 * 스프링 부트
스프링을 더 빠르고 쉽게 사용하기 위한 도구

스타터와 자동 구성을 제공


 * 애너테이션
자바 소스 코드에 추가하는 표식

메타 데이터 사용에 많이 ㅆ스인다

 * @SpringBootApplication
 1. @SpringBootConfiguration
 2. @ComponentScan
 3. @EnableAutoConfiguration
으로 구성되어 있다

 @SpringBootConfiguration
스프링 부트 관련된 설정을 함

 @ComponentScan
사용자가 등록한 빈을 읽고 등록

 @EnableAutoConfiguration
자동 설정으로 등록되는 빈을 읽고 등록


 * @Component
@Component 애너테이션이 있는 클래스는 빈으로 등록됨

 1. @Controller
 2. @RestController
 3. @Configuration
 4. @Repository
 5. @Service
모두 @Component 애너테이션을 가지고 있음
상황에 맞춰서 사용하자!

..~~~~..

스프링 부트는 XML 설정을 하지 않고 자바 코드로 모두 작성할 수 있다


 * XML
Extensible Markup Language

데이터를 정의하는 규칙을 제공하는 마크업 언어

 마크업 언어
태그 등을 이용하여
데이터의 구조를 기술하는 언어의 한 가지

자체적으로 컴퓨팅 작업을 수행할 수 없지만
구조적 데이터 관리를 위해 모든 프로그래밍 언어 or 소프트웨어를 구현할 수 있다

W3C에서 만든 것


 * IoC  제어의 역전
다른 객체를 직접 생성하거나 제어하는 것이 아니라
외부에서 관리하는 객체를 가져와 사용하는 개념


 * 빈으로 등록되는 애너테이션
 1. @Component
 2. @Controller
 3. @Service
 4. @Repository