[Spring]필기
[Dispatcher-Servlet(디스패처 서블릿)]
-> HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)
클라이언트로부터 어떠한 요청이 오면 톰캣과 같은 서블릿 컨테이너가 요청을 받게 됨. 그리고 이 모든 요청을 프론트 컨트롤러인 디스패처 서블릿이 가장 먼저 받게 됨. 디스패처 서블릿은 공통적인 작업을 먼저 처리한 후 해당 요청을 처리해야하는 컨트롤러를 찾아서 작업을 위임한다.
* Front Controller(프론트 컨트롤러) : 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러, MVC 구조에서 함께 사용되는 디자인 패턴
스프링 MVC 프로젝트 구조
https://engkimbs.tistory.com/688
스프링 동작 방식
web.xml -> root-context.xml -> servelt-context.xml -> HomeController.java -> home.jsp -> web.xml
root-context.xml -> db관련 소스가 적혀있음
부트스트랩, css는 resources 폴더에!
Model -> 데이터 저장소, 애플리케이션의 정보, 데이터를 나타냄
데이터를 뷰로 보내야해요~ -> Model을 사용하면됨 (Model model)
<beans:property name="prefix" value="/WEB-INF/views/" /> => 접두사("/WEB-INF/views/")
<beans:property name="suffix" value=".jsp" /> => 접미어(".jsp")
라이브러리추가는 </dependency></dependencies>사이에 추가
메이븐저장소에서 spring-jdbc 검색해서 버전에 맞게(4.3.14) 추가
AOP(관점지향) - 핵심적인 관심 사항과 공통 관심 사항으로 분리시키고 각각을 모듈화하는 것을 의미 / 공통기능을 수행하기 위해 작성
JUnit Test를 사용하려면 데이터베이스가 연결되었는지 확인해야함
el은 ${} 마이바티스는 #{}
데이터 처리
1) 파라미터(변수)
2) Bean Class 설정
3) Map<String, Object> -> 얘 자주 씀
================================================================================
emp테이블 조회
Controller :/empCount -> service -> 결과를 Model(cnt)저장 -> view(home)
- Service(interface)
- DAO(interface)
- Mybatis
- DataSource
=> view(*.jsp)
=============================================
* 리다이렉트 사용할때 안할때
리다이렉트 : 서버의 DB변화가 생기는 작업일때 사용하는 것
포워드 : 특정주소에 공개하고 싶지않은 정보를 가려서 사용하거나 조회할때 사용
=============================================
GET / POST ==> HTTP 전송 방식의 타입
* http 요청 방식 : 클라이언트 -> 서버 ==> 이걸 보낼때 대표적인 전송방식이 GET, POST
GET
- select 기능면에서 우수
- 캐시가 남아있어 보안적인 측면에서 좋지 않음
- 전송 속도가 우수하고 파라미터가 url에 노출된다
POST
- create, update, delete에 사용
- 캐시가 남지않아 보안적인 측면에서 우수
- 요청 시 Request Body에 데이터가 들어가기 때문에 파라미터 노출이 되지 않음
=> GET(read) select할 때 쓰는 것이 적당 / 서버에 데이터를 가져와 보여주기 위함
POST(create) insert, update, delete할때 쓰는것이 적당 / 서버의 값, 상태를 바꾸기 위함
==============================================
[최후의 정리]-요거는 기억하자!!!
DTO
- 계층간의 데이터 교환을 목적으로 한 객체(자바 빈)
- 주로 데이터 수집의 용도가 좀 더 강하다. (ex) 로그인 정보)
- 로직을 갖고있지 않는 순수한 데이터 객체이며, getter/setter 메소드만 갖는다.
VO
- DTO와 혼용되어 동일하게 사용이 되기도 하지만,
DTO와의 차이점으로는 Read Only의 목적이 강하고, 불변의 객체로 특정한 값을 나타내는 객체이다.
로직을 포함할 수 있다(getter만 존재)
Entity
- Entity 클래스는 실제 DB의 테이블과 1:1로 맵핑 되는 클래스이다.
==============================================
<select> 태그의 id 속성의 값은 메서드의 이름과 동일하게 맞춰야 합니다.
<select> 태그의 경우 resultType 속성을 가지는데, 이 값은 인터페이스에 선언된 메서드의 리턴 타입과 동일하게 작성합니다.
==============================================
resultType : 조회(select) 결과 값을 저장하기 위한 데이터 타입(데이터 하나에 대한 타입 지정) / 반환값
parameterType : 전달받은 파라미터 데이터 타입 지정(선택적) / 요청값
파라미터 타입이 String인 경우
-> 리턴타입이 String일때 리턴 값 redirect: 또는 forward:로 페이지 이동
* 서버의 DB변화가 생기는 작업일때 사용하는것이 redirect이다.
* forward는 특정주소에 공개하고싶지않은 정보를 가려서 사용하거나 조회할때 사용한다.
파라미터 타입이 객체인 경우
model 객체(스프링 mvc에서 제공해주는 객체)
model 객체는 객체를 저장해서 뷰페이지로 전달!
model 객체 생성 방법 두가지
1. 키와 값 쌍으로 전달 -> model.addAttribute("vo", vo);
2. 키 없이 객체만 전달 -> model.addAttribute(vo);
=> 키 없이 객체만 전달한 경우, 받을 때는 클래스 첫 글자를 소문자 변경해서 el표현식${}으로 호출해야함
스프링은 매개 변수의 이름과 파라미터의 이름이 서로 같으면 기본적으로 파라미터 값을 매개변수의 파라미터에 값을 설정한다.
==============================================
@RequestMapping(value="~~", method=RequestMethod.GET) = @GetMapping(value="~~")
@RequestMapping(value="~~", method=RequestMethod.POST) = @PostMapping(value="~~")
같은 효과
@RequestParam
=> 사용자가 전달하는 값을 1:1로 매핑해주는 어노테이션
보통 파라미터를 통해 값을 전달할 때 자주 사용한다.
HttpServletRequest 객체와 같은 역할을 한다.
@RequestParam("가져올 데이터의 이름")[데이터타입][가져온데이터를 담을 변수]
Model 객체를 이용해서, 뷰로 값을 넘겨준다.
ex)(@RequestParam("reno")int reno, Model model)
* 파라미터의 변수명과 저장 변수명이 동일하면, 파라미터 이름과 어노테이션을 생략하고도 받을 수 있음
@RequestParam Map<String, Object> map
=> 파라미터 값들을 Map으로 받는다.
Map<String, Object>를 Map<String, String>으로 변환해도 괜찮음
==============================================
오류 원인 정리
404 맵핑오류, 경로(잘못된 URL 호출)
400, 403, 405 뷰 페이지 오류
데이터가 안실어졌을때도 400오류가 뜸
500 대소문자, 공백 오류
==============================================
[인터셉터]
- 컨트롤러 실행전과 후에 필터처리
- 전pull 후post
- servlet-context.xml에 동작을 먼저 시켜서 해당 클래스를 호출함
- 회원전용게시판을 설정해보자(board/*)
ex) AuthenticationInterceptor
==============================================
https://engkimbs.tistory.com/746
AOP(관점지향) - 핵심적인 관심 사항과 공통 관심 사항으로 분리시키고 각각을 모듈화하는 것을 의미
- 공통기능을 수행하기 위해 작성
- 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 의미이다.
* AOP에서의 모듈화 : 코드들을 부분적으로 나누어서 모듈화하겠다.
* 핵심적인 관점 - 우리가 적용하고자 하는 핵심 비즈니스 로직
/부가적인 관점 - 핵심 로직을 실행하기 위해서 행해지는 DB연결, 로깅, 파일 입출력 등..
[AOP 주요 개념]
Aspect - 흩어진 관심사를 모듈화 한 것, 주로 부가 기능을 모듈화함
Target - Aspect를 적용하는 곳(클래스, 메서드)
Advice - 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
JoinPoint - Advice가 적용될 위치, 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능
PointCut - JoinPoint의 상세한 스펙을 정의한 것.
==============================================
HandlerInterceptor
- URI 요청, 응답 시점을 가로채서 전/후 처리를 하는 역할
- Interceptor 시점에서 Spring Context와 Bean에 접근할 수 있다.
- (AOP에서) Logging, transaction 처리 등 중복 코드가 발생할 경우 중복을 줄이기 위해 사용
==============================================
(..) 클래스안에 포함되어있는 모든 메소드란 뜻
==============================================
JavaScript에서 이벤트 전파를 중단하는 방법
event.preventDefault() 현재 이벤트의 기본 동작을 중단한다.
람다식 자체가 수식이기 때문에 함수 이름은 필요없음.
function 키워드대신 '=>'을 씀
asp, php, jsp -> 파일 이름으로 링크
프레임워크만 매핑으로 처리함
javascript 변수 선언 방법 => const 고정값, var let 다 똑같음
==============================================
ajax : 자바스크립트를 사용한 비동기 통신
- 브라우저가 가지고있는 XMLHttpRequest 객체를 이용해서 전체 페이지를 새로 고치지 않고 페이지의 일부만을 로드하는 기법(페이지 새로고침 없이 서버에 요청)
- 서버로부터 데이터를 받고 작업을 수행 => 해당 부분만 바뀜(서버로 데이터를 주고 받고)
전에 필기해둔거!