스프링
스프링을 이용한 객체 조립과 사용
생성자 방식
스프링 설정 클래스 ( 등록, 패스워드 변경 )
@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 |