본문 바로가기
3.1SpringBoot/3.1.2 묘공단 SpirngBoot3

[묘공단/spring] 2장 스프링 부트3 시작하기

by Dohi._. 2023. 9. 20.

포스팅 목차  (책의 목차와 다릅니다 개인적으로 공부한 내용입니다)

2장

  2-1. What is Spring? 

  2-2. IoC / DI / Been / Container

  2-3. AOP , PSA

  2-4. Spring Boot starer

  2-5. Spring Boot 3 간단하게 실행해보기

 

 

2-1. What is Spring? 

소프트웨어 분야가 발전하면서 대규모의 복잡한 데이터를 관리하는 애플리케이션(엔터프라이즈 애플리케이션)은 점점 복잡해졌습니다 

그러다 보니 개발자는 전체적으로 신경 쓰면서 보안,안정성,서버제작을 하면서 로직,기능까지 개발하기엔 어려웠습니다.

스프링 프레임워크(Spring framework)는 위에서 언급한 서버,안정성,보안을 제공하는 프레임 워크였고 

개발자는 기능과 로직에만 집중을 할 수 있습니다 

하지만 Spring framework의 문제점은 로직과 기능만을 집중할 수 있는 프레임워크이지만 설정을 하기에는 너무 복잡하고 어렵습니다

어려움을 해결 하기 위해서 스프링 부트가 나왔습니다

 

스프링 부트(Spring Boot)는 스프링에 속한 도구이지만 몇 가지의 차이가 있습니다

차이점

  •  WAS : 웹애플리케이션을 실행하기 위한 장치
    • Spring Boot 내부에 Tomcat이 포함되어서 따로 Tomcat을 설치하거나 매번 버전을 관리해 주어야 하는 수고로움을 덜어준다. (톰캣,제티,언더토우등등)
  • Spring Boot starter을 통한 dependency 자동화 
    • Spring Boot starter : 손쉽게 원하는 라이브러리를 import 할 수 있다.
    • starter는 간편하게 dependency를 제공해주는데, 만약 우리가 JPA가 필요하다면 pom.xml(메이븐)이나 build.gradle(그레이들)에 'spring-boot-starter-data-jpa'만 추가해주면 spring boot가 그에 필요한 라이브러리들을 알아서 받아온다.
  • XML설정을 하지 않아도 된다.
요약 Spring framework Spring Boot 
설정 파일 수동 자동
XML 일부 파일은 XML직접관리 사용하지않아도됨
WAS 별도로 설치,수동 설정 제공하여 별도의 설정 필요없음
인메모리 DB 지원하지 않음  자동 설정 지원( H2 ,HSQL,Derby)
dependency (의존성) 수동설정 자동화 가능

 

 

2-1. Ioc / DI / container / bean 

스프링을 공부하다보면 IoC(제어의 역전)과 DI(의존성 주입)을 알면 스프링이라는 프레임워크가 돌아가는 원리를 이해하기 편합니다.

왜냐하면 스프링의 대부분 기능은 IoC와 DI에 기반을 두고 있기 때문입니다.   참고 :스프링 공식문서

 

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

자바를 공부하다보면 객체는 항상 필요한 곳에서 직접 생성을 했을 것입니다.

dohi = new Dohi(); //new 키워드로 클래스Dohi의 객체 생성

IoC는 객체를 직접 생성, 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와서 사용하는 것을 뜻합니다

스프링에 적용을 해보면 스프링은 스프링 컨테이너가 객체를 관리,제공하는 역할을 합니다 

private Dohi dohi; //객체를 코드에서 생성하는 것이아니라 받아온 객체를 dohi에할당

 

DI ( 의존성 주입 / Dependency Injection )

위에서 본 것처럼 스프링에서는 객체를 관리할때 IoC(제어의 역전)을 사용합니다.

스프링 컨테이너가 생성한 객체를 클래스가 의존한다고 생각하면 편합니다. 

의존이라고 하면 더 어려워진다면 객체가 필요할때마다 스프링 컨테이너에 주입받아 사용한다고 생각하면 편합니다.

 

예시

public class DiTest{
	@Autowired
	Dohi dohi;
}
*@Autowired
DI을 할 때 사용하는 애노테이션 : 의존 객체의 타입에 해당하는 빈(Bean)을 찾아 주입하는 역할을 합니다.

 

기존 코드들은 생성자를 사용해서 직접 생성을 했어야 했지만 위에 예시코드는 DiTest class에서 Dohi라는 객체를 dohi에 주입받아서 사용합니다

Ioc/DI는 중요한 개념이고 Spring의 메인 개념입니다

 

스프링 컨테이너(Spring Container)

IoC를 설명하다 스프링 컨테이너에 대해서 이야기했습니다 간단하게 스프링의 빈(Bean)을 생성하고 관리합니다.

스프링 컨테이너는 IoC Container 혹은 DI Container 라고도 불리는데 컨테이너가 IoC 혹은 DI를 주로 진행하기 때문이다.

즉, 스프링 컨테이너는 스프링 Bean들을 생성하고 관리를 한다고 생각하면 편합니다.

또한 @Autowired와 같은 애너테이션을 사용해서 빈을 주입받을수 있게 DI를 지원하기도 합니다.

 

+ 추가 지식 

스프링 컨테이너는 BeanFactory와 ApplicationContext로 주로 나눌수가 있습니다 (참고사이트)

  • BeanFactory
    • Bean 관리, 조회를 담당
    •  스프링 컨테이너의 중심이 되는 인터페이스
  • ApplicationContext
    • BeanFactory 기능을 모두 상속받고 추가 기능제공
    • 메시지 소스 기반 국제화 기능
    • 애플리케이션 이벤트 관리
    • 더 많은 기능이 있습니다 (리소스 조회, 환경변수등등)

 

보통 스프링 컨테이너라고 하면 ApplicationContext를 뜻합니다.

BeanFactory의 모든 기능을 상속받는데다가 편리한 추가기능을 제공하기 때문입니다.

 

 

스프링 빈(Bean)

스프링 컨테이너에 의해 관리되고 애플리케이션의 핵심을 이루는 객체들을 스프링 빈이라고 부릅니다.

스프링 빈은 스프링 컨테이너에 의해 인스턴스화되어 조립,관리되는 객체

즉, 스프링 빈은 스프링의 객체로 이해하면 편합니다

 

스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML파일 설정,애너테이션 추가 등 여러방법을 제공합니다.

예를들어 DoHi라는 클래스에 @Component 애너테이션을 붙이면 DoHi 클래스가 빈으로 등록됩니다.

그럼 스프링 컨테이너에서는 Dohi 클래스를 빈으로써 클래스의 첫글자를 소문자로 바꿔서 관리하게 됩니다

Class : DoHi  →  Bean : doHi
@Component //Class (DoHi)를 Bean (doHi)으로 등록  
public class DoHi{
}​

 

2-3. AOP , PSA 

AOP (관점 지향 프로그래밍 / Apsect Oriented Programming)

관점 지향 프로그래밍은 직관적으로 이야기를 하면 "관점을 기준으로 기능을 분리하는 프로그래밍"이라는 것인데요

좀 더 풀어서 이해를 해보면 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미합니다.

예를 들어 버스표를 예약하는 프로그램이 있다면

핵심 관점은 결제 , 고객 정보 관리 라고 합시다 

결제에는 일어나고 있는 일들을 기록하는 로깅로직 결제내역을 저장하는 DB연결 등등

고객 정보 관리는 일어나고 있는 일들을 기록한 로깅로직, 결제내역및 예매표를 저장하는 DB연결 등등

 

DB연결과 로깅은 부가 관점으로 볼 수 있습니다

 

부가관점에 해당하는 로직을 모듈화해서 핵심 관점 코드에서 분리할 수 있게 해줍니다

결과적으로 핵심 관점 코드에만 집중할 수 있게 되며 프로그램의 변경과 확장에도 유연하게 대응이 가능해집니다.

 

PSA (이식 가능한 서비스추상화 / Portavle Service Abstraction)

이식 가능한 서비스 추상화는 스프링에서 제공하는 다양한 서비스(기술)들을 추상화해서 개발자가 쉽게 사용하는 인터페이스를 말합니다

간단하게 말하면 어느 기술을 사용하더라도 일관된 방식으로 처리하도록 하는 것 이라고 이해하면 될 것 같습니다

 

예시로 DataBase에 접근하는 기술중 JDBC, MyBatis, JPA가 있고  WAS도 톰캣, 언더토우, 네티 같은 것들을 

기존에 사용하는 코드들을 그대로 사용할 수 있게 하는 것이 대표적인 PSA라고 생각하면 편합니다.

 

요약
환경과 세부기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 설계 원칙
예를 들어 데이터베이스에 관계없이 동일하게 적용 할 수 있는 트랜잭션 처리 방식

 

 

지금까지 스프링의 주요 콘셉인 IoC,DI, AOP,PSA에 대해서 알아보았습니다 

Spring boot에대해서 들어가기전에 이해하고 넘어가는 것이 좋습니다!

 

 

2-4. Spring Boot starer

 

스프링 부트 스타터는 의존성이 모여 있는 그룹으로 필요한 기능을 간편하게 설정이 가능합니다.

또한 스타터는 spring-boot-starter-{작업유형} 이라는 명명규칙이 있다.

이규칙을 이용해서 필요한 기능을 찾을때 스타터를 쉽게 찾을 수 있을 것입니다

자주 사용하는 스타터를 한번 둘러 보면

스타터 설명
spring-boot-starter-web SpringMVC를 사용하여 RESTful 웹 서비스 개발할 때 필요한 의존성 모음
spring-boot-starter-test 테스트하기 위한 필요한 의존성 모음
spring-boot-starter-validation 유효성 검사를 위한 의존성 모음
spring-boot-starter-actuator 모니터링을 위해 제공하는 다양한 정보를 제공하기 쉽게하는 의존성 모음
spring-boot-starter-data-jpa ORM을 사용하기 위한 인터페이스의 모음인 JPA를 쉽게 사용하기 위한 의존성 모음

 

2-5. Spring Boot 3 간단하게 실행해보기

Spring 파일에서 TestController.java를 만들어 본후에 아래 코드를 입력해 봅시다 

@RestController //@Controller에 @ResponseBody가 결합된 애너테이션
public class TestController {
	@GetMapping("/test") 
	public String test() {
		return "Hello, world!";
	}
}

해당 코드를 run을 하고 브라우저에서 localhost:8080/test로 접속을 하면 

return값인 "Hello, world!"가 출력이 됩니다

 

이유는

@GetMapping에서 설정한 경로즉 /test에 접속을 하였고 

클라이언트에서 보낸 get요청에 대해 test()함수의 리턴값을보내줬기 때문입니다

 

경로의 의미는 아래와 같습니다.

http://localhost:8080/test
localhost  → 현재 사용 중인 컴퓨터 (ip 127.0.0.1)
8080 → 포트번호 (스프링 부트의 포트 번호)
test → 경로 (해당 경로로 메서드와 매핑이 됨)

 

 


이 글은 골든래빗 《스프링 부트 3 백엔드 개발자 되기 - 자바 편》의 2장 써머리입니다.

 

728x90

댓글