IT 관련,,/중요문자 적어두기

[웹/JSP]jsp mvc1게시판 singleton에 대해서 알아봅시다~!!

IT깡패's 2020. 8. 31. 16:47
728x90
반응형
SMALL

jsp에서 model1이나 model2 게시판(대략 model1)을 만들때, dao쪽에서 db연결을 할 때,

좀 더 편하고 간단하게 사용할 수 있는 패턴이 있는데요~!!

그것은 바로 싱글톤(singleton)이라고 합니다~!!!ㅎㅎㅎ

 

싱글톤 패턴(Singleton Pattern)

싱글톤 패턴


애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다. (자바에선 생성자를 private로 선언해서 생성 불가하게 하고 getInstance()로 받아쓰기도 함)

=> 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.

(인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라, 동일(기존) 인스턴스를 사용하게함)

 

싱글톤 패턴을 쓰는 이유


고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음

또한 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.

DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용.

(쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그 기록 객체등)

안드로이드 앱 같은 경우 각 액티비티나 클래스별로 주요 클래스들을 일일이 전달하기가 번거롭기 때문에 싱글톤 클래스를 만들어 어디서나 접근하도록 설계하는 것이 편하기 때문...

+ 인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용.

+ 두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아지는 장점!

 

 

싱글톤 패턴의 문제점


싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남)

따라서 수정이 어려워지고 테스트하기 어려워진다.

또한 멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개가 생성된다든지 하는 경우가 발생할 수 있음

개발을 할때 항상 들어온 goto는 쓰면 안돼! 전역 객체는 안 좋은거야! 라는 말 처럼 꼭 필요한 경우아니면 지양해야함!! // 적절히 잘 쓰면 아주 좋음, (그게 어렵지)~~!!! ( ..)(.. )~!!

아무튼 이런 특징을 가지고 있는 singleton패턴의 소스를 파악해보는 시간을 가져보겠습니다!!

 

- personDao.java

public class PersonDao {
	
	private static PersonDao per;
	
	public static PersonDao getInstance() {
		if(per == null) {
			per = new PersonDao();
		}
		return per;
	}
	private PersonDao() {
		System.out.println("객체생성");
		
	}
	
	

}

 

자 이게 mvc패턴에서 사용하는 dao의 singleton패턴이죠잉~ㅎㅎㅎ

그리고 이것을 받을줄 main쪽 코드도 적어보겠습니다~!!

 

- personMain.java

public class PersonMain {

	public static void main(String[] args) {
		//PersonDao p1 = new PersonDao();
		//PersonDao p2 = new PersonDao();
		
		PersonDao p1 = PersonDao.getInstance();
		PersonDao p2 = PersonDao.getInstance();
		
		System.out.println("p1:"+p1);
		System.out.println("p2:"+p2);

	}

}

 

기본적으로 getInstance()라는 써있는 객체를 받는다는 소리죠잉~~

dao에서 db를 불어올때는 메서드 사이에 getInstance()를 꼭 거쳐야한다는 얘기죠~~

만약에~~ 

   String driver ="오라클drive명";
	String url = "오라클url명";
	String user = "오라클user명";
	String password = "오라클password명";
	
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	
	private static BoardDao dao = null;
	public static BoardDao getInstance() {
		if(dao == null) {
			dao = new BoardDao();
		}
		return dao;
	}
	private BoardDao() {
		try {
			Class.forName(driver);
			System.out.println("BoardDao !!");
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} 
	}//BoardDao
	
	public void getConnection() {
		try {
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}//getConnection
	

 

보통 게시판이나 장바구니를 만들때 dao에서 이렇게 싱글톤 객체를 사용하는데요~!!

getInstance()를 거친것을 볼 수 있죠잉~!!

그리고 select, insert, update, delete등을 하게해주는 메소드 사이에는 항상 getConnection()를 사용해야

db연동이 완성이 됩니다~!!ㅎㅎ

네 여기까지 싱글톤을 사용하는 방법에 대해서 알아보았습니다~!!!

 

- 참고링크


싱글톤 패턴(singleton pattern) - https://jeong-pro.tistory.com/86

728x90
반응형
LIST