본문 바로가기

KOSA FullStack 교육/java

KOSA fullStack 교육(싱글톤)

서비스 클래스와 싱클톤 

 

다음과 같이 Client(프론트)에서 값을 입력하고 함수를 호출하면,

Server에 있는 메서드를 실행하게 된다.

이때, Service 객체는 단 하나만 생성되어 공유되는데,

이러한 구조를 구현할 때 사용하는 대표적인 디자인 패턴이 바로 **싱글톤(Singleton)**이다.

즉, 싱글톤은 클라이언트가 어떤 요청을 하든 단 하나의 인스턴스만 가지기 때문에, 항상 같은 객체를 통해 기능을 처리하게 된다. 

 

싱글톤을 왜 쓰는가?

  • 동일한 기능이나 데이터가 여러 곳에서 동일하게 유지되어야 할 때 
  • 불필요한 객체 생성을 방지(메모리 절약)
  • 상태의 일관성 유지

 

싱글톤을 반영한 서비스 코드는 다음과 같다. private static 으로 서비스 객체를 생성하는 것이 중요하다. 

import com.edu.vo.Engineer;
import com.edu.vo.SalesMan;

public class HRService {
	
	Engineer[] engineers = null;
	int eidx = 0;
	SalesMan[] salesMans = null;
	int sidx = 0;
	private static HRService service= new HRService(10);
	
	private HRService(int size) {
		//최대 사이즈를 받아서 그 사이즈로 배열 생성
		engineers = new Engineer[size];
		salesMans = new SalesMan[size];
	}
	
	public static HRService getInstance() {
		return service;
	}
	
	public void addEmployee(Engineer engineer) {
		//engineer를 배열에 추가하고 인덱스를 하나증가
		if(eidx == engineers.length) {
			System.out.println("더이상 엔지니어 등록을 할 수 없습니다");
		}else {
			engineers[eidx++] = engineer;
			System.out.println(engineer.getName()+"님이 등록 되셨습니다");
			//앞으로 - 명의 자리가 남았습니다
		}
	}
	public void addEmployee(SalesMan salesMan) {
		if(sidx == salesMans.length) {
			System.out.println("더이상 엔지니어 등록을 할 수 없습니다");
		}else {
			salesMans[sidx++] = salesMan;
			System.out.println(salesMan.getName()+"님이 등록 되셨습니다");
			//앞으로 - 명의 자리가 남았습니다
		}
	}
	
	public void updateEmployee(Engineer engineer) {
		//empno로 수정할 애를 찾아서 mainSkill수정 
		for(Engineer e: engineers) {
			if(e == null) continue;
			if(e.getEmpno() == engineer.getEmpno())
				e.changeMainSkill(engineer.getMainSkill());
		}

	}
	public void updateEmployee(SalesMan salesMan) {
		//empno로 수정할 애를 찾아서 mainSkill수정 
		for(SalesMan s: salesMans) {
			if(s == null )continue;
			if(s.getEmpno() == salesMan.getEmpno())
				s.changeBonus(salesMan.getBonus());
		}

	}
	
	public Engineer getEngineer(int empno) {
		for(Engineer engineer: engineers) {
			if(engineer.getEmpno() == empno)
				return engineer;
		}
		return null;
	}
	
	public SalesMan getSalesMan(int empno) {
		for(SalesMan salesMan: salesMans) {
			if(salesMan.getEmpno() == empno)
				return salesMan;
		}
		return null;
	}
	
	public Engineer[] getAllEngineers() {
		return engineers;
	}
	
	public SalesMan[] getAllSalesMans() {
		return salesMans;
	}
	
    //Engineer만 구현했다.
	public void deleteEmploy(int empno) {
		int find = -1;
		for(int i=0; i<eidx; i++) {
			if(engineers[i].getEmpno() == empno)
				find = i;
		}
		if(find == -1)
			return ;
		for(int j=find; j<eidx; j++) {
			engineers[j] = engineers[j+1];
		}
		eidx--;
	}
}

 

위의 코드를 보면 CRUD가 구현되어있는 것을 볼 수 있다. 

 

기본 기능 5가지

1. 생성(Create)

2. 수정 (Update)

3. 삭제 (Delete) 

4. 한 명 읽기 (Read)

5. 모두 읽기 (Read)

 

1,2,3은 DB에서 조작(manipulate)하는 작업이고 4,5는 불러오기만 하는 것이 차이다.