스프링

 

스프링을 이용한 객체 조립과 사용

 

생성자 방식

 

스프링 설정 클래스 ( 등록, 패스워드 변경 ) 

@Configuration // 스프링 설정 클래스 
public class StudentCtx {
	
	@Bean // ( DAO 빈 객체 생성
	public StudentDao studentDao() {
		return new StudentDao();
	}
	
	@Bean // DAO가 생성한 객체를  StudentRegisterService 생성자를 통해 주입 
	public StudentRegisterService studentRegisterService() {
		return new StudentRegisterService(studentDao());
	}
	
	@Bean // setStudentDao()메서드를 이용해서 의존 객체 주입 
	public StudentChangePasswordService studentChangePWdSvc() {
		StudentChangePasswordService pwdSvc = new StudentChangePasswordService();
		pwdSvc.setStudentDao(studentDao());
		return pwdSvc;
	}

 

Service 

package student;

import java.time.LocalDateTime;

import spring.DuplicateMemberException;
import spring.RegisterRequest;

public class StudentRegisterService {
    private StudentDao studentDao;

    // 생성자를 통해 StudentDao 객체를 주입받음
    // 의존 객체를 생성자를 통해 주입한다.
    public StudentRegisterService(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    // 학생 등록을 수행하는 메서드
    public Long regist(StudentRequest req) {
        // 입력한 전화번호로 이미 등록된 학생이 있는지 조회
        Student student = studentDao.selectByPhone(req.getPhone());

        // 같은 전화번호를 가진 학생이 이미 존재하면 예외 발생
        if (student != null) {
            throw new DuplicateMemberException("dup phone " + req.getPhone());
            // DuplicateMemberException 예외를 발생시키고 메시지를 설정하여 사용자에게 중복된 전화번호임을 알림
        }

        // 같은 전화번호를 가진 학생이 존재하지 않으면 DB에 삽입
        Student newStudent = new Student(
                req.getPhone(), req.getPassword(), req.getName(),
                LocalDateTime.now());
        studentDao.insert(newStudent); // 학생 정보를 DB에 삽입

        // 새로 등록한 학생의 ID를 반환
        return newStudent.getSid();
    }

	public void regist(RegisterRequest req) {
		// TODO Auto-generated method stub
		
	}
}

 

 

 

스프링 설정 클래스 ( 목록(list) 출력 ) 

 

	@Bean
	public StudentPrinter studentPrinter() {
		return new StudentPrinter();
	}
	
	@Bean
	public StudentListPrinter slistPrinter() {
		return new StudentListPrinter(studentDao(), studentPrinter());
	}

 

 

MemberPrinter 클래스

package student;

public class StudentPrinter {

	public void print(Student student) {
		System.out.printf(
				"회원 정보: 아이디=%d, 이메일=%s, 이름=%s, 등록일=%tF\n", 
				student.getSid(), student.getPhone(),
				student.getName(), student.getRegisterDateTime());
	}

}

 

MemberListPrinter 생성자로 두 개의 파라미터를 전달받는 클래스 ( DAO, Printer )

package student;

import java.util.Collection;

public class StudentListPrinter {

	private StudentDao studentDao;
	private StudentPrinter printer;

	public StudentListPrinter(StudentDao studentDao, StudentPrinter printer) {
		this.studentDao = studentDao;
		this.printer = printer;
	}

	public void printAll() {
		Collection<Student> students = studentDao.selectAll();
		students.forEach(m -> printer.print(m));
	}

}

 

세터 메서드 방식 ( 자바빈 규칙 Set, Get )

 

 

빈 객체 추가

	@Bean
	public StudentInfoPrinter studentInfoPrinter() {
		StudentInfoPrinter studentInfoPrinter = new StudentInfoPrinter();
		
		studentInfoPrinter.setStudentDao(studentDao());
		studentInfoPrinter.setStudentPrinter(studentPrinter());
		return studentInfoPrinter;
	}

 

 

지정한 이메일을 갖는 Student를 찾아서 정보를 콘솔에 출력

 

package student;

public class StudentInfoPrinter {

	private StudentDao studentDao;
	private StudentPrinter studentPrinter;

	public void printStudentInfo(String phone) {
		Student student = studentDao.selectByPhone(phone);
		if (student == null) {
			System.out.println("데이터 없음\n");
			return;
		}
		studentPrinter.print(student);
		System.out.println();
	}
	
	// DAO 세터 메서드 정의 
	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
    // Printer 세터 메서드 정의
	public void setStudentPrinter(StudentPrinter studentPrinter) {
		this.studentPrinter = studentPrinter;
	}

}

 

 

 

빈 객체 추가

	@Bean
	public StudentInfoPrinter studentInfoPrinter() {
		StudentInfoPrinter studentInfoPrinter = new StudentInfoPrinter();
		
		studentInfoPrinter.setStudentDao(studentDao());
		studentInfoPrinter.setStudentPrinter(studentPrinter());
		return studentInfoPrinter;
	}

 

지정한 버전 출력 ( 두 개의 int 타입 값을 세터 메서드로 전달 받음 ) 

package student;

public class StudentVersionPrinter {

	private int majorVersion;
	private int minorVersion;

	public void print() {
		System.out.printf("이 프로그램의 버전은 %d.%d입니다.\n\n",
				majorVersion, minorVersion);
	}

	public void setMajorVersion(int majorVersion) {
		this.majorVersion = majorVersion;
	}

	public void setMinorVersion(int minorVersion) {
		this.minorVersion = minorVersion;
    }

}

 

 

실행

package student;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import spring.DuplicateMemberException;
import spring.MemberNotFoundException;
import spring.WrongIdPasswordException;

public class StudentForSpring {

	private static ApplicationContext ctx = null;
	
	public static void main(String[] args) throws IOException {
		ctx = new AnnotationConfigApplicationContext(StudentCtx.class);
		
		BufferedReader reader = 
				new BufferedReader(new InputStreamReader(System.in));
		while (true) {
			System.out.println("명령어를 입력하세요:");
			String command = reader.readLine();
			if (command.equalsIgnoreCase("exit")) {
				System.out.println("종료합니다.");
				break;
			}
			if (command.startsWith("new ")) {
				processNewCommand(command.split(" "));
				continue;
			} else if (command.startsWith("change ")) {
				processChangeCommand(command.split(" "));
				continue;
			} else if (command.equals("list")) {
				processListCommand();
				continue;
			} else if (command.startsWith("info ")) {
				processInfoCommand(command.split(" "));
				continue;
			} else if (command.equals("version")) {
				processVersionCommand();
				continue;
			}
			printHelp();
		}
	}
	// new 생성
	private static void processNewCommand(String[] arg) {
		if (arg.length != 5) {
			printHelp();
			return;
		}
		StudentRegisterService regSvc = 
				ctx.getBean("studentRegisterService", StudentRegisterService.class);
		StudentRequest req = new StudentRequest();
		req.setPhone(arg[1]);
		req.setName(arg[2]);
		req.setPassword(arg[3]);
		req.setConfirmPassword(arg[4]);
		
		if (!req.isPasswordEqualToConfirmPassword()) {
			System.out.println("암호와 확인이 일치하지 않습니다.\n");
			return;
		}
		try {
			regSvc.regist(req);
			System.out.println("등록했습니다.\n");
		} catch (DuplicateMemberException e) {
			System.out.println("이미 존재하는 이메일입니다.\n");
		}
	}
	// change 비밀번호 변경
	private static void processChangeCommand(String[] arg) {
		if (arg.length != 4) {
			printHelp();
			return;
		}
		StudentChangePasswordService studentPwdSvc = 
				ctx.getBean("studentChangePWdSvc", StudentChangePasswordService.class);
		try {
			studentPwdSvc.changePassword(arg[1], arg[2], arg[3]);
			System.out.println("암호를 변경했습니다.\n");
		} catch (MemberNotFoundException e) {
			System.out.println("존재하지 않는 이메일입니다.\n");
		} catch (WrongIdPasswordException e) {
			System.out.println("이메일과 암호가 일치하지 않습니다.\n");
		}
	}
	// 오류 처리 
	private static void printHelp() {
		System.out.println();
		System.out.println("잘못된 명령입니다. 아래 명령어 사용법을 확인하세요.");
		System.out.println("명령어 사용법:");
		System.out.println("new 이메일 이름 암호 암호확인");
		System.out.println("change 이메일 현재비번 변경비번");
		System.out.println();
	}
	// 목록 ( list ) 출력
	private static void processListCommand() {
		StudentListPrinter slistPrinter = 
				ctx.getBean("slistPrinter", StudentListPrinter.class);
		slistPrinter.printAll();
	}
	// 지정한 이메일을 갖는 정보를 찾아서 출력
	private static void processInfoCommand(String[] arg) {
		if (arg.length != 2) {
			printHelp();
			return;
		}
		StudentInfoPrinter studentInfoPrinter = 
				ctx.getBean("studentInfoPrinter", StudentInfoPrinter.class);
		studentInfoPrinter.printStudentInfo(arg[1]);
	}
	// 버전 정보 출력
	private static void processVersionCommand() {
		StudentVersionPrinter studentVersionPrinter = 
				ctx.getBean("studentVersionPrinter", StudentVersionPrinter.class);
		studentVersionPrinter.print();
	}

}

 

'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글

2023-07-26 49일차  (0) 2023.07.26
2023-07-25 48일차  (0) 2023.07.25
2023-07-21 46일차  (0) 2023.07.21
2023-07-20 45일차  (0) 2023.07.20
2023-07-19 44일차  (0) 2023.07.19

+ Recent posts