728x90
반응형

문자열을 처리하기 위한 String , StringBufferStringBuilder세가지 클래스 중에서, 가장 메모리를 많이

차지하고 응답시간에 많은 영향을 주는 것은  String 클래스 이다. 만약 사용중인 WAS나 시스템이 JDK5.0 이상을 사용한다면,

컴파일러에서 자동으로 StringBuilder로 변환하여 준다. 하지만 반복 루프를 사용해서 문자열을 더할 때에는 객체를 
계속 추가한다는 사실에는 변함이 없다. 그러므로 String 클래스를 쓰는 대신, 스레드와 관련이 있으면

StringBuffer를, 스레드 안전 여부와 상관이 없으면 StringBuilder를 사용하는 것을 권장한다.

 






728x90
반응형
728x90
반응형

Spring 은 bean객체를 싱글턴으로 인스턴스화 시켰을경우 다중스레드에 대한 처리를 자동적으로 지원해준다. 

우리는 직접 구현한 싱글턴 객체에 대해 bean 에 설정하는방법에 대해서도 알아야한다 . 

 


test01.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<!-- 싱글턴패턴 클래스타입의 객체를 생성하는 방법 -->

<bean name="single" class="test.single.SingletonDao"

factory-method="getInstance" />

</beans>


SingletonDao.java

package test.single;

// 싱글톤패턴의 DAO

public class SingletonDao {

private static SingletonDao instance = new SingletonDao();

private SingletonDao(){}

public static SingletonDao getInstance() {

return instance;

}

public void insert( String data ) {

System.out.println(data+"를 추가 했습니다.");

}

public void delete( String data ) {

System.out.println(data+"를 삭제 했습니다.");

}

public void select( String data ) {

System.out.println(data+"를 조회 했습니다.");

}

public void update( String data ) {

System.out.println(data+"를 수정 했습니다.");

}

}



TestMain.java

package test.main;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.single.SingletonDao;

public class TestMain {

public static void main(String[] args) {

String res = "test/main/test01.xml";

ApplicationContext context = 

new ClassPathXmlApplicationContext(res);

// 싱글톤 객체의 인스턴스 생성

SingletonDao dao = 

(SingletonDao)context.getBean("single");

dao.insert("이상훈");

}


}


출력결과

싱글턴 패턴 으로 구현된 클래스는 생성자를 가져올수 없다(private) 이기 떄문에 

그래서 인스턴스를 구현한 getter 메서드를 factory-method 라는 속성으로 getter 메소드를 가져올 수 있다.


728x90
반응형
728x90
반응형

Spring 은 경량 컨테이너 이다. 

컨테이너는 컴포넌트들의 라이프사이클을 관리하는 걸 말하는데 예를 들어 톰캣,스윙(JPanel) 등...

Spring도 마찬가지로 초기화작업이나 소멸시에 작동할 작업을 설정을 통해 미리 지정해주는것이 가능하다. 


LifeCycleBean.java

package test.life;

public class LifeCycleBean {

public void init() {

System.out.println("초기화 메소드 입니다.");

}

public void execute() {

System.out.println("요청 작업을 수행합니다.");

}

public void destroy() {

System.out.println("객체가 소멸될때 호출되는 메소드입니다.");

}

}


test01.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 

객체가 생성될떄 init 메소드가 호출되고 객체가 소멸될때 destroy 메소드가 호출된다. 

init-method : 객체 생성시 호출되는 메소드 지정 (초기화작업)

destroy-method : 객체소멸시 호출되는 메소드 (자원해제등의 작업)

-->

<bean name="life" class="test.life.LifeCycleBean"

init-method="init" destroy-method="destroy"

/>

</beans>



scope 속성을 이용하여 LifeCycle 을 관리할 수 있다. 

init-method : 객체 생성시 호출되는 메소드 지정 (초기화작업)

destroy-method : 객체소멸시 호출되는 메소드 (자원해제등의 작업)


728x90
반응형
728x90
반응형

Spring DI ( Dipendency Injection ) 을 이용하여 객체를 조립하는 방법에 대해 알아보자.

기본적으로 DI 를 이용한 bean 생성은 내부적으로 싱글톤 패턴을 이용해 객체를 인스턴스화 한다.

Spring DI 를 사용하지 않을시에 는 아무리 인터페이스의 다형성을 이용하여 유연한 코드를 작성하였다하여도

자식클래스의 인스턴스 를 변경하게 될수있는데 DI 패턴을 이용하면 그 문제를 해결할 수 있다, 


test01.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<!-- OracleDao 를 생성해라 -->

<bean name="daoOra" class="test.dao.OracleDao"/>

<bean name="daoMy" class="test.dao.MysqlDao"/>

<!-- MyController 를 생성하고 OracleDao 를 주입해라.  -->

<bean name="controller" class="test.controller.MyController">

<!--  위에서 생성한 daoOra 를 멤버변수 dao 에 주입해라. -->

<!-- value = 문자열 , ref = 객체 참조값 -->

<!-- <property name="dao" ref="daoOra"/> -->

<property name="dao" ref="daoMy"/>

</bean>

<!-- 

[[ scope 속성 ]]

- 스프링은 기본적으로 객체를 싱글톤객체로 생성한다.

- singleton : 객체를 하나만 생성(싱글톤 객체로 생성)

- prototype : 객체를 사용할때마다 생성

- request : 클라이언트가 요청할때마다 생성 ( WebApp 에서만 사용 )

- session : 세션에서만 가능 ( WebApp 에서만 사용 )

-->

<bean name="oracleDao" class="test.dao.OracleDao"

scope="prototype">

</bean>

</beans>


CommonDao.java

package test.dao;

// DAO가 가져야할 기능들의 목록을 정의

public interface CommonDao {

// interface 에서의 메서드는 기본적으로 public 임.. 

void insert( String data );

void update( String data );

void delete( String data );

void select( String data );

}


MysqlDao.java

package test.dao;

public class MysqlDao implements CommonDao {

@Override

public void insert(String data) {

// TODO Auto-generated method stub

System.out.println("mysql을 이용하여 "+data+" 를 추가");

}

@Override

public void update(String data) {

// TODO Auto-generated method stub

System.out.println("mysql을 이용하여 "+data+" 를 수정");

}


@Override

public void delete(String data) {

// TODO Auto-generated method stub

System.out.println("mysql을 이용하여 "+data+" 를 삭제");

}

@Override

public void select(String data) {

// TODO Auto-generated method stub

System.out.println("mysql을 이용하여 "+data+" 를 조회");

}

}


OracleDao.java

package test.dao;

public class OracleDao implements CommonDao {

public void insert( String data ) {

System.out.println(data+"를 추가 했습니다.");

}

public void delete( String data ) {

System.out.println(data+"를 삭제 했습니다.");

}

public void select( String data ) {

System.out.println(data+"를 조회 했습니다.");

}

public void update( String data ) {

System.out.println(data+"를 수정 했습니다.");

}

}


MyController.java

package test.controller;

import test.dao.CommonDao;

public class MyController {

// 다형성을 이용

private CommonDao dao;// = new OracleDao();

// 스프링이 생성한 객체를 주입받아야 하므로 setter 메소드가 필요하다.

public void setDao( CommonDao dao ) {

this.dao = dao;

}

public void insert( String data ) {

dao.insert(data);

}

public void delete( String data ) {

dao.delete(data);

}

public void update( String data ) {

dao.update(data);

}

public void select( String data ) {

dao.select(data);

}

}



TestMain.java

package test.main;


import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;


import test.controller.MyController;

import test.dao.OracleDao;


public class TestMain {


public static void main(String[] args) {

String res = "test/main/test01.xml";

ApplicationContext context = 

new ClassPathXmlApplicationContext(res);

// spring 은 기본적으로 싱글턴으로 객체를 생성

MyController controller = 

(MyController)context.getBean("controller");

controller.select("이상훈");

controller.delete("이상훈");

controller.update("이상훈");

controller.insert("이상훈");

MyController controller1 = 

(MyController)context.getBean("controller");

// 아래 두객체는 같은 객체 임 기본 싱글턴 이기때문..

System.out.println("controller : "+controller);

System.out.println("controller1 : "+controller1);

// Bean 설정파일에서 scope="prototype" 옵션을 주었으므로 객체를 

// 사용할떄마다 객체를 계속 생성한다. 아래 두객체는 다른 객체

OracleDao oracle = (OracleDao)context.getBean("oracleDao");

System.out.println("oracle : "+oracle);

OracleDao oracle1 = (OracleDao)context.getBean("oracleDao");

System.out.println("oracle : "+oracle1);

}

}


[출력결과]

간단하게 생성을 해보았는데 TestMain.java 의 context.getBean(); 인스턴스를 가져오고 반환형이 Object 이기 때문에 모든 클래스타입으로의 형변환이 가능하다.


728x90
반응형

+ Recent posts