본문 바로가기
학원수업/3월

03/02 국비개발자과정- Pojo를 거쳐 Spring으로!

by 코딩마스터^^ 2023. 3. 2.
 

step1
void -> ActionForward -> 페이지 이동
Action 인터페이스 설계
doGet  -> execute(req, res)
doPost

step2 - 좀 더 스프링스럽게.....
ActionForward -> String
1)"redirect:XXX.jsp" or "redirect:XXX.sp2(입력,수정,삭제 처리 후 결과 페이지 처리목적)
2)"forward:XXX.jsp"
주의 : XXX.sp2를 사용 불가
3)"업무폴더명/페이지이름
WEB-INF/view/업무폴더명/페이지이름.jspstep3 - 스프링과 최대한 비슷하게


step3-스프링과 최대한 비슷하게
String->ModelAndView객체를 추가
spring4버전까지 잘 사용
그러나...
Model과 ModelMap지원되면서 사용하지 않게 됨


포조를 이용해서 스프링가기전에 준비를 하자!!

package com.pojo.step2;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

public class ActionServlet extends HttpServlet {
	Logger logger=Logger.getLogger(ActionServlet.class);
	protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info("doServide호출");
		//http://localhost:9000/chat_banana/getBoardList.st2
	
		String uri=req.getRequestURI();
		logger.info(uri);// /dept.getDeptList.st1
		String context =req.getContextPath();// server.xml에 들어있다.
		logger.info(context);
		String command = uri.substring(context.length()+1); //context정보만 제외된 나머지 정보를 담고 있음
		int end = command.lastIndexOf(".");//16 -st1잘라내기위해 사용 // .에 대한 위치를 잘라내기 위해서
		System.out.println(end);//16출력
		System.out.println(command);
		command = command.substring(0,end);//dept/getDeptList
		System.out.println(command);
		String upmu[] = null;//upmu[0] = 업무명|폴더명, upmu[1] = 요청기능이름
		upmu = command.split("/");
		logger.info(upmu[0]+","+upmu[1]);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		doService(req,res);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		doService(req,res);
	}
}

 

 

 

클래스를 쪼개서 각각 독립적으로 관리하는것이 편하다.

Dao만든다.

 

 

 

step3!!

워크 스페이스 새로 하나 팠다. 전자정부프레임으로 해주기.

전자정부프레임워크만 이 메뉴가 있다!!

com.example.demo로 프로젝트 생성해준다.

 

주의!!

자바 가상머신을 11인지 확인해준다.

전자정부 프레임워크에서는 11로 맞춰줘야한다.

11버전 추가 후 제일 위로 올려준다.

 

 

톰캣 포트번호를 8001에 8000 으로 바꿔준다.

서버 설정 끝!!

 

스프링의 의존성 주입

https://cheershennah.tistory.com/227

 

Spring DI 스프링 의존성 주입 3가지 방법

Spring DI 스프링에서 의존성 주입(DI)이란, 객체간 의존성을 개발자가 객체 내부에서 직접 호출(new연산자)하는 대신, 외부(스프링 컨테이너)에서 객체를 생성해서 넣어주는 방식이다. 외부에서 두

cheershennah.tistory.com

helloBeans.xml만들어준다.

 

필요할때마다 스프링 컨테이너가 객체를 주입해준다.

Bean을 관리하는 별도의 문서가 존재한다.

임플리먼트 라는 뜻

 

 

 

스프링 컨테이너는

스프링 프레임워크에서 IOC를 구현하는 핵심 역할을 수행하는 컴포넌트입니다.

스프링 컨테이너는 객체를 생성하고, 관리하며, 의존성을 주입합니다. 개발자는 스프링 컨테이너에게 필요한 객체를 요청하면, 스프링 컨테이너는 객체를 생성하고, 객체 간의 의존성을 자동으로 연결합니다. 이를 통해 객체 간의 결합도를 낮추고, 유지보수성과 확장성을 높일 수 있습니다.

스프링 컨테이너는 크게 두 가지 타입으로 나눌 수 있습니다.

 

BeanFactory

 

BeanFactory는 스프링에서 가장 기본적인 컨테이너(최상위 인터페이스)입니다.

BeanFactory는 스프링 빈 객체의 생성, 관리, 조회를 담당합니다.

BeanFactory는 스프링 빈의 생성과 초기화를 지연시킵니다.

즉, 스프링 빈이 호출될 때까지 객체를 생성하지 않습니다. 이를 통해 불필요한 자원 낭비를 줄일 수 있습니다. 

 

ApplicationContext

 

ApplicationContext는 BeanFactory를 확장한 것으로, BeanFactory의 모든 기능을 포함하고 있습니다.

또한, ApplicationContext는 스프링 빈의 생성과 초기화를 미리 수행하여, 애플리케이션 구동 시점에 빈을 미리 생성하여 보관합니다.

이를 통해 애플리케이션 구동 시간을 단축시키고, 빈의 의존성을 미리 체크하여 에러를 미연에 방지할 수 있습니다.

스프링에서는 ApplicationContext를 더 많이 사용합니다. 따라서, 일반적으로 스프링 컨테이너라고 하면 ApplicationContext를 의미합니다.

 

Spring의 Bean이란?

Spring 프레임워크에서 관리되는 객체를 말합니다. 일반적으로 객체 지향 프로그래밍에서 객체는 클래스의 인스턴스입니다. Spring에서는 이러한 객체를 Bean으로 관리합니다.

Spring의 Bean은 다음과 같은 특징을 갖습니다.

 

1. 스프링 컨테이너에 의해 관리되는 객체

Bean은 Spring 컨테이너에 의해 생성, 초기화, 관리, 소멸됩니다. 이를 통해, 객체의 생명 주기를 관리하고,

필요한 경우 객체를 재사용할 수 있습니다.

 

2. DI(Dependency Injection)를 이용한 의존성 관리

Spring에서는 Bean 객체 간의 의존성을 관리하기 위해 DI(Dependency Injection) 방식을 사용합니다.

DI는 객체를 생성하면서, 객체가 의존하는 다른 객체를 생성하고, 이를 객체에 주입합니다.

이를 통해, 객체 간의 결합도를 낮추고, 유연한 구조를 갖출 수 있습니다

 

3. 설정 파일에 등록되어 사용

Spring에서는 Bean 객체를 사용하기 위해 설정 파일(XML 또는 Java Config)에 등록합니다. 이를 통해, 컨테이너는 설정 파일에 등록된 Bean 객체를 생성하고, DI를 수행합니다.

Spring에서는 다양한 방법으로 Bean 객체를 생성하고, 관리할 수 있습니다. 일반적으로는, 설정 파일(XML 또는 Java Config)에 Bean을 등록하고, 컨테이너가 이를 생성하고, DI를 수행하도록 합니다. 그 외에도, 어노테이션을 사용하여 Bean을 생성하고, 컨테이너에 등록할 수 있습니다.

 

BeanFactory(스프링 컨테이너=엔진)는

Spring 프레임워크에서 Bean 객체를 생성하고, 관리하는 인터페이스입니다. BeanFactory는 DI(Dependency Injection)를 위해 사용됩니다.

BeanFactory는 다음과 같은 주요 기능을 갖습니다.

 

Bean 객체의 생성 및 관리

BeanFactory는 Bean 객체를 생성하고, 이를 관리합니다. Bean 객체는 Spring 컨테이너에 의해 생성되며, 컨테이너는 Bean 객체의 생명 주기를 관리합니다. BeanFactory는 컨테이너에 등록된 Bean 객체를 제공합니다.

 

DI(Dependency Injection)

BeanFactory는 DI(Dependency Injection)를 위해 사용됩니다. BeanFactory는 객체가 의존하는 다른 객체를 생성하고, 이를 객체에 주입합니다. 이를 통해, 객체 간의 결합도를 낮추고, 유연한 구조를 갖출 수 있습니다.

 

설정 파일에서 Bean 객체를 읽어옴

BeanFactory는 설정 파일(XML 또는 Java Config)에서 Bean 객체를 읽어옵니다. 설정 파일에 등록된 Bean 객체는 컨테이너에 등록됩니다. 이를 통해, 컨테이너는 설정 파일에 등록된 Bean 객체를 생성하고, DI를 수행합니다.

Spring에서는 BeanFactory를 구현한 여러 인터페이스가 제공됩니다. 가장 일반적인 BeanFactory 인터페이스는 ApplicationContext 인터페이스입니다. ApplicationContext 인터페이스는 BeanFactory 인터페이스의 모든 기능을 포함하며, 다양한 부가기능을 추가로 제공합니다.

 

게으른 인스턴스화-BeanFactory

이른 인스턴스화-ApplicationContext

 

package com.di;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;

public class HelloMain {
	public static void main(String[] args) {
		//객체가 xml문서에 등록되어있음.
		Resource resouce = new FileSystemResource("D:\\workspace_spring\\kh_spring4\\src\\main\\java\\com\\di\\helloBean.xml");
		//Spring Container는 두가지 유형의 컨테이너를 제공함
		//spring-beans.jar에 살고 있음
		//모든 빈을 늦게 로딩함 - getBean()호출 될 때 까지 Bean의 생성을 미룸
		BeanFactory factory = new XmlBeanFactory(resouce);
		HelloBean helloBean = (HelloBean)factory.getBean("helloBean");
		System.out.println(helloBean.getGreeting("안녕"));
		//spring-context.jar에 살고 있음
		//Context시작시킬때 모든 singleton 빈을 미리 로딩함으로써
		// 그빈이 필요할때 즉시 사용될 수 있도록 보장해줌
		//어플리케이션 동작시 Bean생성되기를 기다릴 필요가 없게됨
		ApplicationContext context = new ClassPathXmlApplicationContext("com\\di\\helloBean.xml");
		HelloBean helloBean2=(HelloBean)context.getBean("helloBean");
		System.out.println(helloBean2.getGreeting("잘가"));
	}
}

 

com.di.HelloBeanImpl helloBean = new helloBean();

 

new를 써서 인스턴스화 하면 스프링의 관리를 안받는다는 뜻이다.

scope가 없다. 쓰면 안된다.

 

Bean으로 하면 제어역전(IOC)이 된다.

의존성이 주입된다.

scope4가지

-page(기억 한번만)

-request(주소가 안바뀌는동안 유지-->>forward는 유지 redirect는 주소 안유지 / 저장소(req.setAttribute(값);)

-session(시간 정해서 유지)

-application(죽지않는다...평생 서버가 죽을때까지)

 

스프링을 누리려면 반드시 xml문서에 클래스를 등록해야된다.

반드시 id를 설정해서 식별해야된다.

 

스프링을 사용하기 이전에는 어떻게했나?

 

<bean>태그

id는 인스턴스 변수이다.

관리를 받는다.

생성 

 

pom.xml에 저장한다. - > Maven방식이다.

 

스프링에서는 클래스를 빈이라고 한다.

스프링 컨테이너가 빈들을 관리해준다.

스프링에서 객체의 라이프사이클을 관리해준다.

컨테이너를 빈팩토리라고 부른다.

 

리액트 수업

 

React에서 제공하는 Hook은 다음과 같습니다.

  1. useState: 상태(state) 값을 관리하기 위한 Hook입니다. 함수형 컴포넌트에서도 상태를 가질 수 있도록 지원합니다.
  2. useEffect: 컴포넌트에서 부수 효과(side effect)를 수행하기 위한 Hook입니다. 컴포넌트가 렌더링된 후에 실행되며, 상태 변화나 프로퍼티 변화 등의 이벤트에 반응하여 다양한 작업을 수행할 수 있습니다.

상태값이 변할때마다 렌더링이 되도록 하고싶다면 useState훅을 사용할것

 

const [result2, setResult2]=useState(0)
 
 

이 코드는 useState Hook을 사용하여 result2라는 이름의 상태를 선언하고, 초깃값으로 0을 설정합니다. setResult2는 result2 값을 변경하는 함수입니다.

useState Hook은 배열을 반환합니다.

배열의 첫 번째 원소는 현재 상태 값을 가리키는 변수이고, 두 번째 원소는 상태 값을 변경하는 함수입니다.

 

따라서 위 코드에서 result2는 현재 0으로 초기화된 값이 되고, setResult2 함수를 사용하여 result2 값을 변경할 수 있습니다. 예를 들어, setResult2(10)을 호출하면 result2 값이 10으로 변경됩니다.

 

Array.prototype.filter()

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.

 arr.filter(callback(element[, index[, array]])[, thisArg])

Array.prototype.concat()

concat() 메서드는 인자로 주어진 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환합니다.

  • 기존배열을 변경하지 않습니다.
  • 추가된 새로운 배열을 반환합니다.

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);

console.log(array3);
// Expected output: Array ["a", "b", "c", "d", "e", "f"]

 

화면에 출력이 안되서 왜그런가했더니...

arrow function뒤에 { }가 아니고 ( )였다.

황당;; 꼼꼼히 보자.

 

화면에서 조회버튼을 누르면 나신입을 추가하고싶다.

/*
상태값이 변할때마다 렌더링이 되도록 하고싶다면 useState훅을 사용할것
*/ 
/* 
깊은 복사는 객체의 실제 값을 복사하는것이다. -원본을 바꿔도 복사본은 안바뀐다.
얕은 복사는 객체의 주소값을 복사하는 것 - 원본을 바꾸면 복사본도 바뀐다.

sample에 push함수를 통해서 원소를 추가하면
버튼을 누를때마다 sample은 증가하지만 렌더링은 새로 되지 않는다.
sample의 주소번지가 바뀌지 않았기 때문에 실제 배열의 원소는 
계속 증가되지만 return이 호출되지 않는다.

*/

 

댓글