[JAVA] Object Pooling
Development/Java

[JAVA] Object Pooling

반응형

오브젝트 풀링(apache commons pool 이용) 하는 방법.


오브젝트 풀링에 대한건.. 간단하게 설명하면


많은 수의 오브젝트가 생성되는것을 방지하고자, Pool에 오브젝트들을 담아두고 사용 및 반납을 하는 방식이다.


도서관에 책을 대여하고, 반납하면서 특정 개수의 책만 사용하는 것을 생각하면 된다.


만약, 그런 시스템이 없다면 필요 할때마다 도서관에서는 책을 새로 신청해야 할 것이다.


용도 및 장점 : 잦은 오브젝트 할당으로 인한 over-head 감소




1. pom.xml에 apache commons pool 라이브러리를 maven import

<!-- https://mvnrepository.com/artifact/commons-pool/commons-pool -->
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>



2. 풀링해볼 객체의 구현체인 Person 클래스를 만듬.


package gompang.domain;

/**
 * Created by stacks5978 on 2017-05-19.
 */
public class Person {

    private long id;
    private String name;
    private static int count;

    public Person() {
        this.count++;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public int getCount(){
        return count;
    }
}



3. 해당 객체를 풀링할 팩토리를 만듬.



package gompang.service;

import gompang.domain.Person;
import org.apache.commons.pool.BasePoolableObjectFactory;
import org.springframework.stereotype.Component;

/**
 * Created by stacks5978 on 2017-05-19.
 * Person 객체를 Pooling하는 Pool
 */
@Component
public class PersonPool extends BasePoolableObjectFactory{

    @Override
    public Object makeObject() throws Exception {
        return new Person();
    }
}


4. 객체를 풀링해보면서 테스트 진행


import gompang.domain.Person;
import gompang.service.PersonPool;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

/**
 * Created by stacks5978 on 2017-05-19.
 */

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class PoolTest {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Before
    public void setUp() throws Exception {

    }

    @After
    public void tearDown() throws Exception {

    }

    @Test
    public void test() throws Exception {

        GenericObjectPool genericObjectPool = new GenericObjectPool(new PersonPool());

        for (int i = 0; i < 1000; i++) {
            Person person = (Person) genericObjectPool.borrowObject();
            logger.info("{} {}", person, person.getCount());
            genericObjectPool.returnObject(person);
        }

        logger.info("Tested");
    }
}



실제 객체를 logger로 출력해보면 같은 객체의 id값(주소)와, static으로 선언된 count수가 같음을 알 수 있다.


주의 : borrowObject 후 반드시 returnObject() 호출 필요(풀링을 위한 절차임. 책 대여<->반납 과 동일 맥락)



반응형