Spring & Springboot/올인원 스프링 프레임워크

학사 관리 시스템 -1

YJ_ma 2023. 9. 13. 21:38

학사 관리 시스템의 개요

학사 관리 시스템에서 학생 관리(학생 등록, 조회, 수정, 삭제 등) 부분을 구현한 프로그램이다.

▶ 프로젝트 시나리오

· 학생 5명의 샘플 데이터를 데이터베이스에 등록한다.

· 전체 학생 정보를 출력한다.

· 새로운 학생 정보를 등록한다.

· 학생 정보를 수정한다.

· 학생 정보를 삭제한다.

· 시스템 정보를 출력한다.

 

▶ 프로젝트 구조

프로그램에서 사용하는 클래스와 IoC 컨테이너 제작에 필요한 applicationContent.xml의 내용은 다음과 같다.

학생 정보를 등록, 조회, 수정, 삭제하는 서비스 클래스들은 DAO(StudentdDao)을 이용해서 학생 정보를 관리한다.

IoC 컨테이너 : 서비스 객체를 생성하고, 필요한 DAO 객체를 생성해서 서비스에 주입하는 역할

MainClass 클래스
MainClass main() 메서드가 명시되어 있는 클래스
DB 관련 클래스
DBConnectionInfo 데이터베이스 정보
Student 학생 정보
Service 클래스
EMSInformationService 시스템 정보
PrintStudentInformationService 학생 정보 출력
StudentAllSelectService 전체 학생 정보 조회
StudentDeleteService 학생 정보 삭제
StudentModifyService 학생 정보 수정
StudentRegisterService 학생 정보 등록
StudentSelectService 학생 정보 조회
DAO 클래스
StudentDao DAO
Util 클래스
InitSampleData 샘플 데이터 초기화
IoC 컨테이너
applicationContext.xml 객체 생성과 조립

 

학사 관리 시스템 만들기

자바 메이븐 프로젝트 ch04_pjt_01을 생성한다.

다음과 같이 패키지와 클래스를 생성한다.

각각의 클래스에 코드를 입력한다.

getter와 setter 단축키 : ctrl + shift + s / Source > Generate getters and setters

① Student 클래스

· 학생 정보를 담고 있다.

· sNum : 학생 구분하는 학번, 생성자에서 필드 초기화에 필요한 모든 값을 받음.

· 모든 필드에 대한 getter와 setter가 있다.

package ch04_pjt_01.ems.member;

public class Student {
	private String sNum;
	private String sId;
	private String sPw;
	private String sName;
	private int sAge;
	private char sGender;
	private String sMajor;

	public Student(String sNum, String sId, String sPw, String sName,
			int sAge, char sGender, String sMajor) {
		this.sName = sName;
		this.sId = sId;
		this.sPw = sPw;
		this.sAge = sAge;
		this.sGender = sGender;
		this.sMajor = sMajor;
	}

	public String getsNum() { 
		return sNum; 
	}

	public void setsNum(String sNum) { 
		this.sNum = sNum; 
	}

	public String getsId() {
		return sId;
	}

	public void setsId(String sId) {
		this.sId = sId;
	}

	public String getsPw() {
		return sPw;
	}

	public void setsPw(String sPw) {
		this.sPw = sPw;
	}

	public String getsName() {
		return sName;
	}

	public void setsName(String sName) {
		this.sName = sName;
	}

	public int getsAge() {
		return sAge;
	}

	public void setsAge(int sAge) {
		this.sAge = sAge;
	}

	public char getsGender() {
		return sGender;
	}

	public void setsGender(char sGender) {
		this.sGender = sGender;
	}

	public String getsMajor() {
		return sMajor;
	}

	public void setsMajor(String sMajor) {
		this.sMajor = sMajor;
	}

}

 

② DBConnectionInfo 클래스

· 데이터베이스 연결에 필요한 정보(url, userId, userPw)를 가지고 있다.

· 모든 필드에 대한 getter와 setter 메서드가 있다.

package ch04_pjt_01.ems.member;

public class DBConnectionInfo {
	private String url;
	private String userId;
	private String userPw;

	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserPw() {
		return userPw;
	}
	public void setUserPw(String userPw) {
		this.userPw = userPw;
	}


}

 

③ StudentDao 클래스

· 데이터베이스에 접속하고, Service에 의해서 호출되며 데이터의 insert, search, update, delete 등 기능을 수행

· HashMap : 학생 데이터 관리

· studentDB에서 key로 사용되는 값은 학생정보(Student 클래스)에서 고유 값으로 부여되는 sNum(학번)을 이용한다.

package ch04_pjt_01.ems.member.dao;

import java.util.HashMap;
import java.util.Map;

import ch04_pjt_01.ems.member.Student;

public class StudentDao {
	private Map<String, Student> studentDB = new HashMap<String, Student>();

	public void insert(Student student) {
		studentDB.put(student.getsNum(), student);
	}

	public Student select(String sNum) {
		return studentDB.get(sNum);
	}

	public void update(Student student) {
		studentDB.put(student.getsNum(), student);
	}

	public void delete(String sNum) {
		studentDB.remove(sNum);
	}

	public Map<String, Student> getStudentDB(){
		return studentDB;
	}
}

 

④ StudentRegisterService 클래스

· 학생 정보를 데이터베이스에 저장하는 기능 

· 생성자에서 DAO 객체(StudentDao)를 받아 studentDao 필드를 초기화하는 코드로, 추후 IoC 컨테이너에서 생성자에 StudentDao를 주입한다.

· verify() : 학생 정보 등록하기 전에 학번(sNum)을 이용하여 기존에 등록된 학생인지 판단한다.

package ch04_pjt_01.ems.member.service;

import ch04_pjt_01.ems.member.Student;
import ch04_pjt_01.ems.member.dao.StudentDao;

public class StudentRegisterService {
	private StudentDao studentDao;

	public StudentRegisterService(StudentDao studentDao) {
		this.studentDao = studentDao;
	}

	public void register(Student student) {
		if(verify(student.getsNum())) {
			studentDao.insert(student);
		} else {
			System.out.println("The student has already registered.");
		}
	}

	public boolean verify(String sNum) {
		Student student = studentDao.select(sNum);
		return student == null ? true : false;
	}
}

 

⑤ StudentSelectService 클래스

· 학생 한 명의 정보를 얻을 수 있다.

· 다른 Service와 마찬가지로 생성자에서 전달받은 DAO 객체를 studentDao 필드에 저장한다.

· select() : DAO을 이용하여 데이터베이스에서 학생 정보를 가져온다.  

package ch04_pjt_01.ems.member.service;

import ch04_pjt_01.ems.member.Student;
import ch04_pjt_01.ems.member.dao.StudentDao;

public class StudentSelectService {
	private StudentDao studentDao;

	public StudentSelectService(StudentDao studentDao) {
		this.studentDao = studentDao;
	}

	public Student select(String sNum) {
		if (verify(sNum)) {
			return studentDao.select(sNum);
		} else {
			System.out.println("Student information is avilable.");
		}

		return null;
	}

	public boolean verify(String sNum) {
		Student student = studentDao.select(sNum);
		return student != null ? true : false;
	}
}

 

⑥ StudentAllSelectService 클래스

· allSelect() : 전체 학생 정보를 반환한다.

· 다른 Service 클래스와 마찬가지로 생성자를 통해서 studentDao를 초기화한다.

package ch04_pjt_01.ems.member.service;

import java.util.Map;

import ch04_pjt_01.ems.member.Student;
import ch04_pjt_01.ems.member.dao.StudentDao;

public class StudentAllSelectService {
	private StudentDao studentDao;

	public StudentAllSelectService(StudentDao studentDao) {
		this.studentDao = studentDao;
	}

	public Map<String, Student> allSelect(){
		return studentDao.getStudentDB();
	}
}

 

⑦ StudentModifyService 클래스

· modify() : 학생 정보를 수정

· 다른 Service 클래스와 마찬가지로 생성자에서 studentDao를 초기화 

package ch04_pjt_01.ems.member.service;

import ch04_pjt_01.ems.member.Student;
import ch04_pjt_01.ems.member.dao.StudentDao;

public class StudentModifyService {
	private StudentDao studentDao;

	public StudentModifyService(StudentDao studentDao) {
		this.studentDao = studentDao;
	}

	public void modify(Student student) {
		if (verify(student.getsNum())) {
			studentDao.update(student);
		} else {
			System.out.println("Student information is avilable.");
		}
	}

	public boolean verify(String sNum) {
		Student student = studentDao.select(sNum);
		return student != null ? true : false;
	}
}

 

⑧ StudentDeleteService 클래스

· 생성자에서 studentDao를 초기화

· delete() : 학생 정보 삭제

package ch04_pjt_01.ems.member.service;

import ch04_pjt_01.ems.member.Student;
import ch04_pjt_01.ems.member.dao.StudentDao;

public class StudentDeleteService {
	private StudentDao studentDao;

	public StudentDeleteService(StudentDao studentDao) {
		this.studentDao = studentDao;
	}

	public void delete(String sNum) {
		if (verify(sNum)) {
			studentDao.delete(sNum);
		} else {
			System.out.println("Student information is avilable.");
		}
	}

	public boolean verify(String sNum) {
		Student student = studentDao.select(sNum);
		return student != null ? true : false;
	}
}

 

⑨ PrintStudentInformationService 클래스

· 생성자에서 allSelectService를 초기화

· printStudentsInfo() : 전체 학생 정보 출력

package ch04_pjt_01.ems.member.service;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import ch04_pjt_01.ems.member.Student;

public class PrintStudentInformationService {
	StudentAllSelectService allSelectService;

	public PrintStudentInformationService(StudentAllSelectService allSelectService) {
		this.allSelectService = allSelectService;
	}

	public void printStudentsInfo() {
		Map<String, Student> allStudent = allSelectService.allSelect();
		Set<String> keys = allStudent.keySet();
		Iterator<String> iterator = keys.iterator();
		System.out.println("STUDENT LIST START --------------");

		while(iterator.hasNext()) {
			String key = iterator.next();
			Student student = allStudent.get(key);
			System.out.print("sNum:" + student.getsNum() + "\t");
			System.out.print("|sId:" + student.getsId() + "\t");
			System.out.print("|sPw:" + student.getsPw() + "\t");
			System.out.print("|sName:" + student.getsName() + "\t");
			System.out.print("|sAge:" + student.getsAge() + "\t");
			System.out.print("|sGender:" + student.getsGender() + "\t");
			System.out.println("|sMajor:" + student.getsMajor() + "\t");
		}

		System.out.println("END -------------------------------");
	}
}

 

⑩ EMSInformationService 클래스

· EMS의 개발 연도, 개발자, 버전 등의 정보를 담고 있는 클래스

· 특별한 기능 없고, 각각의 정보에 해당하는필드와 getter와 setter메서드가 있다.

package ch04_pjt_01.ems.member.service;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import ch04_pjt_01.ems.member.DBConnectionInfo;

public class EMSInformationService {
	private String info;
	private String copyRight;
	private String ver;
	private int sYear;
	private int sMonth;
	private int sDay;
	private int eYear;
	private int eMonth;
	private int eDay;
	private List<String> developers;
	private Map<String, String> administrators;
	private Map<String, DBConnectionInfo> dbInfos;

	public void printEMSInformation() {
		System.out.println("EMS INFORMATION START ---------");
		String devPeriod = sYear + "/" + sMonth + "/" + sDay + "/" + " ~ "
				+ eYear + "/" + eMonth + "/" + eDay;
		System.out.println(info + "(" + devPeriod + ")");
		System.out.println(copyRight);
		System.out.println(ver);
		System.out.println("Developers: " + developers);
		System.out.println("Administrator: "+ administrators);
		printDBInfo();
		System.out.println("END ---------------------------");
	}

	private void printDBInfo() {
		Set<String> keys = dbInfos.keySet();
		Iterator<String> iterator = keys.iterator();

		while (iterator.hasNext()) {
			String key = iterator.next();
			DBConnectionInfo info = dbInfos.get(key);
			System.out.print("[" + key + " DB] ");
			System.out.print("url: " + info.getUrl() + "\t");
			System.out.print("userId: " + info.getUserId() + "\t");
			System.out.print("userPw: " + info.getUserPw() + "\n");
		}
	}

	public String getInfo() {
		return info;
	}

	public void setInfo(String info) {
		this.info = info;
	}

	public String getCopyRight() {
		return copyRight;
	}

	public void setCopyRight(String copyRight) {
		this.copyRight = copyRight;
	}

	public String getVer() {
		return ver;
	}

	public void setVer(String ver) {
		this.ver = ver;
	}

	public int getsYear() {
		return sYear;
	}

	public void setsYear(int sYear) {
		this.sYear = sYear;
	}

	public int getsMonth() {
		return sMonth;
	}

	public void setsMonth(int sMonth) {
		this.sMonth = sMonth;
	}

	public int getsDay() {
		return sDay;
	}

	public void setsDay(int sDay) {
		this.sDay = sDay;
	}

	public int geteYear() {
		return eYear;
	}

	public void seteYear(int eYear) {
		this.eYear = eYear;
	}

	public int geteMonth() {
		return eMonth;
	}

	public void seteMonth(int eMonth) {
		this.eMonth = eMonth;
	}

	public int geteDay() {
		return eDay;
	}

	public void seteDay(int eDay) {
		this.eDay = eDay;
	}

	public List<String> getDevelopers() {
		return developers;
	}

	public void setDevelopers(List<String> developers) {
		this.developers = developers;
	}

	public Map<String, String> getAdministrators() {
		return administrators;
	}

	public void setAdministrators(Map<String, String> administrators) {
		this.administrators = administrators;
	}

	public Map<String, DBConnectionInfo> getDbInfos() {
		return dbInfos;
	}

	public void setDbInfos(Map<String, DBConnectionInfo> dbInfos) {
		this.dbInfos = dbInfos;
	}

}

 

InitSampleData 클래스

· 프로그램 실행에 필요한 샘플 데이터로 5명의 학생 정보를 각각의 필드에 가지고 있다.

· getter와 setter 메서드를 가진다.

package ch04_pjt_01.ems.utils;

public class InitSampleData {
	private String[] sNums = {"hbs001", "hbs002", "hbs003", "hbs004", "hbs005"};
	private String[] sIds = {"rabbit", "hippo", "raccoon", "elehant", "lion"};
	private String[] sPws = {"96539", "64875", "15284", "48765", "28661"};
	private String[] sNames = {"agatha", "barbara", "chris", "doris", "elva"};
	private int[] sAges = {19, 22, 20, 27, 19};
	private char[] sGenders = {'M', 'W', 'W', 'M', 'M'};
	private String[] sMajors = {"English Literature", "Korean Language and Literature",
			"French Language and Literature", "Philosophy", "History"};

	public String[] getsNums() {
		return sNums;
	}
	public void setsNums(String[] sNums) {
		this.sNums = sNums;
	}
	public String[] getsIds() {
		return sIds;
	}
	public void setsIds(String[] sIds) {
		this.sIds = sIds;
	}
	public String[] getsPws() {
		return sPws;
	}
	public void setsPws(String[] sPws) {
		this.sPws = sPws;
	}
	public String[] getsNames() {
		return sNames;
	}
	public void setsNames(String[] sNames) {
		this.sNames = sNames;
	}
	public int[] getsAges() {
		return sAges;
	}
	public void setsAges(int[] sAges) {
		this.sAges = sAges;
	}
	public char[] getsGenders() {
		return sGenders;
	}
	public void setsGenders(char[] sGenders) {
		this.sGenders = sGenders;
	}
	public String[] getsMajors() {
		return sMajors;
	}
	public void setsMajors(String[] sMajors) {
		this.sMajors = sMajors;
	}


}