[Spring] 스프링 개념 공부 기록

배채윤·2021년 1월 20일
0
post-thumbnail

인프런의 '신입 프로그래머를 위한 자바 스프링(Spring) 프레임워크 강좌' 를 수강하고 요약한 내용입니다.


1. 개요

📌 스프링 프레임워크?

스프링 프레임워크는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크다.
동적인 웹사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다.
DI, AOP, MVC, JDBC 등을 제공한다.

객체 지향 언어가 가진 장점을 최대한 활용할 수 있도록 돕는 프레임워크라고 볼 수 있다.

📌 스프링 프레임워크 모듈

  • spring-core: 스프링의 핵심인 DI(Dependency Injection)와 IoC를 제공
  • spring-aop: AOP 구현 기능 제공
  • spring-jdbc: 데이터 베이스를 쉽게 다룰 수 있는 기능 제공
  • spring-tx: 트랜잭션 관련 기능 제공
  • spring-webmvc: mvc 구현 기능 제공

📌 스프링 컨테이너

스프링에서 객체를 생성하고 조립하는 컨테이너(Container)로, 컨테이너를 통해 생성된 객체를 빈(Bean)이라고 부른다.

1) 객체 생성 및 속성 데이터 작성
2) 스프링 컨테이너에서 객체(빈) 생성 및 조립
3) 애플리케이션 구현

📌 IoC(Inversion of Control)

참조: IoC와 DI

제어의 역전. 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라 외부에서 결정하는 것을 의미.
일반 main 메소드에서 시작해서 개발자가 정한 순서에 따라 객체가 생성되고 실행된다.
그러나 서블릿을 생각해보자. 서블릿을 개발해서 서버에 배포할 수는 있지만 배포하고 나서는 개발자가 직접 제어할 수 있는 방법은 없다. 대신 서블릿에 대한 제어 권한을 가진 컨테이너가 적절한 시점에 서블릿 클래스의 객체를 만들고 그 안의 메소드를 호출한다.
이를 제어의 역전이라 표현한다.
일반적으로 프레임워크가 사용되는 방식을 제어의 역전이라 보면 된다.

  • 프레임워크 + 프레임워크가 요구하는 것을 개발자가 개발 => 조립
  • 조립된 코드의 최종 호출은 프레임워크 내부에서 결정된대로 이루어짐.

2. 개발환경

📌 JVM

  • JVM : .java 소스코드를 컴파일한 바이트코드(.class)를 읽고, 검증, 실행함. 동일한 실행환경을 보장받음
  • JRE : 자바를 실행하기 위한 프로그램. JVM + 자바 라이브러리, 기타 파일들을 가지고 있음.
  • JDK : Java Development Kit 의 약어로 자바 컴파일러와 디버거, JRE 등이 포함된 개발 도구다. 단순히 자바를 실행하는 경우에는 JRE(Java Runtime Environment)만 있어도 된다.

📌 Maven을 이용한 프로젝트 세팅

참조: Maven이란?

  • 빌드?
    java 소스코드, 자원(.xml, .jpg, .properties)을 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징하는 과정 및 결과물
  • 빌드 도구?
    프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램.
    Java 진영에서는 Ant -> Maven -> Gradle 순으로 사용해왔다.
  • Maven
    자바용 프로젝트 관리도구로, 프로제트의 전체 라이프 사이클을 관리한다.
    필요한 라이브러리를 pom.xml에 정의해놓으면 해당 라이브러리를 네트워크를 통해 자동으로 다운받아준다.

📌 Bean의 범위

싱글톤

소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
만약 우리가 만들었던 DI 컨테이너인 요청을 할 때마다 새로운 객체를 생성한다면. 요청이 엄청나게 많은 트래픽 사이트에서는 계속 객체를 생성하게 되면 메모리 낭비가 심하다. 이런 이유로 스프링은 모든 빈에 대하여 싱글톤으로 유지되도록 한다.
스프링 컨테이너에서 생성된 빈 객체의 경우 동일한 타입에 대해서는 기본적으로 한 개만 생성이 되며, getBean() 메소드로 호출될 때 동일한 객체가 반환된다.

프로토타입

싱글톤 범위와 반대의 개념.
설정 파일(applicationContext.xml)에서 빈 객체를 정의할 때 scope 속성을 명시해줌으로써 구현 가능하다.

3. 스프링의 DI

📌 DI

참조: IoC와 DI

Dependency Injection의 약자. 의존성 주입
제어의 역행이 일어날 때 스프링이 내부에 있는 객체들 간의 관계를 관리할 때 사용하는 기법

의존적인 객체를 직접 생성하거나 제어하는 게 아니라
특정 객체에 필요한 객체를 외부에서 결정해서 연결하는 것

즉, 우리는 클래스 기능을 추상적으로 묶어둔 인터페이스를 갖다 쓰면 되는 것.
나머지는 스프링이 객체를 주입해주기 때문.

모듈 간 결합도를 낮추고 유연성을 높일 수 있다.

생성자에서 주입

예) 배터리 일체형 : 배터리가 떨어지면 장난감을 새로 구입해야 한다.

public class ElectronicCarToy {
	
    private Battery battery;
    
    public EletronicCarToy() {
    	battery = new NormalBattery();
    }
}

Setter에서 주입

예) 배터리 분리형 : 배터리가 떨어지면 배터리만 교체하면 됨

public class ElectronicCarToy {
	
    private Battery battery;
    	
    public EletronicCarToy() {}
    
    public void setBatter(Batter battery) {
    	this.battery = new NormalBattery();
    }
}

생성자 + Setter 에서 주입

예) 배터리 분리형 : 배터리가 떨어지면 배터리만 교체하면 됨

public class ElectronicCarToy {
	
    private Battery battery;
    	
    public EletronicCarToy(Battery battery) {
	this.battery = new NormalBattery();
    }
    
    public void setBatter(Batter battery) {
    	this.battery = new NormalBattery();
    }
}

📌 의존 객체 자동 주입

스프링 설정 파일에서 의존 객체를 주입할 때 <contructor-org> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 해당 객체가 필요한 객체에 주입해 주는 기능.

  • @Autowired: 타입이 일치하는 객체를 자동으로 주입. required 속성을 사용하면 해당 빈(의존대상객체)이 없어도 Exception 처리하지 않는다.
  • @Inject: 타입이 일치하는 객체를 자동으로 주입. required 속성 지원 X
  • @Resource: 이름이 일치하는 객체를 자동으로 주입
  • @Qualifier: 사용할 의존 객체를 선택할 수 있게 함.

4. MVC

아키텍쳐 패턴 중 하나. 서브 시스템을 model, view, controller로 구조화하는 패턴
controller가 요청을 받으면 핵심 기능과 데이터를 보관하는 model을 이용하여 view에 정보를 출력

profile
새로운 기술을 테스트하고 적용해보는 걸 좋아하는 서버 개발자

0개의 댓글