국비 지원 개발자 과정_Day110
인스턴스화
1)정적생성 - 결정이 되어있는 상태
2)동적생성 - 실행 중에 객체 생성, 메소드 호출 가능하게 해 줌
로컬 어플리케이션
웹 어플리케이션
클래스 쪼개기
분리된 클래스가 한 몸처럼 동작하기 - 생성자 활용
의존성 주입 - Dependency Injection → IoC(제어역행, 역제어) → Spring F/W - spring-core.jar(컨테이너)
화면과 로직의 분리(프론트와 백) - 디자인과 업무영역 분리
MVC패턴
Model
View - html(태그-한정적), css3(화면출력-디자인’구성), js(UI제어)
리액트 확장 - 사용자정의 컴포넌트를 만들어 사용(XXX,js) → js와 리액트 섞어 쓰기
조립, 재사용성, 유지보수 효율성
Controller
POJO 1~3(Reflection API-조금 더 스프링스럽게)
Spring legacy - xml기반 MVC패턴 구성
BeanFactory - 이른 객체주입
ApplicationContext - 게으른 객체주입
pojo에서 요청할 때 → FrontController(ActionSupport, ActionServlet) - 메소드호출 연결
클래스가 어떤 메소드를 가지고 있는지 알 수 있을까? - Reflection API가 해답이 될 수 있음(변경에 유리, 유연한 처리 가능)
Class.forName(”OracleDriver”)
Class carClass = Car.class; // Car클래스의 Class객체 얻기
Car car = carClass.newInstance(); // Car클래스 객체 생성 - 객체생성을 동적으로 처리 가능(deprecated 대상)
Method[] mothodArr = carClass.getDeclaredMethods(); // 사용자가 정의한 클래스에 선언된 메소드 전부
Field[] mvArr = carClass.getDeclaredFields(); // 클래스에 선언된 필드 얻기
Annotation[] annoArr = mv.getDeclaredAnnotations(); // 필드에 붙은 어노테이션 얻기
Class객체
Class클래스의 객체 - 클래스당 1개만 존재
해당 클래스의 정보 조회, 객체 생성기능 제공
<Reflection 예제 - DeptController.java>
package com.example.demo;
public class DeptController {
// @Autowired
private DeptLogic deptLogic;
public void setDeptLogic(DeptLogic deptLogic) {
this.deptLogic = deptLogic;
}
public String deptList() {
return "부서목록";
}
public String deptInsert() {
return "부서등록";
}
public String deptUpdate() {
return "부서정보 수정";
}
public String deptDelete() {
return "부서정보 삭제";
}
}
<Reflection 예제 - DepeDemo.java>
package com.example.demo;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.springframework.util.StringUtils;
public class DeptDemo {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
DeptController deptController = new DeptController();
// 객체로부터 Class객체 얻기
Class<?> deptClass = deptController.getClass();
// 객체 리터럴로부터 Class객체 얻기
deptClass = DeptController.class;
deptClass = Class.forName("com.example.demo.DeptController");
DeptController deptController2 = (DeptController)deptClass.newInstance();
System.out.println(deptController2);
Method[] methodArr = deptClass.getDeclaredMethods();
for(int i=0; i<methodArr.length; i++) {
System.out.println("methodArr=> " + methodArr[i].getName());
}
Method[] methodArr2 = deptClass.getMethods();
for(int i=0; i<methodArr2.length; i++) {
System.out.println("methodArr2=> " +methodArr2[i].getName());
}
Field[] mvArr = deptClass.getDeclaredFields();
for(Field mv:mvArr) {
System.out.println("mv=> " + mv);
String methodName = "set" + StringUtils.capitalize(mv.getName());
System.out.println(methodName);
Method method = deptClass.getMethod(methodName, mv.getType());
// 메소드 호출하기
method.invoke(deptController, mv.getType().newInstance());
}
}
}