반응형
오브젝트 풀링(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() 호출 필요(풀링을 위한 절차임. 책 대여<->반납 과 동일 맥락)
반응형
'Development > Java' 카테고리의 다른 글
[Spring] @Valid Collection Validation 관련 (3) | 2017.06.22 |
---|---|
[Framework] Light4J(light-java) (0) | 2017.05.28 |
[Spring] Springboot JUnit 테스트 시 설정 (0) | 2017.05.19 |
[logger] Logback xml 설정 및 디펜던시 설정 (0) | 2017.05.19 |
[DB] DBCP 구현 - DB Connection Pooling (0) | 2017.05.16 |