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

02/28 국비개발자과정 64회차

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

Spring MVC 모듈은

Spring 프레임워크에서 웹 애플리케이션을 개발하기 위한 모듈입니다. MVC는 Model-View-Controller의 약자로, 웹 애플리케이션에서 데이터, 사용자 인터페이스, 비즈니스 로직을 분리하여 관리하는 디자인 패턴입니다. Spring MVC는 이러한 MVC 패턴을 기반으로 웹 애플리케이션을 개발할 수 있도록 지원합니다.

Spring MVC는 요청(Request)과 응답(Response)에 대한 처리를 담당합니다. 사용자가 웹 애플리케이션에서 요청을 보내면, Spring MVC는 해당 요청을 처리하고, 결과를 응답으로 반환합니다. Spring MVC는 다음과 같은 기능을 제공합니다.

  1. Handler Mapping: 요청 URL과 컨트롤러(Controller)를 매핑하여 해당 요청을 처리할 컨트롤러를 결정합니다.
  2. Controller: 요청을 처리하는 비즈니스 로직을 담당합니다. Spring MVC에서는 Controller 클래스를 작성하여 요청을 처리합니다.
  3. View Resolver: 컨트롤러에서 반환한 결과를 어떤 View에 출력할지 결정합니다.
  4. View: Controller에서 반환한 결과를 사용자에게 출력하는 뷰(View)를 담당합니다.
  5. Model: 컨트롤러에서 View로 데이터를 전달할 때 사용하는 객체입니다.

Spring MVC는 위와 같은 기능을 제공하여 웹 애플리케이션 개발을 빠르고 효율적으로 할 수 있습니다. 또한, Spring MVC는 다양한 데이터 액세스 기술과 연동이 용이하며, 보안 기능과 함께 안정적인 웹 애플리케이션을 개발할 수 있도록 지원합니다.

 

 

//클래스 설계에 인터페이스 필요하다
//인터페이스 중심의 코딩을 전개하는 것이 결합도를 낮춰준다 - 의존성이 낮다 - 단위테스트 가능 - 신뢰도 높이는 코드
//HttpServlet에서 강제(Override : doGet, doPost를 의미)하는 void를 다른 타입으로 바꿔보기 위한 연습
//오버라이딩의 경우 선언부를 손댈 수 없다.
//ActionForard1은 setter와getter를 가진 VO패턴의 클래스
//변수를 2개 보유 - private접근제한자를 선언-캡슐화
//String path => res.sendRedirect(path), req.getRequestDispather(path)
//path는 응답 페이지 이름[.jsp]이거나 응답페이지로  forward될 서블릿의 이름이 온다.
//그래서 아래와 같이 바꾸었지만 파라미터자리의 req와 res는 개발자가 인스턴스화 하는 것이 아니고
//톰캣이 주입해주는 객체이다
//이 문제를 어떻게 해결하는지를 관전 포인트로 삼아야함

 

//스크립틀릿- init()-service()-destroy()->서블릿의 생명주기
//그중에 개발자는 service에만 관여함
//스크립틀릿 안에는 지역변수이다.

자바코드와 서블릿코드 섞어쓸 수 있다.

 

sendRedirect는 수정할때

forward 선택할때

 

jsp에서 자바코드 많이 쓰지마라.

왜? 재사용이 힘들다.

 

jsp-api.jar엔진이 바꿔준다. 표준 서블릿을 상속받았다.

확장자를 jsp써서 상속받기

*.st1을 받아서 상속받기

 

a.jsp

a_jsp.java

a_jsp.clas

 

1. 인스턴스화 할 수 없다.

WAS마다 클래스명에 대한 명명규칙이 다르다.->인스턴스화할때 클래스 명이 달라진다. 클래스명 모르니까 인스턴스화 불가능하다.

A a= new A();

a_jsp a= new a_jsp();

 

WAS가 많나요>?

웹스피어

웹로직

제우스

JBOSS

....

Tomcat

 

엄청많다. 톰캣은 대용량에 부적합하다. 터진다.

요청하면 3초 이상 걸린다. 성능이 안좋다.

근데 왜 이거쓰지? 공짜니까...ㅎ

 

2. 스코프가 없다.

 

스코프

-page

: pageContext -그 페이지 안에서만 유지됨

예를 들어 화면이 넘어갈때마다 로그인해야된다...? 말도안됨...쓸모가 없다.

-request

:요청이 유지되는 동안에 url이 안바뀜 haha.st1(request)->crudTest.jsp(request) 같다.

-session

:시간을 지배한다.

장바구니는 쿠키에 저장된다. 문자열로 클라이언트에 저장된다. 그런데 시간을 지정할 수있다. 3일동안 최근본 상품 기억하기 등등

문자열이라서 리스트나 맵을 담을 수 없다.

VO랑 벡터 못담는다.

 

-application

:죽지 않아 -WAS(web application server)

 

스코프의 네가지는 저장소이다.

setAttribute

getAttribute

셋으로 넣고 겟으로 꺼낸다.

 

/*
 * 모델 (Model=>XXXLogic+XXXDao)계층클래스 설계 부분
 * 넓은 의미로 보면 Dao(Data Access Object)도 모델 계층의 일부임
 * 오라클 서버와 직접적인 연동은 XXXDao클래스에게 전담시킴
 * 왜냐하면 마이바티스와 같은 orm솔루션과 연계하려면 독립된 클래스로 설계하는것이 유리함
 * 또다른 이유로는 Hibernate와 같은 또다른 솔루션으로 커스터마이징하거나 리펙토링시에 

 * 독립적인 클래스 구성이 재조립시 편하기 때문임
 * XXXLogic클래스는 업무에 대한 판단, 결정, 선택을 하는 계층에 해당됨
 * 주로 이런 결정권을 가진 자는 팀장, 과장, 차장, 부장임
 * 공통됨 관심사를 분리하기위한 목적으로도 로직 클래스 분리는 꼭 필요한 부분임
 * 예를들면 트렌젝션 처리를 코드가 아닌 시스템레벨에서 자동으로 제어하려면
 * 서비스 계층에 해당되는 클래스는 반드시 분리할 수 있는 독립된 클래스이어야함
 * 여기서 여러가지의 Dao클래스의 메소드가 다중으로 호출되게 됨에 따라 커밋이나 롤백의 대상이 되는 경우임
 * 
 * 
 * */

 

POJO로 게시판 만들기

 

 

MyBatis

자바 언어를 위한 ORM(Object-Relational Mapping) 프레임워크 중 하나입니다.

ORM은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터를 변환하고 매핑하는 것을 도와줍니다. 즉, ORM은 객체 지향 언어의 객체와 관계형 데이터베이스의 테이블 간의 매핑을 자동화하고 이를 통해 데이터베이스에 대한 작업을 쉽게 만들어줍니다.

MyBatis는 SQL 쿼리를 작성하고 실행하기 위한 방법을 제공합니다. 이를 위해 MyBatis는 XML 파일 또는 어노테이션을 사용하여 SQL 매핑을 정의합니다. 이러한 매핑을 통해 MyBatis는 데이터베이스에서 데이터를 읽고 쓰는데 필요한 SQL 코드를 생성합니다.

MyBatis는 간단하고 직관적인 구조를 가지며, SQL 쿼리를 직접 작성할 수 있기 때문에 개발자가 더 세밀한 조정이 필요한 경우에도 자유롭게 사용할 수 있습니다. 또한 MyBatis는 JDBC(Java Database Connectivity)를 사용하기 때문에 대부분의 데이터베이스와 호환됩니다.

 

SqlSessionFactory

MyBatis에서 데이터베이스와의 연결을 관리하는 인터페이스입니다.

SqlSessionFactory는 SqlSession을 생성하는 역할을 합니다. SqlSession은 MyBatis에서 실제 데이터베이스와 상호 작용하기 위한 인터페이스입니다.

 

SqlSession을 사용하여 SQL 쿼리를 실행하고, 커밋 또는 롤백을 수행하며, 데이터베이스 연결을 닫습니다.

 

SqlSessionFactory는 MyBatis의 구성 파일을 로드하고, 데이터베이스 연결을 설정하는 데 사용됩니다. MyBatis의 구성 파일에는 데이터베이스 연결 정보, 매퍼 파일 위치, 트랜잭션 관리 등 다양한 설정 정보가 포함될 수 있습니다. SqlSessionFactory는 이러한 설정 정보를 읽어들이고, 이를 기반으로 SqlSession을 생성합니다.

SqlSessionFactory는 일반적으로 애플리케이션 전체에서 공유되어 사용됩니다. 따라서 SqlSessionFactory는 스레드 안전(thread-safe)하게 설계되어야 하며, 애플리케이션에서 한 번만 생성되고 관리되어야 합니다. 이를 통해 MyBatis 애플리케이션의 성능을 향상시킬 수 있습니다.

 

MyBatis에서는 SQL 매핑 정보를 정의하기 위해 XML 파일을 사용합니다.

 

이 XML 파일은 데이터베이스와 관련된 쿼리를 작성하고, 매개변수를 설정하고, 결과 매핑을 정의하는 등의 작업을 수행합니다.

 

일반적으로 MyBatis에서 매퍼(mapper) 파일이라고 불리는 이 XML 파일에는 SQL 쿼리를 포함하고 있으며, 이 쿼리는 데이터베이스에 직접 전달됩니다. 매퍼 파일은 SqlSessionFactory가 사용하는 리소스 중 하나입니다.

매퍼 파일에서는 SQL 쿼리를 작성할 수 있으며, 파라미터와 결과 매핑을 설정할 수 있습니다. 예를 들어, 매퍼 파일에서는 SELECT, INSERT, UPDATE, DELETE 등의 SQL 쿼리를 작성할 수 있습니다. 또한 매퍼 파일에서는 매개변수와 결과 매핑을 설정하여 SQL 쿼리의 입력값과 결과값을 자동으로 매핑할 수 있습니다.

따라서, MyBatis에서 XML 파일은 SQL 매핑 정보를 정의하는 중요한 역할을 합니다. XML 파일을 사용하여 SQL 쿼리를 작성하고, 매개변수와 결과 매핑을 설정하여 데이터베이스와 상호 작용하는 MyBatis 애플리케이션을 구현할 수 있습니다.

 

select

insert

update

delete

int타입이다.

되고 안되고 두개밖에 없기 때문이다.

DML

insert("id", parameter);

파라미터는 마이바티스에서는 Object타입이다.

 

스프링에서 제공할때 사용되는 어노테이션이 controller이다.

제이슨에서 제공해주는 어노테이션은 @restController

어노테이션을 쓰는것 만으로도 컨트롤 계층이다.

 

스프링 부트를 단독으로 쓰지않는다. 리액트나 뷰제이에스나 이지유아이같은 것들을 이용해서 서비스를 개발하는 경우가 대부분이다.

 

doGet                  
doPost                  
                   
step1                  
글목록 조회 board getBoardList              
    jsongetBoardList              
글입력   boardInsert              
글수정   boardUpdate              
글삭제   boardDelete              

 

 

Hook은

소프트웨어 개발에서 어떤 이벤트나 작업이 발생할 때, 그것에 대한 반응이나 처리를 추가하거나 변경하는 기능을 말합니다. Hook은 이벤트 핸들러(event handler) 또는 콜백(callback)과 비슷한 개념으로 사용됩니다.

일반적으로 Hook은 코드를 수정하지 않고도 기존의 소프트웨어에 새로운 동작을 추가하거나 변경할 수 있습니다. 이를 통해 소프트웨어의 기능을 확장하거나, 문제를 해결하거나, 특정 작업을 수행하기 위한 훅을 추가할 수 있습니다.

Hook은 다양한 소프트웨어에서 사용됩니다. 예를 들어, 버그 추적 시스템에서는 Hook을 사용하여 버그 보고서를 자동으로 생성하거나, 이메일을 보내거나, 다른 시스템으로 알림을 보내는 등의 작업을 수행할 수 있습니다. 또한, 버전 관리 시스템에서는 Hook을 사용하여 커밋(commit)을 검증하거나, 특정 이벤트가 발생했을 때 스크립트를 실행하는 등의 작업을 수행할 수 있습니다.

 

stateHook과 effectHook은 너무너무 중요하다!!

 

자바스크립트에서 대괄호는 배열이다.

23번을 풀어서 쓰면 26~29이다.

 

use가 붙은것은 모두 16.8부터 지원되는 리액트 훅입니다.

useState는 서로 독립적이고 무엇이든 담을 수 있다.

차이점은 값이 바뀌는것을 바로바로 인지할 수 있다.->동기화

 

왜 중요할까?

컴포넌트 상태는 컴포넌트가 그려지는 렌더링 되는 주기와 관련이 있기 때문이다.

리액트의 핵심은 리 랜더링이다.

모든 장점이 여기에 있다.

 

 

문제?!

//화면을 새로고침 했을때 이전에 입력한 키워드를 기억해줄래?

새로고침을 누르면 입력값 사라진다.

새로고침해도 로컬스토리지에 남아있다.

window.localStorage.setItem('keyword',event.target.value)

 

 

댓글