새소식

반응형
Java/Spring

Spring 이란

  • -
반응형

Spring 이란?

Java 개발을 편하게 해주는 오픈소스 경량급 *애플리케이션 프레임워크이다.

Spring 프레임워크이기 때문에 개발하기 좋은 틀을 제공한다.

가벼우면서 대규모 개발을 지원하는 엄청난 프레임워크이다.

가장 큰 특징으로는 의존성 주입(DI, Dependency Injection), 제어의 역전(IOC, Inversion Of Control)이다.

객체와 객체간 등 서로 결합도를 낮추는 방식으로 어플리케이션을 개발할 수 있다.

 

위 이미지 출처 : spring.io

 

* 프레임워크

개발을 쉽고 편리하게 개발하기 위한 이미 만들어진 틀을 의미한다.

 

라이브러리와 다른점은 라이브러리는 개발을 하기 위한 도구를 가져다가 쓰는거고

프레임워크는 이미 만들어진 틀에다가 정해진 규칙에 따라 개발을 해야한다.

 

* 어플리케이션 프레임워크

기본적으로 프레임워크나 라이브러리는 특정 기술, 업무 분야에 동작하는 한가지 기술에 집중된다.

하지만 어플리케이션 프레임워크는 특정 기술이나 업무 분야에 국한되지 않고 전 영역을 포괄하는

범용적인 프레임워크를 칭한다.

 

* 참조한 사이트

https://12bme.tistory.com/157

 

[스프링] 스프링이란 무엇인가?

스프링은 기본적으로 IoC와 DI를 위한 컨테이너로서 동작하지만 그렇다고 "스프링은 단지 IoC/DI 프레임워크다"라고는 말할 수 없습니다. 스프링은 단순히 IoC/DI를 편하게 적용하도록 돕는 단계를

12bme.tistory.com

 

Spring 동작 원리

1. Spring 웹 어플리케이션이 실행되면 WAS(Tomcat 등)에 의해 web.xml 파일이 로드된다.

2. web.xml에 설정되어 있는 ContextLoaderListener 가 생성된다.

3. 생성된 ContextLoaderListener 가 ApplicationContext를 생성하는 역할을 한다. ApplicationContext는 Spring Bean 등 

    각종 기능을 저장하고 있는 공간이라고 생각하면 된다.

4. ApplicationContext에 등록되어 있는 설정에 따라 Spring Container가 구동된다. 설정정보는 Conponent-scan,

    DB 설정 등이다. 

5. 클라이언트로부터 웹 어플리케이션 요청이 들어온다.

6. 요청이 들어오면 모든 요청을 받는 FrontController인 Dispatcher Servlet에 의해 적절한 Controller에게 요청을

    넘겨준다. Dispatcher Servlet은 보통 화면에 보여줄 View 설정(View Resolver)을 주로 한다.

7. Controller, Service, DAO에 의해 데이터를 가공 및 처리하고 응답하면 Dispatcher Servlet은 적절한 View 객체를

    생성하여 화면에 보여준다.

 

 

Spring 특징

1. Ioc(Inversion Of Control제어의 역전)와 DI(Dependency Injection)

IOC(Inversion Of Control)

제어의 역전을 의미하며, 객체나 메소드의 생성과 생명주기를 컨테이너가 관리해주는걸 의미한다.

메소드나 객체의 호출작업을 개발자가 결정하는게 아닌 외부에서 결정 되는것이다.

쉽게 말해 객체의 제어권을 IOC 컨테이너에게 넘겨주어 객체의 생성부터 생명주기 관리까지 객체의 

제어권이 바뀐것을 IOC라고 한다.

 

IOC를 사용하지 않는 경우 - new 방식을 써서 객체를 필요할때마다 생성한다.

IOC를 사용하는경우 - new 방식을 써서 객체를 생성할 필요가 없다.

 

IOC 컨테이너 특징

1. IOC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.

2. POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.

3. 개발자들이 직접 POJO를 생성할 수 있지만, 컨테이너에게 맡긴다.

 

 

예)

//Test 객체
class Test{
    String name;

    public void setName(String name){
         this.name = name;
    }
    public String getName(){
         return name;
    }
}

//main
public static void main(String[] args){
     //IOC 컨테이너에게 맡기지 않고 개발자가 직접 new 키워드를 사용하여 생성
     Test test = new Test();
}

위 Test 객체를 개발자가 직접 new 키워드를 사용해 생성했다.

하지만 IOC 컨테이너에게 생성 및 생명주기를 맡기게 된다면 아래의 코드처럼 변한다.

//Test 객체
@Bean
class Test{
    String name;

    public void setName(String name){
         this.name = name;
    }
    public String getName(){
         return name;
    }
}

//main
public static void main(String[] args){
    //필요없음
}

@Bean 어노테이션을 사용하여 컨테이너에게 미리 이건 너가 관리해야하는 객체라는걸 알려준다.

 

 

* 컨테이너

우리가 평소에 사용하는 단어처럼 무언가를 담을수 있는 엄청나게 큰 넓은 공간을 의미한다.

IT에서는 여러 기능을 담고 있는 논리적인 공간이라고 생각하면 된다.

 

 

 

DI(Dependency Injection, 의존성 주입)

 

//Test 객체
class Test{
    String name;
    Obo obo;
    public void setName(String name){
         this.name = name;
    }
    public String getName(){
         return name;
    }

    public void setObo(Obo obo){
         this.obo = obo;
    }
}

//Obo 객체
class Obo{
    String number;
    public void setNumber(String number){
         this.number= number;
    }
    public String getNumber(){
         return number;
    }
}

//main
public static void main(String[] args){
     //IOC 컨테이너에게 맡기지 않고 개발자가 직접 new 키워드를 사용하여 생성
     Test test = new Test();
     Obo other_obo = new Obo();

     test.setObo(other_obo);
}

위 코드를 보면  Test 객체 안에 Obo 객체가 들어가 있다.

여기서 Test 객체는 Obo 객체에게 "의존성을 가진다

그리고 test.setObo(other_obo) 를 통해 test의 Obo 객체에 other_obo 객체를 집어 넣는건

"의존성 주입"이라고 한다.

 

위와 같은 의존성 주입을 @Autowired 어노테이션을 사용하여 Spring에서 알아서 해준다.

 

예)

//Test 객체
@Bean
class Test{
    String name;
    // 빈으로 등록되어 있는 Obo 객체를 컨테이너에서 찾아 자동으로 주입해준다.
    @Autowired
    Obo obo;    

    public void setName(String name){
         this.name = name;
    }
    public String getName(){
         return name;
    }

    public void setObo(Obo obo){
         this.obo = obo;
    }
}

//Obo 객체
@Bean
class Obo{
    String number;
    public void setNumber(String number){
         this.number= number;
    }
    public String getNumber(){
         return number;
    }
}

//main
public static void main(String[] args){
    //필요없음
}

 

@Autowired를 사용했으므로, @Bean을 사용해 컨테이너에 등록되어 있는 객체 Obo를 찾아서 알아서 주입해준다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.