URL로 서버에 요쳥을 보내면 HttpServeltRequest
가 객체를 만든 후 매개변수로 전달한다.
@Controller
public class RequestInfo{
@RequestMapping("/requestInfo")
public vovid main(HttpServletRequest request){
// 응답시 처리할 동작
}
}
http://52.78.79.190:8080/ch2/requestInfo?year=2021&month=10&day=1
getRequestURL()
: http://52.78.79.190:8080/ch2/requestInfo
getRequestURI()
: /ch2/requestInfo
getQueryString()
: ?year=2021&month=10&day=1
클라이언트 client : 서비스를 요청하는 애플리케이션
서버 server : 서비스(service)를 제공하는 애플리케이션
톰캣설치경로/conf/server.xml : Tomcat서버 설정 파일
톰캣설치경로/conf/web.xml : Tomcat의 모든 web app의 공통 설정
웹앱이름/WEB-INF/web.xml : web app의 개별 설정
=> 인텔리제이의 경우 톰캣설치경로가 아닌 프로젝트 경로 아래에 위치함.
Hyper Text Transfer Protocol
텍스트 기반의 프로토콜. 단순하고 일기 쉽다.
GET | POST |
---|---|
서버의 리소스를 가져오기 위해 설계됨 | 서버에 데이터를 올리기 위해 설계됨 |
QUERY STRING을 통해 데이터 전달(소용량) | 전송 데이터 크기에 제한이 없음(대용량 가능) |
URL에 데이터가 유출되어 보안에 취약 | 데이터를 요청 메시지의 body에 담아 전송 |
데이터 공유에 유리 | 보안에 유리, 데이터 공유는 불리 |
ex) 검색엔진의 검색단어 전송 | ex) 게시판 글쓰기, 로그인, 회원가입 |
GET, POST 외에도 PUT, PATCH, DELETE 등의 요청이 있음.
요청 시 코드에 따른
상태코드 | 의미 |
---|---|
1xx | Informational (거의 쓰이지 않음) |
2xx | Success 성공 |
3xx | Redirect 다른 URL로 요청필요 |
4xx | Client Error |
5xx | Server Error |
=> TextEditor로 열었을때 알아볼 수 없으면 바이너리 파일
바이너리 데이터를 텍스트 데이터로 변환할 때 사용.
64진법은 '0'~'9', 'A'~'Z', 'a'~'z', '+', '/' 모두 64개 문자(6bit)로 구성됨.
Base64를 사용하면 이미지를 텍스트 형태로 표현할 수 있음.
출처: https://en.wikipedia.org/wiki/Base64
OOP 5대 설계원칙: SOLID
분리의 구분
1) 관심사의 분리
2) 변하는 것과 변하지 않는 것의 분리
3) 공통코드의 분리
출처: https://developer.mozilla.org/ko/docs/Glossary/MVC
서블릿은 기본적으로 하나의 인스턴스를 사용하므로 싱글톤 패턴을 사용.
JSP는 HTML문서에 Java코드를 넣은 것.
서블릿과 spring 모두 싱글톤인것은 동일하지만 서블릿은 요청이 올때 객체를 만드므로 lazy-init, spring은 요청이 오지 않아도 객체를 생성해두므로 early-init이라는 차이가 있음.(spring에서 서블릿의 단점을 개선한 것)
생성없이 사용할 수 있는 객체.(request, response, session, out 객체 등)
HTTP는 상태정보를 저장하지 않으므로 저장소가 필요함.
기본객체 | 유효범위 | 설명 |
---|---|---|
pageContext | 1개 JSP페이지 | JSP페이지의 시작부터 끝까지. 해당 JSP내부에서만 접근가능. 페이지당 1개. |
request | 1개 이상의 JSP페이지 | 요청의 시작부터 응답까지. 다른 JSP로 전달가능. 요청마다 1개. |
session | n개 JSP페이지 | session의 시작부터 종료까지(로그인~로그아웃). 클라이언트마다 1개. |
application | context 전체 | WebApplication의 시작부터 종료까지. context내부 어디서나 접근가능. 모든 클라이언트가 공유. context마다 1개. |
pageContext
: 지역변수(lv)를 EL에서 사용하려면 한 페이지내에서 변수를 공유할 수 있게 pageContext
라는 저장소를 만들어 저장해야 함. 해당 페이지 내에서만 공유가 가능.application
: 전체에서 접근가능한 저장소.session
: 사용이 편리하지만 클라이언트마다 하나씩 객체를 만들기때문에 저장소 중 서버의 부담이 가장 큼. 최소한의 데이터만 담도록 권장.request
: 요청이 처리되는 동안만 유지되는 객체. 서버에 부담이 가장 적음. 되도록 다른 페이지에 정보를 전달할 경우 request객체를 사용할것을 권장.둘 다 JSP를 더 짧고 편리하게 사용하기 위해 고안됨.
EL은 하나의 객체에서 값을 꺼낼때마다 일일히 aa.get메서드().get메서드() 처럼 접근하던 것을 aa.속성명.속성명 형식으로 접근할 수 있어 코드단축에 효과적.
단, 객체를 저장할 수 없어 request등의 저장소를 따로 사용해야 함.
JSTL은 if문 등의 구조를 JSP에서 더 가시성이 좋고 사용하기 편하도록 하기 위해 사용함.
태그 사용.
공통적인 요청 전처리와 응답 후 후처리에 사용.
예시 : 로깅, 인코딩 등
요청의 파라미터를 연결할 매개변수에 붙이는 어노테이션.
@RequestMapping("/requestParam2")
public String main2(@RequestParam(required=true) int year) {...}
required
: 해당 필드가 쿼리스트링에 존재하지 않을 때 오류로 처리할 것인지 설정하는 속성. true
일 경우 필수입력, false
일 경우 필수입력이 아니지만 필수가 아닐 경우 때에 따라 defaultValue
속성을 이용해 기본값을 지정해줄 필요가 있다.
쿼리 스트링 등의 에러 발생 시 에러페이지가 아닌 지정한 페이지를 뜨게 하는 등 에러핸들링에 사용하는 어노테이션.
@ExceptionHandeler(Exception.class)
public String catcher(Exception ex){
ex.printStackTrace();
return "yoilError";
}
=> 에러 발생 시 yoilError.jsp페이지가 뜨도록 해줌
적용 대상을 Model의 속성으로 자동 추가해주는 어노테이션.
반환 타입 또는 컨트롤러 메서드 매개변수에 적용가능.
@RequestMapping("/getYoilMVC5")
public String main(@ModelAttribute("myDate") MyDate, Model m) {...}
=> "myDate"는 속성의 키값으로, 생략이 가능하며 생략 시 속성명의 맨 첫글자를 소문자로 바꾼 이름의 키를 자동으로 지정한다.
또한 @ModelAttribute
어노테이션 자체도 생략가능.
매개변수의 자료형에 따라 생략 시 자동으로 설정되는 어노테이션이 다르다.
검증오류가 발생할 경우 오류 내역을 저장하는 객체
이때 BindingResult
객체는 반드시 @ModelAttribute
객체 뒤에 위치해야 함에 주의.
참고링크 - Validation 간단 정리 - 1 (BindingResult, Validator)
@RequestMapping
대신 @Getmapping
, @Postmapping
사용 가능.
맵핑한 URL이 같을 경우 원래는 오류가 나지만 전송방식이 다를 경우 오류발생x.
@Getmapping("지정url")
시 지정한 경로로 들어온 요청을 Get방식으로 처리하는 어노테이션.
@Postmapping("지정url")
시 지정한 경로로 들어온 요청을 Post방식으로 처리하는 어노테이션.
맵핑될 URL의 공통부분을 @RequestMapping
으로 클래스에 적용.
@Controller
@RequestMapping("/register")
public class RegisterConroller {...}
=> 이 클래스 내의 URL맵핑값의 맨앞에 /register
를 붙여준다는 의미.