백엔드/Spring Boot

2. 스프링 부트 시작하기 (1) - 스프링 콘셉트 공부

두개의 문 2023. 7. 10. 17:46
포스트맨 설치

 • 별도의 애플리케이션

 • HTTP 요청을 보낼 수 있는 클라이언트 프로그램 

 • API 개발을 마친 브라우저에서 테스트하기 보다, 포스트맨을 이용하기  

 

 . 다운로드 

   ① 구글에서 포스트맨 검색 - 다운로드 : Mac Apple Chip 클릭 - 파인더에서 다운로드 받은 파일 클릭해서 실행시키면 설치 완료!

   ② 하단 Skip and go to the app 클릭 : 계정없이 사용해보기 

 

 

 ③ 프로젝트 실행시킨 , 포스트맨에서 호출해보기 

 

 


1. 스프링과 스프링 부트 

1) 스프링의 등장 

  - 엔터프라이즈 애플리케이션 ( Enterprise Application ) 

   ▪︎ 대규모의 복잡한 데이터를 관리하는 애플리케이션 용어

   ▪︎ 소프트웨어의 발전으로 엔터프라이즈 애플리케이션이 점점 복잡해짐 

      → ( 예시 )

           은행 시스템 : 굉장히 많은 사람들이 한꺼번에 잔고 조회, 입금 및 출금 요청, 새 계좌 개설 진행 

            ⇒ 많은 사용자의 요청을 동시에 처리 

                 ∴  서버 성능과 안정성, 보안이 매우 중요! 

                      사실상 이런 것들을 신경쓰면서 사이트 기능 즉, 비즈니스 로직까지 개발하기는 매우 어려운 상황 

  - 이런 상황에서 '스프링 프레임워크'가 등장

   ▪︎ 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구 

        → 덕분에 개발자들은 기능 개발에 집중할 수 있게 됨 

 

 


2) 스프링을 더 쉽게 만들어주는 스프링 부트 

 

  - '스프링'의 경우, 장점이 많은 개발도구이지만 설정이 매우 복잡하다는 단점이 있음 

  - 이런 단점을 인식하고 보완하고자 '스프링 부트'를 출시함 

 

 

   ▪︎ '스프링 부트' 

      • 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구 

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

      • 의존성 세트라고 불리는 스타터를 사용해 간편하게 의존성을 사용하거나 관리 가능 

 

 

   ▪︎ '스프링 부트' 의 주요 특징 

    ① 톰캣, 제티, 언더토우 같은 웹 애플리케이션 서버 (Web Application Server, WAS )가 내장 → 따로 설치하지 않아도 독립적으로 실행 가능 

    ② 빌드 구성을 단순화하는 스프링 부트 스타터 제공 

    ③ XML 설정을 하지 않고 자바 코드로 모두 작성 가능 

    ④ JAR를 이용해서 자바 옵션만으로도 배포 가능 

    ⑤ 애플리케이션의 모니터링 및 관리 도구인 스프링 액츄에이터 (spring actuator)를 제공 

 


◉ 참고! 

    스프링 부트와 스프링은 다른 도구가 아니다!

    스프링 부트는 스프링에 속한 도구! 단, 개발할 때 몇 가지의 차이점 존재 

    차이점에 대해 알아보자 


 

 

❶ 구성의 차이 

  - 스프링 : 애플리케이션 개발에 필요한 환경을 수동으로 구성하고 정의해야 함 

  - 스프링 부트 : 스프링 코어와 스프링 MVC의 모든 기능을 자동으로 로드 → 수동으로 개발환경을 구성할 필요 없음 

 

 

❷ 내장 WAS의 유무

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

  - WAS란?

    • 웹 애플리케이션을 실행하기 위한 장치

  - 스프링 부트의 경우, WAS를 자체적으로 가지고 있음 

    → JAR 파일만 만들면 별도의 WAS 설정을 하지 않아도 애플리케이션 실행 가능 

 

▪︎ 스프링과 스프링 부트의 특징 비교 

  스프링 스프링 부트 
목적 엔터프라이즈 애플리케이션 개발을 더 쉽게 만들기 스프링의 개발을 더 빠르고 쉽게 하기 
설정파일  개발자가 수동으로 구성  자동 구성 
XML 일부 파일은 XML로 직접 생성하고 관리  사용하지 않음 
인메모리 데이터베이스 지원 지원하지 않음  인메모리 데이터베이스 자동 설정 지원
서버 프로젝트를 띄우는 서버( 톰캣, 제티)를 별도로
수동 설정 
내장형 서버를 제공해 별도의 설정이 필요 없음 

  

 

 


2. 스프링 콘셉트 공부하기 

1) 제어의 역전과 의존성 주입 

 

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

    ▪︎ 자바의 경우,

      객체를 생성할 때 객체가 필요한 곳에서 직접 생성 ( 순방향 ) 

// * 클래스 A에서 클래스 B 객체 생성의 예 
public class A {
	b = new B();	// 클래스 A에서 new 키워드로 클래스 B의 객체 생성. 
}

 

    ▪︎ 스프링의 경우,

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

        - 스프링 컨테이너가 객체를 관리 및 제공하는 역할을 수행 

// * 스프링 컨테이너가 객체를 관리하는 방식의 예 
public class A {
	private B b;	// 코드에서 객체를 생성하지 않음. 어디선가 받아온 객체를 b에 할당.
}

 

 

◉ DI ( Dependence Injection, 의존성 주입 )

  ▪︎ 스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용 

  ▪︎ 제어의 역전을 구현하기 위해 사용하는 방법이 DI, 의존성 주입! 

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

   

  ▪︎ 다음은 IoC / DI를 기초로 하는 스프링 코드 

// * 객체를 주입받는 모습의 예
public class A {
    // A에서 B를 주입받음 
    @Autowired
    B b;
}

  - @Autowired 

    • 스프링 컨테이너에 있는 빈을 주입하는 역할 

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

 

  - 위의 코드를 살펴 보면,

     B b; 라고 선언했을 뿐 직접 객체를 생성하지는 않고 있음 

     즉, 스프링 컨테이너에서 객체를 주입받고 있음

     ( = 스프링 컨테이너가 B 객체를 만들어서 클래스 A에 준 것 ) 

 

 


2) 빈과 스프링 컨테이너 

 

◉ 스프링 컨테이너 

  ▪︎ 스프링은 스프링 컨테이너 제공 → 스프링 컨테이너에서 빈을 생성하고 관리 

  ▪︎ 즉, 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리! 

  ▪︎ 또한, 개발자가 '@Autowired' 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원함 

 

 

◉ 빈 

  ▪︎ 스프링 컨테이너가 생성하고 관리하는 객체 

  ▪︎ 스프링의 경우, 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등 여러 방법을 제공함 

    ⇒ 즉, 빈을 등록하는 방법은 다양하다! 

  ▪︎ ( 예시 ) 클래스를 빈으로 등록

@Component  // 클래스 MyBean를 빈으로 등록  
public class MyBean {
}

  - @Component 

    • 클래스를 빈으로 등록하는 역할 
    • 빈으로 등록되면, 스프링 컨테이너가 이 클래스를 관리함 

       → 이때 빈의 이름은 클래스의 이름의 첫글자를 소문자로 바꿔 관리 : myBean

    

 

 


3) 관점 지향 프로그래밍 

 

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

  ▪︎ 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미 

  ▪︎ ( 예시 )

    계좌 이체, 고객 관리하는 프로그램 

    - 각 프로그램에는 아래의 로직이 포함됨 

      • 로깅 로직 : 지금까지 벌어진 일을 기록하기 위한 로직 

      • 연결 로직 : 여러 데이터를 관리하기 위한 데이터베이스 연결 로직 

    - 이때, 

       핵심 관점 : 계좌 이체, 고객 관리 로직 

       부가 관점 : 로깅, 데이터베이스 연결 로직 

       즉, 로깅과 데이터베이스 연결 로직은 계좌 이체와 고객 관리에 모두 필요  

    - AOP 관점을 적용하면, 부가 관점에 해당하는 로직을 모듈화해 개발 

      즉, 부가 관점 코드를 핵심 관점 코드에서 분리할 수 있게 해줌 

      ⇒ 개발자는 핵심 관점 코드에만 집중 가능 & 프로그램의 변경과 확장에도 유연하게 대처 가능 

 

 

 


4) 이식 가능한 서비스 추상화 

 

◉ PSA ( Portable Service Abstraction, 이식 가능한 서비스 추상화 )

  ▪︎ 스프링에서 제공하는 다양한 기수들을 추상화해 개발자가 쉽게 사용하는 인터페이스로, 추상화를 통해 코드 간결해짐 

  ▪︎ 서로 다른 기술 스택을 사용하는 여러 환경에서 공통된 API를 사용하여 개발을 간소화하는 개념 

  ▪︎ 데이터베이스, 원격 호출 등 다양한 기술에 대해 추상화된 API를 제공하여 개발자가 서로 다른 환경에서 일관된 방식으로 개발할 수 있도록 도와주는 역할  

 

 


🗣️ 한 줄로 정리하는 핵심 개념 4가지 

   ▪︎ IoC : 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임 워크가 대신하는 것

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

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

   ▪︎ PSA : 어느 기술을 사용하던 일관된 방식으로 처리하도록 하는 것 

 

 


스프링 프레임워크는 IoC / DI를 통해 객체 간의 의존 관계를 설정하고,

AOP를 통해 핵심 관점과 부가 로직을 분리해 개발하며,

PSA를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용하도록 한다!