Spring 프레임워크

지환·2023년 9월 5일

Spring

목록 보기
1/7
post-thumbnail

Spring 프레임워크

  • 등장한 이유
  • Bean 의미
  • Bean은 관리된다.

Spring FW 등장한 이유

  • EJB(Enterprise JavaBeans) : EJB는 애플리케이션 작성을 쉽게 해준다.

  • EJB는 선언적 프로그래밍 모델이고, 트랜잭션, 보안, 분산 컴퓨팅을 쉽게 할 수 있다 라는 배경이다.

  • EJB를 구동시킬 수 있는 Web Application Server가 등장

  • EJB의 불편함을 통해 대표적으로 2가지의 Open Source가 등장한다

    • 로드 존슨의 J2EE Design and Development의 예제 코드들이 지금의 Spring 기본 코드가 됨.
      - EJB 컨테이너의 대체

    • 개빈 킹의 하이버네이트 ORM(Object Relation Mapping) 프레임워크의 등장

      • EJB 엔티티 빈 기술을 대체하고, JPA(Java Persistence API)의 새로운 표준 정의

      • JPA는 표준 인터페이스, 하이버네이트는 JPA의 구현체


Bean이란?

Java에서는 인스턴스 생성을 프로그래머가 직접 인스턴스를 생성한다.

Book book = new Book();

Bean은 컨테이너가 관리하는 객체를 말한다.

컨테이너란 Bean의 생명주기(객체의 생명주기)를 관리한다.

  • 객체를 싱글턴으로 만들것인지, 프로토타입으로 만들것인지 check
  • 관점지향 컨테이너
    1. 빈을 생성 관리한다.
    2. 관점지향(AOP, aspect-oriented programming)

book.java

public class Book { -- Book 클래스
    private String title; -- title field
    private int price; -- price field
-- 생성자--
    public Book(String title, int price) {
        this.title = title;
        this.price = price;
    }

    public String getTitle() {
        return title;
    }

    public int getPrice() {
        return price;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

Book 클래스의 인스턴스 생성

Book book1 = new Book("즐거운 자바", 20000);
  1. new Book("즐거운자바", 20000);
    • 생성자가 호출되면 Heap 메모리에 인스턴스가 생성된다. [객체]
  2. book1은 1)에서 생성한 인스턴스를 참조한다.
    • book1은 참조변수다. Book를 가르킨다.
    • 이건 Bean이 아니다.[프로그래머가 직접 만들기 때문이다]

Bean 만들 때 규칙

  • 기본 생성자가 있어야 한다.
package Exam;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class ApplicationContext {
    //1. 싱글턴 패턴 적용 - 자기 자신을 참조하는 static한 필드를 선언한다. 바로 초기화
    //3, 1에서 만든 인스턴스를 반환하는  statioc한 메소드를 만든다.
    //4. Spring은 엄청나게 좋은 ApplicationContext를 만든다. [예시]
    public static ApplicationContext getInstance()
    {
        return instance;
    }
    private static ApplicationContext instance = new ApplicationContext();
    // 2. 싱글턴 패턴 적용 - 생성자를 private로 바꾼다.
    Properties props;
    Map objectMap;
    private ApplicationContext() {
        Properties props = new Properties();
        objectMap = new HashMap<String, Object>();
        try {
            props.load(new FileInputStream("src/main/resources/Beans.properties"));
        }catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    public Object getBean(String id) throws ClassNotFoundException {
        Object o1 = objectMap.get(id);
        if(o1 == null)
        {
            String className = props.getProperty(id);
            Class clazz = Class.forName(className);
           // Object o = clazz.newInstance();
          //  objectMap.put(id,o);
         //   o1 = objectMap.get(id);
        }
        // class name에 해당하는 문자열을 가지고 인스턴스를 생성할 수 있다.
        // class.forName(className)은 CLASSPATH부터 ClassName에
        // 해당되는 클래스를 찾은 후 그 클래스의 정보를 반환한다.

      //  System.out.println(clazz.getMethod());
     //   Method[] methods = clazz.getMethods();
      //  for(Method m : methods)
       // {
        //    System.out.println(m.getName());
        //}
       // Object o = clazz.newInstance(); // 기본 생성자가 있어야한다.
        //return o;

        return o1;
    }
}

  • 컨테이너 역할을 수행한다.
  • Spring이 제공하는 컨테이너는 이것보다 복잡한 일을 한다.

Spring의 등장

2002년 로드 존슨이 EJB의 문제점을 지적하면서 고품질의 확장 가능한 애플리케이션을 개발할 수 있음을 보여주고, 30,000 라인 이상의 기반 기술 예제 코드를 선보이면서 시작되었다.

30,000라인의 예제 코드에는 현재 스프링의 핵심 개념과 기반 코드인 BeanFactory, ApplicationContext, POJO, IoC(제어의 역전) , DI(의존성 주입)등 이 포함되었다.

로드 존슨의 책 출간 직후 유겐 휠러(Juergen Hoeller)와 Yann Caroff(얀 카로프)가 오픈소스 프로젝트를 제안하고 이후 지금까지도 스프링의 핵심 코드는 유겐 휠러가 개발하고 있다.

2003년 스프링 프레임워크 1.0의 출시, 2014년 스프링 부트 1.0 출시, 2020년 현재 스프링 프레임워크 5.2.x, 스프링 부트 2.3.x

Spring이란?

[Spring의 생태계]

스프링 프레임워크, 스프링 부트와 함께 스프링 데이터, 스프링 세션, 스프링 시큐리티, 스프링 RestDocs, 스프링 배치, 스프링 클라우드 등과 함께 사용된다.

[Spring Framework와 Spring Boot]

스프링 프레임워크의 핵심 개념은 DI 컨테이너, AOP등 이며, 스프링 MVC와 같은 웹기술을 제공하고 JDBC, ORM 프레임워크의 지원, Mybatis와 같은 XML기반 데이터 접근 기술을 지원한다. 또한, 스프링 기반 테스트를 지원한다.

스프링 프레임워크의 장기간에 걸친 환경설정과 어려움을 해결하기 위해 스프링 부트가 등장했다.

스프링 부트의 장점

  1. Tomcat같은 웹 서버를 내장함으로써 스프링 프레임워크와 달리 웹 서버를 설치하지 않아도 됨

  2. 단독으로 실행하도록 스프링 애플리케이션을 쉽게 생성해줌

  3. 간단한 빌드 구성을 위한 starter 종속성 제공

    • Starter가 프로젝트를 구성하는 필요한 라이브러리를 자동으로 구성함으로써 편의성을 증대시킴
  4. 스프링과 써드 파티 라이브러리의 자동 구성

    • 스프링 프레임워크의 버전을 확인하고 해당 버전과 호환성이 좋은 외부 라이브러리를 자동으로 구성하므로 개발자가 다양한 라이브러리의 버전을 확인할 필요성을 없앰

[Spring의 핵심 개념]

스프링의 핵심 개념은 무엇일까? 웹 애플리케이션을 만들고 DB 접근을 편리하게 해주는 기술? 아니다. 차례 대로 파악해보자.

스프링은 Java 언어 기반의 프레임 워크이다. 그렇다면 Java의 가장 큰 특징은?

Java는 객체 지향 언어이다. 그렇다면 스프링 프레임워크는 객체 지향 언어의 강력한 특징을 살려내 줄 수 있는 프레임워크이다. 이는 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크라는 것이다.

Spring Framework -> Java 언어 -> 객체 지향 언어
Spring Framework는 객체 지향 애플리케이션 개발 프레임워크


출처 | https://www.youtube.com/watch?v=ShR5CmEUyRY&list=PLHpaQi-LiUCxVX_GuPu42vdAbcBz8Bvdc&index=2

Inflearn 김영한 님의 스프링 핵심 원리 - 기본편 : https://www.inflearn.com/course/스프링-핵심-원리-기본편/dashboard
위키피디아 EJB : https://ko.wikipedia.org/wiki/엔터프라이즈_자바빈즈
https://velog.io/@zayson/Spring-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8-1-Spring%EC%9D%98-%EB%93%B1%EC%9E%A5%EB%B0%B0%EA%B2%BD%EA%B3%BC-Spring%EC%9D%B4%EB%9E%80

위키피디아 POJO : https://ko.wikipedia.org/wiki/Plain_Old_Java_Object

profile
아는만큼보인다.

0개의 댓글