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

02/23 61회차 수업 React, Pojo, Spring 개념정리

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

 

쿼리스트링

도메인 뒤에 ?

?뒤에는 키와 value가 온다.

 

자바를 브라우저에 쓸 수 없다.

JSP

Servlet필요하다

 

PrintWrite객체를 생성해서 출력 해 준다.

그렇지만 if문을 쓸 수 없다. 

{}가 있어야 실행문을 쓴다.

 

생성자의 역할

객체를 메모리에 올릴때 호출되는것이다.

메소드

어떤 기능을 재사용하기위해 사용. 필요할때 메소드를 호출한다.

 

무조건 생성이 아니라 있는지 물어본다...

PrintWriter out = res.getWriter( );

이제는 객체생성을 할 때 메소드의 형태로 객체주입을 받을 수 있다.

더이상 new말고....

이렇게 객체를 생성하고 나면  Print라는 함수를 생성할 수 있다.

 

서블릿

out.print(<태그>);

 

서블릿은 뷰의 역할을 담당하기에는 피곤하다...

매번 프린트 안에 태그넣고 내용넣어야된다. 귀찮다.

 

Node.js는 브라우저 없이 출력할 수 있다.

결과 확인 바로 할 수 있다. 

 

브라우저기반으로 서비스 제공

브라우저 없을때 node.js통해서 웹 서비스 제공.

 

그래서 자바스크립트에 import와 require가 등장했다...

 

import---->Bable

require---->node.js

 

res.setContentType("----/-----")===>mime type

웹서비스가 가능하려면 요청객체가 있어야한다.

response객체가 필요 하다.

웹서비스에서는 URL이 없으면 요청을 할 수 없다.

웹서비스에서 response가 없으면 응답을 받을 수 없다.

 

text/mime type

 

응답, 요청객체주입은 톰캣이 해준다.

Servlet====>api.jar

JSP====>api.jar

 

요청을 하거나 전송을 할 때에는 GET POST방식이 있다.

자바도 두가지를 지원해야된다.

두가지 클래스가 있다.

Servlet이다.

서블릿이 되기위한 조건은 HttpServlet을 상속 받아야 한다.

오버라이딩한다.

@Override

doget

dopost

두 객체를 주입 받는다. 톰캣으로 부터. URL을 요청 하면....

게으른 인스턴스화이다. 게으른 인스턴스화가 더 효율적이다. 필요할 때 주입해주기때문...

 

주입받은 객체를 싱글톤으로 관리한다.

 

싱글톤을 코드로 나타내면...

if(x==null)  x=new Sonata

 

하나의 자원을 여러사람이 공유할 때 스레드가 필요하다.

여러사람이 경합이 벌어진다. 

순서...

 

WAS 에서 서블릿을 관리 해 준다.

@WebServlet

@을 사용하는 Spring Boot는 더이상 request와 res사용 안한다.

그래도 응답을 보내고 요청을 받을 수 있다.

어노테이션을 통해서....

 

완전 수동=Pojo

 

Spring은

자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로, 기업급 애플리케이션 개발에 많이 사용됩니다.

Spring은 애플리케이션을 모듈화하고, 객체 지향적인 방식으로 개발할 수 있도록 지원합니다. Spring은 여러 모듈로 구성되어 있으며, DI(Dependency Injection)와 AOP(Aspect-Oriented Programming) 등의 기능을 제공합니다.

DI는 의존성 주입이라는 의미로, 객체들 사이의 의존성을 자동으로 주입하여 객체 간의 결합도를 낮춥니다. 이를 통해 코드의 유연성과 확장성을 높이며, 테스트가 용이하게 됩니다.

AOP는 관점 지향 프로그래밍이라는 의미로, 애플리케이션의 여러 부분에서 공통적으로 적용되는 기능들을 모듈화하여 중복을 제거하고 유지보수성을 높이는 기능을 제공합니다.

Spring은 또한 다양한 데이터 액세스 기술과 통합이 가능하며, JDBC, ORM, NoSQL 데이터베이스 등을 쉽게 사용할 수 있습니다. Spring은 MVC(Model-View-Controller) 패턴을 지원하여 웹 애플리케이션 개발에도 적합합니다.

Spring은 IoC(Inversion of Control)라는 개념을 사용하여 객체 생성과 관리를 담당하는 컨테이너를 제공합니다. 이를 통해 객체 간의 결합도를 낮추고, 유연하고 확장 가능한 애플리케이션을 만들 수 있습니다.

Spring은 또한 다양한 보안 기능, 테스트 지원, 메시징 기능 등 다양한 기능을 제공하며, 개발 생산성을 높이는데 큰 기여를 합니다.

따라서 Spring은 다양한 기능을 제공하는 유연하고 확장 가능한 애플리케이션을 개발할 수 있도록 지원하는 프레임워크입니다.

 

Spring Boot는

Spring 프레임워크 기반으로 만들어진 독립적인 애플리케이션 개발을 위한 프레임워크입니다. Spring Boot는 간단한 구성, 자동 구성, 스타터(dependency) 패키지, 내장 서버 등을 제공하여 개발자가 쉽게 Spring 기반의 애플리케이션을 만들 수 있도록 지원합니다.

 

Spring Boot는 자동 구성 기능을 제공하여 개발자가 애플리케이션의 구성을 더욱 간단하게 만들 수 있습니다. 예를 들어, 데이터베이스 연결을 위해 설정 파일에 데이터베이스 URL, 계정 정보 등을 명시하는 대신, Spring Boot는 자동으로 설정 파일에서 이 정보를 읽어 데이터베이스 연결을 수행합니다. 이와 같은 자동 구성 기능으로 개발자는 애플리케이션을 더욱 쉽게 구성할 수 있습니다.

 

또한 Spring Boot는 다양한 스타터 패키지를 제공하여 각종 라이브러리와 프레임워크를 쉽게 추가할 수 있도록 도와줍니다. 예를 들어, Spring Boot에서는 Spring MVC, Thymeleaf, JPA, MongoDB, Redis, RabbitMQ 등의 스타터 패키지를 제공하여 개발자가 이를 추가하기 쉽도록 지원합니다.

 

또한 Spring Boot는 내장 서버를 제공하여 애플리케이션을 독립적으로 실행할 수 있습니다. 이를 통해 애플리케이션의 배포와 실행이 더욱 쉬워지며, 개발자는 서버 구성에 대한 부담을 덜 수 있습니다.

따라서 Spring Boot는 Spring 기반의 애플리케이션 개발을 더욱 쉽고 빠르게 할 수 있도록 지원하는 프레임워크입니다.

 

POJO는

POJO는 별도의 프레임워크나 라이브러리 없이 순수한 자바 객체를 사용하여 개발하는 방식을 의미합니다. 이를 통해 간단하고 가벼운 구현이 가능하며, 코드의 유지보수성과 이식성을 높일 수 있습니다.

 

"Plain Old Java Object"의 약어로, Java 언어를 사용하여 만들어진 객체를 설명하는 용어입니다.

POJO는 Java Enterprise Edition (Java EE)와 Spring Framework 같은 프레임워크에서 널리 사용됩니다.

POJO는 특정한 제약이나 규칙을 따르지 않으며, Java Bean 규칙과 같은 특정한 인터페이스를 구현하지 않습니다. 이러한 이유로 POJO는 다른 Java 클래스와의 상호작용이 간편하고, 코드가 간결하며, 테스트가 용이하다는 장점이 있습니다.

Java EE에서는 POJO를 사용하여 EJB(Entity Java Bean)과 같은 복잡한 구성 요소를 대체할 수 있습니다. POJO는 간단한 Java 클래스로 구성되어 있으므로, 개발자는 비즈니스 로직에 집중할 수 있습니다.

Spring Framework에서는 POJO를 사용하여 애플리케이션을 구성할 수 있으며, POJO 기반의 프레임워크인 Spring Boot도 제공됩니다.

따라서 POJO는 Java에서 객체를 구현하고 상호작용하는 데에 있어서 유용한 개념입니다. POJO를 사용하면 코드의 유연성, 확장성 및 유지보수성을 향상시킬 수 있습니다.

 

자바는 상속을 받을 수 있다. 확장이 가능하다.

 

JSP는 인스턴스화를 할 수 없다.

a.jsp-->a_jsp.java

jsp는 이 바꾸는 이름이 WAS마다 다르다. 파일 이름이 달라진다. 그래서 인스턴스화를 할 수 없다.

그런데 mime type이 text/html이다. 그래서 자바로 웹 서비스가 가능하다.

 

만들어진 순서

자바===>서블릿====>JSP

 

jsp는 자바코드를 최소한으로 적는것이 베스트이다!!!

리스크를 피해가는 사람이다...

 

서블릿을 클래스로 바꾸는것은 서블릿 엔진.

 

서버에서 돌아가는 자바=서블릿

 

응답은 마임타입을 정한다. SendRedirect. request??

request를 통해서 화면과 백앤드 사이에서 저장할 수 있다.

http프로토콜이라서 상태 유지가 안된다. 비상태이다. 기억 할 수 없다.

 

그냥 스프링을 하면 감이 안올수있다. 먼저 포조로 되어있는것을 스프링으로 바꾸는 연습을 하자...

req와 res 는 개발자가 인스턴스화 하는것이 아니고 톰캣이 해준다.

제어의 역전이 일어났다. 의존성 주입이다. 그래서 문제가 된다.

이 문제를 해결하는것이 목표이다.

 

package com.pojo.step1;

public class Pattern {

	public static void main(String[] args) {
//		String url="/chat221218/업무이름/페이지이름 또는 요청이름"; //사용자의 요청을 연결해주고싶다...
		String url="/chat221218/dept/getDeptList.kh"; 
		String context="chat221228/";
		//톰캣 서버에 요청할 때 사용되는 주소값을 가지고 업무명과 업무에 필요한 이름으로
		//분리시켜 사용자 요청에 따라 처리를 담당할 XXXController객체를 주입하는데 사용됨.
		String command=url.substring(context.length()+1);
		System.out.println(command);
		int end = command.lastIndexOf(".");
		System.out.println(end);
		command=command.substring(0,end);
		System.out.println(command);
		String upmu[]=null;
		upmu=command.split("/");
		for(String imsi:upmu) {
			System.out.println(imsi);
		}
		

	}

}

 

 

//페이지 이동 방법
//1. res.sendRedirect("XXX.jsp") -표준 서블릿-MVC패턴이 아니다.
     or res.sendRedirect("dept/getDeptList.kh")-서블릿이 요청을 받음-ㅡMVC패턴
//JSP가 요청을 받는것이 왜 문제인가? -WAS마다 명명 규칙이 다르다. 그래서 인스턴스화를 할 수 없다.
//또한 인스턴스화를 한다 하더라도 request와 response객체를 주입받지못하는 문제가 있다. 그러면 mime type을 못정한다.

public class ActionFoward {
	//페이지 이동 방법
	//1. res.sendRedirect("XXX.jsp") -표준 서블릿-MVC패턴이 아니다.
	//  or res.sendRedirect("dept/getDeptList.kh")-서블릿이 요정을 받음-ㅡMVC패턴
	//JSP가 요청을 받는것이 왜 문제인가? -WAS마다 명명 규칙이 다르다. 그래서 인스턴스화를 할 수 없다.
	//또한 인스턴스화를 한다 하더라도 request와 response객체를 주입받지못하는 문제가 있다. 그러면 mime type을 못정한다.
	
	
	private String path=null;//응답페이지의 이름 또는 서블릿의 이름
	//sendRedirect로 페이지를 이동 할 것인지 아니면 forward로 페이지를 이동 할 것인지 결정해줌
	private boolean isRedirect=false;//true:redirect(insert|update|delete), flase:forward(select)
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public boolean isRedirect() {
		return isRedirect;
	}
	public void setRedirect(boolean isRedirect) {
		this.isRedirect = isRedirect;
	}
}
/*
 * ActionForward클래스를 왜 만드나?
 * 웹서비스에서는 메인 메소드 대신에 URL로 요청을 보낸다.
 * 누가? 클라이언트가
 * 누구에게? 톰캣 서버에게
 * 요청을 할 때 URL을 사용한다.
 * 
 * 
 * 
 * */

 

뒤에 확장자가 kh로 끝나는것을 다 가져와라고 하고싶다.

서블릿 필요하다.

<!-- *.st1하면 어떤 요청이 오든 확장자가 st1으로 끝나면 FrontMVC1서블릿이 인터셉트함
          web.xml을 수정하면 무조건 서버를 재기동 해야 수정된 내용이 반영된다. -->

 

리액트 프로젝트 만들기

()안은 내가 만들 프로젝트 이름이다.

 

yarn create react-app 이름

명령어로 설치해준다.

설치가 완료 됐다.

 

 

리액트 프로젝트 템플릿 작성하기

1. npm install -g yarn

2. yarn -version

3. yarn create react-app template2023

4. yarn init --force 엔터 한 후 질문지에 대해 모두 엔터 치면 자동 완성됨

 

지울거 지워준다.

yarn start해준다.

 

톰캣서버와 리액트 서버를 연동하자

 

Yarn은

 

Facebook에서 개발한 자바스크립트 패키지 매니저입니다. npm(Node Package Manager)과 유사하지만, 더욱 빠르고 안정적인 성능을 제공하며 보안적인 측면에서도 우수한 기능을 제공합니다.

Yarn은 프로젝트의 종속성(dependencies)을 관리하는 데 사용되며, 이를 통해 프로젝트 개발 및 배포를 보다 효율적으로 할 수 있습니다. Yarn은 npm과 호환되기 때문에 기존의 npm으로 설치한 패키지를 그대로 사용할 수 있으며, npm보다 더 나은 성능과 보안을 제공합니다.

Yarn은 다음과 같은 주요 기능을 제공합니다.

  • 의존성 해결 알고리즘을 통해 의존성 설치 속도가 빠름
  • 레지스트리 API 캐싱을 통해 네트워크 속도가 빠름
  • 작업 병렬 처리를 통해 더 빠른 패키지 설치 가능
  • 간단한 CLI(Command Line Interface)를 제공하여 사용이 쉬움
  • lockfile 기능을 제공하여 의존성 버전 충돌을 방지하고, 빌드 환경을 일관성 있게 유지 가능

요약하면, Yarn은 자바스크립트 패키지 매니저로, 프로젝트의 종속성(dependencies)을 관리하며, npm보다 빠르고 안정적인 성능을 제공합니다.

 

rafc단축키===>arrow function export default

 

Promise는

자바스크립트 비동기 처리에 사용되는 객체입니다. 자바스크립트는 단일 쓰레드에서 동작하므로, 비동기 처리를 통해 블로킹(blocking)을 방지하고 프로그램의 성능을 개선할 수 있습니다. Promise는 이러한 비동기 처리를 보다 쉽게 구현할 수 있도록 제공되는 객체입니다.

Promise는 다음과 같은 세 가지 상태를 가집니다.

  • 대기(pending): 이행 또는 거부되지 않은 초기 상태
  • 이행(fulfilled): 연산이 성공적으로 완료되어 결과 값을 반환한 상태
  • 거부(rejected): 연산이 실패하여 오류 값을 반환한 상태

Promise를 사용하면, 비동기 작업을 수행하는 함수에서 결과 값을 반환할 수 있으며, 이후에 해당 결과 값을 처리하는 코드를 작성할 수 있습니다. Promise를 사용하는 코드는 일반적으로 다음과 같은 형태를 가집니다.

위 코드에서 asyncFunction()은 Promise 객체를 반환하며, then() 메소드와 catch() 메소드를 통해 성공적인 결과 값과 오류 값을 처리할 수 있습니다. then() 메소드는 Promise가 이행됐을 때 호출되며, catch() 메소드는 Promise가 거부됐을 때 호출됩니다.

 

얀 이용해서 라우터 돔 설치해준다.

yarn add react-router dom

 

 

axios

-비동기 처리를 도와준다.

import axios from 'axios';
import React from 'react'

export const dbLogic = () => {
  return new Promise((resolve, reject)=>{
    try {
      const response=axios({
        method:"get",
        url:process.env.React_APP_CHAT221228_IP+"dept/jasonDeptList.st1",
        params:params,
      })
      resolve(response)
    } catch (error) {
      reject(error);
    }
  });
}
/* rafce단축키 에로우펑션만들어줌 */

 

계층형 게시판 설계

댓글쓰기할때에는 이미 상세보기에서 기본 데이터가 있다.

 

 

이 주소를 가져오는 메소드 getRequestURI

 

package com.pojo.step1;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 FrontMVC1 extends HttpServlet {
	Logger logger=Logger.getLogger(FrontMVC1.class);
	protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		logger.info("doServide호출");
		//http://localhost:9000/dept/getDeptList.st.1
	
		String uri=req.getRequestURI();
		logger.info(uri);// /dept.getDeptList.st1
		String context =req.getContextPath();// server.xml에 들어있다.
		logger.info(context);
		//http://localhost:9000/dept/getDeptList.st1
				//http://localhost:9000/업무명폴더명/getDeptList.st1
				//http://localhost:9000/member/getDeptList.st1
				//http://localhost:9000/board/getDeptList.st1
		//http://localhost:9000/board/boardInsert.st1
		//http://localhost:9000/board/boardUpdate.st1
		//http://localhost:9000/board/boardDelete.st1
	
		
		String command=uri.substring(context.length()+1);
		System.out.println(command);
		int end = command.lastIndexOf(".");//16-st1잘라내기위해 사용
		System.out.println(end);
		command=command.substring(0,end);
		System.out.println(command);
		String upmu[]=null;//upmu[0]=업무명|폴더명, upmu[1]=요청기능이름
		upmu=command.split("/");
		for(String imsi:upmu) {
			System.out.println(imsi);
		}
		ActionForward af=null;
		//게으른 인스턴스화- 아직 결정되지 않았다.
		//업무명이 Controller class의 접두어이다.
		DeptController deptController=null;
		EmpController empController=null;
		
		if("dept".equals(upmu[0])) {
			//인스턴스화->execute()호출할려고->안하면 NullpointerException이니까->500번오류이다.
			deptController=new DeptController();
			af=deptController.execute(req, res);
			//DeptController는 서블릿이 아니어서 http상속아니고 implement action을 했쟈나..
			//req와 res를 톰캣 서버로부터 주입 받을 수 없다.
			//httpServlet을 상속안받아서 못쓴다.
			//그래서 여기에 인스턴스화해서 주입해준다. execute로
		}else if("emp".equals(upmu[0])) {
			empController=new EmpController();
			af=empController.execute(req, res);
		}
		
		//페이지 이동처리 공통코드 만듦
		//1.res.sendRedirect("/dept/getDeptList.jsp");//jsp-->servlet->jsp
		//res.sendRedirect("/dept/getDeptList.st1");//jsp->servlet->servlet->jsp
		//새글쓰기의 경우처럼!! 입력받고 insert하고 select하고 다시화면뿌리고
		if(af!=null) {
			if(af.isRedirect()) {
				res.sendRedirect(af.getPath());
			}else {
				RequestDispatcher view = req.getRequestDispatcher(af.getPath());
				view.forward(req,res);
			}
		}//end for page이동처리에 대한 공통 코드부분
	}

	@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);
	}

}

0번방은 업무명이 담기고 1번 방은 메소드 이름을 담으면 되지 않을까?

 

그런데 DeptController에서 req와 res를 받을 수 있는건 execute(req, res) 메소드 뿐이다.

그러면 각 기능을 사용하려면 메소드로 나누면 안될 것 같다.

그럼 if문으로 분기하고

DeptLogic.java에서 메소드를 분리해나가자.

 

DeptLogic.java - 트렌젝션 처리

DeptDao.java- DB연동 전담

트렌젝션은? 묶음배송했다. 같이 배송 나가야된다. 세트이다..

트랜잭션(Transaction)은 데이터베이스 관리 시스템(DBMS)에서 데이터를 일관되게 처리하기 위해 수행하는 작업 단위를 의미합니다. 즉, 여러 개의 작업이 하나의 논리적인 작업 단위로 묶여서 실행되는 것을 의미합니다.

 

트랜잭션은 일반적으로 ACID라는 속성을 가지고 있습니다. ACID란 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)의 약어로, 각각 다음과 같은 의미를 가집니다.

  • 원자성(Atomicity): 트랜잭션이 모두 성공하거나 모두 실패해야 한다는 것을 의미합니다. 즉, 하나의 작업이 실패하면 모든 작업이 롤백되어 이전 상태로 되돌아가야 합니다.
  • 일관성(Consistency): 트랜잭션이 실행되기 전과 실행된 후의 데이터베이스 상태가 일관성을 유지해야 한다는 것을 의미합니다.
  • 고립성(Isolation): 트랜잭션 실행 중 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 보장해야 한다는 것을 의미합니다. 즉, 트랜잭션 실행 중 다른 트랜잭션에서 해당 데이터를 변경하거나 조회하지 못하도록 해야 합니다.
  • 지속성(Durability): 트랜잭션이 성공적으로 완료되면, 해당 작업 결과는 영구적으로 반영되어야 한다는 것을 의미합니다.
  •  

EmpLogic.java

EmpDao.java 

 

액션포워드 getDeptList메소드는 페이지 이동을 못한다.

오버라이드 안했으니까.

xml로 의존성을 주입해줘야한다.

FrontMVC1를 경유해야된다. .st1을 붙여서 가능...

 

req에 값이 담겨있다. 뭐가? upmu배열이 담겨져있어..

저장소 역할을 한다..

 

request객체는 저장소이다!!!!!

저장할때는 ====> setAttribute

꺼내올때는 ====>getAttribute

 

한번만 쓰는것이다. 왜 그럴까?

 

댓글