티스토리 뷰

JAVA

Java Bean과 Spring Bean

집사킴 2022. 4. 16. 21:47
728x90

Java Bean이란

자바 빈이란, 3가지 규칙을 지키는 클래스이다

  1. 모든 필드는 private이며, getter/setter 메서드를 통해서만 접근이 가능하다
  2. argument가 없는 (no-argument) 생성자가 존재한다
  3. java.io.Serializable 인터페이스를 구현한다
import java.io.Serializable;

public class SomeBean implements Serializable {
    private String beanName;
    private int beanValue;

    public SomeBean() {
        // no-argument constructor
    }

    public String getBeanName() {
        return beanName;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    public int getBeanValue() {
        return beanValue;
    }

    public void setBeanValue(int beanValue) {
        this.beanValue = beanValue;
    }
}

출처: <https://imasoftwareengineer.tistory.com/101> [삐멜 소프트웨어 엔지니어]

무엇을 위한 규칙인가? (자바 빈의 목적)

여러가지 다른 오브젝트들을 하나의 오브젝트(Bean)에 담기 위함이다

JavaBean의 규칙을 소프트웨어 프로토콜이라고 생각하면 쉽다

왜 priavte 필드와 getter/setter만으로 이루어져있는가?

캡슐화(encapsulation)하기 위해서이다.

💡 private 필드, getter, setter만으로 이루어지는 스탠다드는 자바빈만의 것은 아니다. 이런 스탠다드를 지키는 클래스를 POJO(Plain Old Java Object)라고 부른다

왜 No-Argument 생성자를 사용하는가?

예를 들어서, 어떤 다른 소프트웨어가 SomeBean을 프로그램 내에서 생성하고 싶다.

public classBeanCreator {

publicObject create()throwsClassNotFoundException, IllegalAccessException, InstantiationException {
        String classPath = "SomeBean";
        Class cls = Class.forName(classPath);
returncls.newInstance();
    }
}

이 때, 생성자에 Argument가 있다면 어떻게 되는가? 이 소프트웨어는 Argument가 몇개인지, 어떤 필드에 맵핑되는지 찾아야 한다. Argument가 없는 생성자를 반드시 만들면 위처럼 오브젝트를 런타임(Runtime)에 생성해 주는 프로그램은 오브젝트 생성 → getter/setter를 이용해 값 설정으로 단순하게 목적을 달성 할 수 있다.

출처: https://imasoftwareengineer.tistory.com/101 [삐멜 소프트웨어 엔지니어]

🤔 사실 이 부분은 이해가 잘 안된다

왜 java.io.Serializable 인터페이스를 구현하는가?

자바 빈의 목적 : 여러가지 오브젝트들을 하나의 오브젝트에 담기 위함이다

이렇게 담은 후 보통 네트워크에 전송하거나 파일/데이터베이스에 저장한다

메모리에만 존재하는 오브젝트를 네트워크 전송이나 파일로 저장하려면 data stream(byte[] 등) 으로 오브젝트를 변환시켜줘야 한다.

이 변환 작업을 Serialization이라고 부른다

Spring Bean

  • 스프링 IoC 컨테이너의 ApplicationContext가 관리하는 자바 객체
  • 일반 Java 객체와의 차이점은 없음. 그냥 스프링에서 관리되어 Spring Bean이라고 불림
  • 컨테이너에 담겨있으며 필요할 때 컨테이너에서 가져와서 사용
  • @Bean을 사용하거나 xml 설정을 통해 일반 객체를 Bean으로 등록
  • Bean으로 등록된 객체는 쉽게 주입하여 사용 가능

스프링이 관리하는 객체란

  • 스프링에 의해 생성되고, 라이프 사이클을 수행하고, 의존 주입이 일어나는 객체

→ 즉, 개발자가 관리하지 않고 스프링에게 제어권을 넘긴 객체

Spring Bean Scope

  • singleton(기본값)
    • 애플리케이션에서 Bean 등록 시 singleton scope로 등록
    • 스프링 IoC 컨테이너 당 한 개의 인스턴스만 생성
    • 컨테이가 Bean을 가져다 주입할 때 항상 같은 객체 사용
    • 메모리나 성능 최적화에 유리
  • prototype
    • 컨테이너에서 Bean을 가져다 쓸 때 항상 다른 인스턴스 사용 (getBean 시 생성)
    • 모든 요청에 새로운 객체 생성
    • gc에 의해 Bean 제거
  • request
    • Bean 등록 시 하나의 HTTP Request 생명주기 안에 단 하나의 Bean만 존재
    • 각각의 HTTP 요청은 고유 Bean 객체 보유
    • Spring MVC Web Application에서 사용
  • session
    • 하나의 HTTP Session 생명주게 안에 단 하나의 Bean만 존재
    • Spring MVC Web Application에서 사용
  • global session
    • 하나의 global HTTP Session 생명주게 안에 단 하나의 Bean만 존재
    • Spring MVC Web Application에서 사용
  • application
    • ServletContext 생명주기 안에 한 개의 Bean 지정
    • Spring MVC Web Application에서 사용
스프링은 기본적으로 모든 bean을 singleton으로 생성하여 관리한다. 구체적으로는 애플리케이션 구동 시 JVM 안에서 스프링이 bean마다 하나의 객체를 생성하는 것을 의미한다. 그래서 우리는 스프링을 통해서 bean을 제공받으면 언제나 주입받은 bean은 동일한 객체라는 가정하에서 개발을 한다. request, session, global session의 Scope는 일반 Spring 어플리케이션이 아닌, Spring MVC Web Application에서만 사용된다.

출처 : https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

 

Spring Bean 생명주기

  • 객체 생성 → 의존 설정 → 초기화 → 사용 → 소멸
  • 스프링 컨테이너에 의해 생명주기 관리
  • 스프링 컨테이너 초기화 시 빈 객체 생성, 의존 객체 주입 및 초기화
  • 스프링 컨테이너 종료 시 빈 객체 소멸

참고자료

https://imasoftwareengineer.tistory.com/101

https://jjingho.tistory.com/10

https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

https://github.com/WeareSoft/tech-interview/blob/master/contents/spring.md

728x90
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함