web프로젝트 시작

전영덕·2023년 4월 30일
0

Springboot

목록 보기
8/13

day06 새로운 프로젝트 시작

프로젝트 이름 : web
패키지 : com.codingbox

스프링 웹, 타임리프, 롬복 3가지 추가해서 생성하기

알집 다운받은거 워크스페이스로 옮겨주고 알아서 풀기로함
STS들어가서 메뉴 > file > import > import gradle project 해서 프로젝트 만들기

설정하기
application properties[풀잎그림]에서 그전에 있던걸로 복붙하기 한 후에 저장하고 save as UTF-8

static 에다가 index.html만들고 서버 재기동시켜서 나오는것 확인하면 끝

강사님에게 받은 home.html을 templates에다가 넣고
HomeController만들어서 welcome페이지를 만들어 주면 된다.

item 프로젝트에 있던 css폴더 자체를 똑같은 위치의 web프로젝트에다가 복붙해주기.

1. lombok

  • @Getter, @Setter, @ToString, @RequiredArgsConstructor, @EqualsAndHashCode

-> @Data : 위의 모든 것을 담고있는 어노테이션. 근데 실제 배포 할 때는 이게 너무 커서 권장하지 않는다.
개발단계에서만 귀찮으니까 쓰는 것이다.

id : 자바스크립트에서 validation할 때 주로사용
name : 정보를 넘길 때 사용

타임리프에서 이것도 같이 사용하는것을 대신 해줌

addMemberForm.html에서
th:field="*{loginId}"의 뜻은 ${member.loginId} 를 간단하게 표현한 것이다.

2. 로그인 처리하기 - 쿠키(Cookie) 사용

2-1. 쿠키의 종류

  • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
  • 세션 쿠기 : 만료 날짜를 생략하면 브라우저 종료시 까지 유지
  • 쿠키 로그아웃 하는방법
    @PostMapping("/logout")
    public String logout(HttpServletResponse response) {
    expireCookie(response, "memberId");
    return "redirect:/";
    }
    	private void expireCookie(HttpServletResponse response, String cookieName) {
    		Cookie cookie = new Cookie(cookieName, null);
    		cookie.setMaxAge(0);
    		response.addCookie(cookie);
    	}

근데 쿠키로 하는것보다 세션으로 하는것을 권장한다
왜냐하면 쿠키는 사용자에 저장하는 것이고 세션은 서버에 저장하는 것이기 때문에 세션이 좋다
용량이 훨씬 크다

3. session

3-1. session 옵션

  • request.getSession(true);
    세션이 있으면 기존 세션을 반환한다. 세션이 없으면 새로운 세션을 생성해서 반환한다.
  • request.getSession(false);
    세션이 있으면 기존 세션을 반환한다. 세션이 없으면 새로운 세션을 생성하지 않고 null로 반환한다.
  • request.getSession();
    신규 세션을 생성하는 request.getSession(true); 와 동일하다. 즉, true가 디폴트 값이다.

홈 컨트롤러 세션 V2, V3 이상하다.
application properties에서 세션 저장 시간은 간단하게 설정가능한다.

4. 필터

  • HTTP Request -> WAS -> 필터 -> 서블릿 -> 컨트롤러 ->

import javax.servlet.Filter; 상속받아야함 다른거 받으면 안돼

package com.codingbox.web.filter;

import javax.servlet.Filter;

public class LogFilter implements Filter {

}

5. 로직 정리

private static final String[] whitelist = {"/", "/members/add", "/login", "/logout", "/css/*"};

-> 인증 필터를 적용해도 홈, 회원가입, 로그인 화면, css같은 리소스에는 접근할 수 있어야 한다. 이렇게 화이트 리스트 경로는
인증과 무관하게 항상 허용한다. 화이트 리스트를 제외한 나머지 모든 경로에는 인증 체크 로직을 적용한다.

isLoginCheckPath(String requestURI)
-> 화이트 리스트를 제외한 모든 경우에 인증 체크 로직을 적용한다.

httpResponse.sendRedirect("/login?redirectURL="+requestURI);
-> 미인증된 사용자는 로그인 화면으로 리다이렉트 한다. 그런데 로그인 이후에 다시 홈으로 이동해 버리면
원하는 경로를 다시 찾아가야하는 불편함이 있다.
예를 들어 상품 관리 화면을 보려고 했다가, 로그인 화면으로 이동하면, 로그인 이후에 다시 상품 관리 화면으로 들어가는 것이 좋다.

return;
-> 필터를 더이상 진행하지 않는다 라는 뜻의 코드. 이후 필터는 물론 서블릿 컨트롤러가 더는 호출되지 않는다. 앞서 리다이렉트를 사용했기 때문에
리다이렉트 응답으로 적용되고 요청이 끝이 난다.

인터셉트는 내일 배울 것이긴한데 더 중요하며, 기술면접에 자주나오는 내용이다.

----day08
로그인 컨트롤러에서 loginV3 만들기
로그인을 하면 상품등록페이지로 바로뙇나오네
뭐지

#애플리케이션 프로퍼티즈

  • jsesstionId 노출 되지 않도록 설정하기
    server.servlet.session.tracking-modes=cookie

6. 스프링 인터셉터

6-1. 스프링 인터셉터란

  • 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심사항을 효과적으로 해결할 수 있는 기술이다.
  • 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다.
  • 둘 다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 사용 방법이 다르다.
  • 필터보다 인터셉터가 더 디테일한 컨트롤이 가능하다.

6-2. 스프링 인터셉터 흐름

  • HTTP요청 -> WAS -> 필터 -> 서블릿 -> 스프링인터셉터 -> 컨트롤러
  • 필터랑 스프링인터셉터 둘다 있어도 된다. 로그인 된거 여부같은거 어디에서 해도 상관없지만 인터셉터에서하는것을 개발자가 선호하는 듯하다.
  • 스프링 인터셉터는 디스패처서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출된다.
  • 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다.
  • 스프링 MVC의 시작점이 디스패처 서블릿이라고 생각해보면 이해가 될 것이다.
  • 스프링 인터셉터에도 URL패턴을 적용할 수 있는데, 서블릿 URL패턴과는 다르고, 매우 정밀하게 설정할 수 있다.

6-3. 스프링 인터셉터 체인

  • HTTP요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 ->인터셉터2 -> 컨트롤러
  • 스프링 인터셉터는 체인으로 구성되는데, 중간에 인터셉터를 자유롭게 추가할 수 있다. 예를들어 로그를 남기는 인터셉터를 먼저 적용하고, 그 다음에 로그인 여부를 체크하는 인터셉터를 만들 수 있다. 지금까지의 내용을 보면 서블릿 필터와 호출되는 순서만 다르고, 제공하는 기능은 비슷해 보인다.
  • 스프링 인터셉터는 서블릿 필터보다 편리하고, 더 정교하고 다양한 기능을 지원한다.

인터셉터 패키지 만들고 LogInterceptor.java만든다.
LogInterceptor implements HandlerInterceptor

6-4. 스프링 인터셉터 인터페이스

  • 스프링의 인터셉터를 사용하려면 HandlerInterceptor인터페이스를 구현하면 된다.
  • 서블릿 필터의 경우 단순하게 doFilter()하나만 제공된다.
    인터셉터는 컨트롤러 호출 전(preHandle), 호출 후 (postHandle), 요청 완료 이후(afterCompletion)와 같이 단계적으로 잘 세분화 되어있다.

6-5. 정상 흐름

  • preHandle : 컨트롤러 호출 전에 호출된다. preHandle의 응답값이 true이면 다음으로 진행하고, false이면 더는 진행하지 않는다.
    false의 경우 나머지 인터셉터는 물론이고, 핸들러 어댑터도 호출하지 않는다.

  • postHandle : 컨트롤러 호출 후에 호출된다.

  • afterHandle : 뷰가 렌더링 된 이후에 호출된다.

이거각각 만들어준 후에
webConfig.java 만들었다.

6-6. interceptor 경로 (feat./**)

  • /sub1/test1/sub2/test2 : 뭐이런식으로 경로가 계속 붙을 수가 있다.
    그때 이 경로에 상관없이 모든 경로에 대해 추가하고 싶을 때 별(*)을 2개 붙여서 넣어준다.
  • /sub1/test1, /sub1/test2 : /* 1개의 어떠한 경로에 상관없이 사용할 떄는 별 1개 쓴다.
    Webconfig2 작성 다 한후에
    Webconfig 의 @Configuration, @Bean2개 총 3개를 주석처리한다.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/

이렇게 로그파일을 기록해야 쇼핑몰에서 결제 가 2번되었거나했을때 시스템오류인지 사용자가 2번 요청한 건지 등에 대한 기록을 할수 있고 보통 로거 파일을 따로 빼내놓음. 근데 이게 너무 많고 사용자가 많으면 버벅거리는 일이 생길 수가 있고 로그에 대한 경중을 따져야할 수도 있다.

0개의 댓글