자바 Bean 이란?

정주영·2024년 12월 13일

자바_스프링

목록 보기
1/2

Bean을 통한 객체 생성 방식

해당 예시는 Bean 의 동작 방식을 설명하기 위해 든 예시이며, 실제 스프링의 Bean이 동작 하는 방식은 훨씬 정교하고 잘 구성 되어 있습니다.

Resouce/Beans.properties

book1=exam.Book

Book 클래스

public class Book { // 
    private String title; // title 인스턴스 field(속성)
    private int price; // price 인스턴스 field(속성)
   
    // 기본 생성자
    public Book() {
    }
    
    // Book 생성자
    public Book(String title, int price) {
        this.title = title;
        this.price = price;
    }
    
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    public int getPrice() {
        return price;
    }
    
    public void setPrice(int price) {
        this.price = price;
    }
}

ApplicationContext

public class ApplicationContext {

    Properties props;
    public  ApplicationContext() {
    	props = new Properties();
        try {
        	props.load(new FileInputStream("src/main/resources/Beans.properties'));
     } catch (IOException e) {
		e.printStackTrace():
}
        
    public Object getBean(String id) throws Exception { 
          String className = props.getProperty(id);
          // Class.forName(className) -> ClassPath에 해당하는 클래스를 찾은 후
          Class clazz = Class.forName(className);
            
          // ClassLoader를 이용한 인스턴스 생성. 기본생성자가 있어야 한다.
          Object o = clazz.newInstance(); // clazz 정보를 이용해 인스턴스를 생성한다
          return o;
    }
}

ApplicationContextMain

package exam;

public class ApplicationContextMain {
    public static void main(String[] args) throws Exception {
        ApplicationContext context = new ApplicationContext();
        Book book1 = (Book)context.getBean("book1")
        book1.setPrice(5000);
        book1.setTitle("즐거운 자바");
        
        Sytem.out.println(book1.getPrice()); // 5000
        Sytem.out.println(book1.getTitle()); // 즐거운 자바
    }
}

위 과정을 통헤 만들어 주는 것이 일반적입니다. 그러나 객체를 무작위로 생성해 낸다면 어플리케이션에 부하를 주게 되어 서버가 멈출 수도 있습니다. 그러한 경우를 방지해 싱글턴 패턴을 적용한 코드를 보도록 하겠습니다.

싱글턴 패턴을 적용한 객체 생성 방식

Resouce/Beans.properties

book1=exam.Book

Book 클래스

public class Book { // 
    private String title; // title 인스턴스 field(속성)
    private int price; // price 인스턴스 field(속성)
    
    // 기본 생성자
    public Book() {
        
    }
    
    // Book 생성자
    public Book(String title, int price) {
        this.title = title;
        this.price = price;
    }
    
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    public int getPrice() {
        return price;
    }
    
    public void setPrice(int price) {
        this.price = price;
    }
}

ApplicationContext

public class ApplicationContext {

    private Properties props;
    private Map objectMap;
    
    
    // 1. 클래스 객체를 저장하는 static 필드 선언, 바로 초기화
    private static ApplicationContext instance = new ApplicationContext();
    
    // 3. 인스턴스를 반환하는 static 메서드, getInstance()
    public static ApplicationContext getInstance() {
        return instance;
    }
    
    // 2. 생성자를 private으로 선언한다.
    private ApplicationContext() {
        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 Exception {
        Object o1 = objectMap.get(id);
        if (o1 == null) {
            String className = props.getProperty(id);
            // Class.forName(className) -> ClassPath에 해당하는 클래스를 찾은 후
            Class clazz = Class.forName(className);
            
            // ClassLoader를 이용한 인스턴스 생성. 기본생성자가 있어야 한다.
            Object o = clazz.newInstance(); // clazz 정보를 이용해 인스턴스를 생성한다.
            objectMap.put(id, o);
            o1 = objectMap.get(id);
        }
        return o1;
    }
}

ApplicationContextMain

package exam;

public class ApplicationContextMain {
    public static void main(String[] args) throws Exception {
        ApplicationContext context = ApplicationContext.getInstance();
        
        Book book = (Book) context.getBean("book1"); // id에 해당하는 인스턴스를 달라.
        book.setPrice(5000);
        book.setTitle("자바 프로그래밍");
        
        System.out.println(book.getPrice());
        System.out.println(book.getTitle());
        
        System.out.println("-----------------");
        Book book2 = (Book) context.getBean("book1");
        System.out.println(book2.getTitle());
        
        if (book == book2) {
            System.out.println("같은 인스턴스"); // 같은 인스턴스
        } else {
            System.out.println("다른 인스턴스");
        }
    }
}
profile
효율적인 시스템 설계를 고민하며, 확장성과 안정성을 갖춘 백엔드 개발자가 되길 희망합니다.

0개의 댓글