2023.04.11 53일차 JSP & SpringBoot
53일차
서블릿 앞에서 요청을 받아서 어떤일을 할수 있다.
직접 작성할일은 거의 없다.
서블릿에게 요청을 보냇을땨 그 앞에서 먼저 받는 것이 있다.
서블릿에게 요청을 걸러준다. '필터'이다.
19.1 필터
9버전을 이용해서 만들것이다.
용어만 알기 위해서 하는것이다.
fileter를 만들면 httpfilter를 상속받는다.
요청이 오면 필터가 일하고 일끝내면 다음 일해야하는 곳으로 요청을 넘겨준다.
필터체인에다가 request를 건네주면 알아서 일해야하는곳으로 전해준다.
다음 서블릿은 일시키기전에 자기 일을 해야한다. dofilter가 실행되기전 작성하면된다.
필터가 일하게 하려면 요청이 와야 일을 한다.
요청은 어디로 어떤 방법으로 이루어져잇다. 웹필터 어노테이션의 경로로 명시하면된다.
필터가 알아서 일을 하고나서 dofilter메소드로 다음 서블릿을 부르게 된다.
chain이후에 작성하면 응답후에도 필터가 작용하게 된다.
@WebFilter("/lec/sample14")
public class Filter02 extends HttpFilter implements Filter {
public Filter02() {
super();
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("필터02 일함@@@@@");
// pass the request along the filter chain
chain.doFilter(request, response);
// 응답시 해야하는 일
System.out.println("필터02 응답@@@@@");
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
@WebServlet("/lec/sample14")
public class Servlet14 extends HttpServlet {
private static final long serialVersionUID = 1L;
public Servlet14() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1
// 2
// 3
// 4
System.out.println("서블릿14");
response.getWriter().println("14th servlet is working!!!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
19.2 여러 필터 매핑
같은 이름으로 매핑을 하면 하나의 서블릿에 필터를 여러개 설정할 수도 있다.
doFilter가 일할때 세개의 파라미터가 온다.
톰캣이 어떤 필터와 서블릿이 일해야하는지 미리 체인에 걸어둔것이다.
다음필터 또는 서블릿 다음필터 또는 서블릿이 일하게 되는 것이다.
필터1->필터2->서블릿->필터2->필터1의 순서로 일어나게 된다.
어노테이션에서 경로에 맞춰 서 하는게 아니라 필터이름을 맞추고 web.xml에서 매핑을 해줄 수 있다.
이렇게 이름을 지정하면 web.xml을 통해서 순서를 지정할 수 있다.
@WebServlet("/lec/sample18")
public class Servlet18 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("서블릿18");
response.getWriter().println("18th servlet is working!!!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
@WebFilter(filterName = "/Filter09")
public class Filter09 extends HttpFilter implements Filter {
public Filter09() {
super();
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("필터09 일함@@@@@");
chain.doFilter(request, response);
System.out.println("필터09 응답후 일함@@@@@");
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
@WebFilter(filterName = "Filter10")
public class Filter10 extends HttpFilter implements Filter {
public Filter10() {
super();
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
System.out.println("필터10 일함@@@@@");
chain.doFilter(request, response);
System.out.println("필터10 응답후 일함@@@@@");
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
<filter-mapping>
<filter-name>Filter10</filter-name>
<url-pattern>/lec/sample18</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Filter09</filter-name>
<url-pattern>/lec/sample18</url-pattern>
</filter-mapping>
19.3 여러경로 필터
지금까지는 특정필터가 하나의 경로에만 매칭이되엇는데
여러 경로에 매칭을 할 수 있다.
어노테이션의 value가 string배열로 이루어져있다. 그래서 어러개를 배열로 넣으면 여러 서블릿에 필터링을 할 수 있다.
@WebFilter({"lec/sample19", "lec/sample20", "lec/sample21"})
public class Filter11 extends HttpFilter implements Filter {
public Filter11() {
super();
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("필터11 일함@@@@@");
chain.doFilter(request, response);
System.out.println("필터11 응답후 일함@@@@@");
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
19.4 요청 경로 패턴
요청경로 패턴에 따라 필터가 실행되도록할 수 있다.
/lec/sub02/*으로 설정하면 /lec/sub02 밑의 모든 프로그램이 이 필터를 거치게 된다.
@WebFilter("/lec/sub02/*")
public class Filter14 extends HttpFilter implements Filter {
public Filter14() {
super();
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("14번 필터######");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
19.5 web.xml
하나의 필터에 여러 서블릿을 설정하는 방법을 web.xml에 설정하려면 그냥 추가하면된다.
<filter-mapping>
<filter-name>Filter09</filter-name>
<url-pattern>/lec/sample18</url-pattern>
<url-pattern>/lec/sample19</url-pattern>
<url-pattern>/lec/sub03/*</url-pattern>
</filter-mapping>
spring boot
국비 남은 공부 들
spring boot
web
ajax(rest api)
sql(db)
jdbc
mybatis
git github
spring 일부분 배우고 db간다음 spring 돌아와서 배울것임.
1. spring boot
스프링부트 내부에 스프링 프레임워크가 있다.
알면좋겠는데 너무 숨겨져잇어서 공부하기 어렵다.
필요한게 잇다면 설명을 해줄 것이다.
그 아래에 서블릿 기술이 잇는 것이다.
스프링 부트는 굉장히 추상화가 되어있다.
spring start project
type Maven / Packing War로설정해준다.
프로젝트 진행하면서 버전이 업그레이드되면 굳이 하지말고 냅두자.
현재사용중인게 아예없어지면 바꾸는게 낫다.
일단은 3.0.5시작한다.
설정에서 lib에 넣는 필요한 라이브러리들을 설정해주는 것이 있다.
프로젝트에 필요한것들을 넣는 것이다.
일단 기본적으로 서블릿 기반의 spring web과 개발중 편리한 기능을 지원하는 devtool을 넣어주엇다.
2. sql workbench설정
가상컴퓨터에 접근하기 위해 hostname에 가상컴퓨터 ip주소를 넣어주면된다.
연결위해 aws 설정해줘야한다.
보안탭 - 보안 그룹 - 인바운드 규칙 편집
-규칙 추가 - 유형 - mysql/auroara - 소스 anywhere ip v4
-규칙 저장
비밀번호 - aws의 log 사용해서 지정해줌. - waring 뜨면 잘된거임
3. boot 프로젝트
웹어플리케이션이 어떻게 동작하는지 알아보자.
Boot2023Application / ServletInitializer 두가지 클래스파일 자동으로 만들어준다.
Boot2023Application 오랜만에 main메소드가 있다.
main메소드가 잇어서 바로 실행시킬수도잇고 톰캣위에서 실행도 가능하다.
run as - spring boot app
내장 톰캣이 잇어서 알아서 시작이 된다.
포트는 8080 contextpath는 없다.
http://localhost:8080/ 으로 접속하면 찾지못한다는 메시지를 준다.
스프링부트가 만든 페이지이다.
컨트롤러 요청 - 모델 - view에서 꺼내서 응답
첫 요청받는게 컨트롤러고 컨트롤러를 만들것이다.
서블릿이 햇엇는데 우리가 만들것이다.
그런데 특정 유형이 잇엇는데 스프링엔 그런게 없다는 것이다.
제약 사항이없고 그냥 클래스를 만들면된다.
3.1 Controller
일단 배우는 단계이니 Controller01이라는 컨트롤러를 만들어보자.
그런데 얘가 컨트롤러이다라는것을 스프링에 알려줘야한다.
이것을 어노테이션으로 알려줘야한다. @Controller어노테이션을 달아줘야한다.
일을 한다는건 우리가 작성한 일을 실행하는 것이다.
특정요청이 왓을때 이 코드가 실행되게 하고 싶다.
요청이 어떤 경로로 get이나 post방식으로 오게 된다.
어떤 요청이 왓을때 이 메소드가 일하도록 해줘야한다.
@RequestMapping어노테이션으로 통해 어느 곳에서 왓을때 일할지를 정해줘야한다.
결론은 @Controller와 @RequestMapping으로 일을 시킬 수 있다.
@Controller
public class Controller01 {
@RequestMapping("/sub1/link1")
public void method01() {
System.out.println("일함!@!@!!@!!@");
}
}
다른곳에서 일하는 것을 만들고 싶다면 또 컨트롤러를 만들필요가 없다.
매번 서블릿을 만들필요가 없고 메소드만 만들면된다.
이런 요청에서 일하는 메소드가 request handler 메소드이다.
@Controller
public class Controller01 {
@RequestMapping("/sub1/link1")
public void method01() {
System.out.println("일함!@!@!!@!!@");
}
@RequestMapping("/sub1/link2")
public void method02() {
System.out.println("/sub1/link2 경로 요청에서 일하는 메소드!!");
}
@RequestMapping("/sub1/link3")
public void method03() {
System.out.println("/sub1/link3 경로 요청에서 일하는 메소드3");
}
}
메소드 이름도 내 마음대로 정할 수 있고 doGET doPost로 지을 필요가 없다.
3.2 Controller 분류
작성하는 메소드들이 보통 관련있는 메소드끼리 모여있는경우가 많다.
경로의 앞부분이 같은경우가 많다.
이때 앞부분을 클래스 레벨로 뺄 수 있다.
@Controller
@RequestMapping("/sub2")
public class Controller02 {
@RequestMapping("/link1")
public void method01() {
System.out.println("/sub2/link1에서 일하는 메소드");
}
@RequestMapping("/link2")
public void method02() {
System.out.println("/sub2/link2에서 일하는 메소드");
}
}
3.3 Controller 연습
/sub3/link1 /sub3/link2에서 각각 일하는 컨트롤러내에 메소드 만들기
공통된 링크 앞부분은 클래스에 명시하자.
1.컨트롤러역할을 하는 것을 어노테이션으로 알려주기
2.실제로 일하는 것을 매핑해주기
/생략도 가능하다.
@Controller
@RequestMapping("sub3")
public class Controller03 {
@RequestMapping("link1")
public void method1() {
System.out.println("/sub3/link1에서 집에가고 싶다는 요청중");
}
@RequestMapping("link2")
public void method2() {
System.out.println("/sub3/link2에서 됐다는 요청중");
}
}
이것을 request handler method, 요청을 다루는 메소드라고 한다.
이것들을 어떻게 작성해야하는지는 spring.io의 공식문서에 있다.
https://spring.io/projects/spring-framework -> learn을 보면 도큐먼트가 잇다.
스프링 프레임워크 위에 부트가 잇는것이기 때문에 스프링 프레임워크의 문서를 보면된다.
Api Doc.는 우리가 자주보던 자바 api와 같은 모양이다.
Reference Doc.은 관련된 메뉴얼이 설명되어있다.
Web Servlet에 들어가서 보면 request hanlder작성할때 어떤게 들어가야하는지 등이 적혀잇다.
RequestMapping 어노테이션은 클래스, 메소드 등등에 붙일 수잇다.
작성할 수 있는 value는 path등이 있다.
Controller 어노테이션은 이름을 붙이는 일을 할 수있다.
3.4 Method Arguments
핸들러 메소드에 파라미터를 넣을 수 있다.
우리가 익숙한 파라미터중에 jakarta.servlet.ServletRequest 가있다.
우리가 사용햇던 서블릿이 하는 역할과 같다.
서블릿에서 reqeust파라미터를 꺼내고 설계하고 attribute추가하고 햇던일들을하면된다.
@Controller
@RequestMapping("sub4")
public class Controller04 {
//method argument(parameter)
//경로 : /sub4/link
@RequestMapping("link")
public void method01(HttpServletRequest request) {
//1. request parametr 수집 / 가공
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println("name: " + name);
System.out.println("age: " + age);
//2. business logic
//3. add attribute
//4. foward/ redirect
}
}
3.4 Method Arguments
request를 꺼내 사용하는 일이 자주 발생하기 때문에 파라미터에 넣지 않고 @RequestParam 어노테이션을 달아주면 request를 사용할 수 있다.
파라미터를 다른 메소드에 파라미터 넣듯이 만들어주고 파라미터에 어노테이션을 달아주는 것이다.
@RequestMapping("link3")
public void method03(@RequestParam("address") String address) throws IOException {
System.out.println("address: " + address);
}
age파라미터를 넣고 /sub4/link4에서 받아서 사용하는 메소드를 만들어보자.
어노테이션안에 있는것이 파라미터로매핑되는 것이기 때문에 변수명이 꼭 같을 필요는 없다.
필요하다면 추가 코드를 통해 변환될 수 있는 형식이라면 파싱을 할 수도 있다.
이것 조차도 파라미터를 변경하면 알아서 파싱해준다.
@RequestMapping("link4")
public void method04(@RequestParam("age") String myage) {
System.out.println("age: " + myage);
int age = Integer.parseInt(myage);
System.out.println("int age: " + age);
}
@RequestMapping("link5")
public void method05(@RequestParam("score") int score) {
System.out.println("score: " + score);
}
2023.04.11
갑자기 스프링 부트를 바로 시작하게 되었다.
기본적인 원리를 알 수 없으니 혼자서 레거시를 공부해보며 원리를 익혀보고자 한다.