GitHub

https://github.com/Choidongjun0830

Spring 78

스프링 인터셉터

스프링 인터셉터 스프링 인터셉터는 서블릿 필터와 비슷한 기능을 제공하지만 훨씬 더 많은 기능을 제공한다 스프링 인터셉터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 호출됨. 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다. 스프링 MVC의 시작점이 디스패처 서블릿이다. 스프링 인터셉터 제한 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 //로그인 사용자 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터(적절하지 않은 요청이라 판단, 컨트롤러 호출X) //비 로그인 사용 스프링 인터셉터 체인 H..

Spring 2024.01.09

서블릿 필터

서블릿 필터 현재는 로그인하지 않은 사용자도 /items나 /item/{id}에 들어가면 수정이 가능하고 삭제도 가능하다. 이를 막으려면 서블릿 필터를 사용해야 한다. 필터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 필터를 적용하면 필터가 호출된 다음에 서블릿이 호출된다. 그래서 모든 고객의 요청 로그를 남기는 요구사항이 있다면 필터를 사용하면 된다. 여기서 서블릿은 스프링의 디스패처 서블릿으로 생각하면 된다. 필터는 수문장 역할!! 필터는 특정 URL 패턴에 적용할 수 있다. 필터 제한 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 //로그인 사용자 HTTP 요청 -> WAS -> 필터(적절하지 않은 요청이라 판단, 서블릿 호출X) //비로그인 사용자 필터 ..

Spring 2024.01.09

쿠키와 세션

쿠키의 보안 문제 쿠키에 memberId를 넣어서 사용하면 보안상의 문제가 있을 수 있다. 해커가 memberId를 바꾸어 다른 유저의 정보를 빼가거나 조작할 수 있다. 이를 막기 위해서는 쿠키에는 유저의 중요한 정보가 담겨 있으면 안되고, 쿠키에 사용되는 id가 시간이 지나면 사용할 수 없도록 만료되어야 한다. 그래서 세션 저장소를 이용해 UUID라는 예측할 수없는 id를 저장하여 사용해야 한다. 이렇게 만든 id를 쿠키에 담아 사용하면, 쿠키에는 유저의 중요한 정보가 담기지 않고, 예측할 수도 없다. 세션 세션 관리가 제공해야 하는 기능 세션 생성 sessionId 생성 (임의의 추정 불가능한 랜덤 값) 세션 저장소에 sessionId와 보관할 값 저장 sessionId로 응답 쿠키를 생성해서 클라이..

Spring 2024.01.08

검증2 - Bean Validation

앞에서 검증1에서 한 것을 검증 Annotation을 이용하여 간단하게 할 수 있는 방식이다. @Data public class Item { private Long id; @NotBlank private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; @NotNull @Max(9999) private Integer quantity; ... @PostMapping("/add") public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) { ..

Spring 2024.01.06

검증1-Validation

웹에서 입력받을 때 입력받은 값이 내가 원하는, 유효한 값인지 확인하고 원하는 값이 아니라면 사용자에게 알리는 방법. public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) { if(!StringUtils.hasText(item.getItemName())) { //itemName에 글자가 없으면 bindingResult.addError(new FieldError("item", "itemName", "상품 이름은 필수입니다.")); } ... //특정 필드가 아닌 복합 룰 검증 if(item.getPrice() != null && item.getQua..

Spring 2024.01.04

메시지, 국제화

message.properties파일에 hello=안녕 hello.name=안녕 {0} label.item=상품 label.item.id=상품 ID label.item.itemName=상품명 label.item.price=가격 label.item.quantity=수량 page.items=상품 목록 page.item=상품 상세 page.addItem=상품 등록 page.updateItem=상품 수정 button.save=저장 button.cancel=취소 이와 같이 적고 html 파일에는 상품명 이처럼 #을 이용하여 변수명을 넣어주면 알아서 상품명을 넣어준다. 만약 영어권에서 접속을 했다면 message_en.properties에 적힌 대로 스프링부트가 알아서 바꾸어준다.

Spring 2024.01.01

thymeleaf-1

상품명 ... html의 checkbox는 체크를 하지않으면 null이 되는 문제 발생. 체크를 하지않으면 아예 데이터를 넘기지 않음. 수정의 경우에 체크박스를 해제하고 넘기면 아무런 값을 넘기지 않기 때문에 수정이 되지 않을 수 있다. 판매 오픈 체크를 해제한 경우 _open만 전송되는데, 이 경우 스프링 MVC는 _open만 있는 것을 확인하 체크를 해제했다고 판단한다. 그러면 null이 아니라 False로 찍힌다. thymeleaf에서 판매 오픈 th:field="*{open}"을 추가하면 thymeleaf에서 _open 자동생성. 위와 동일한 결과! @ModelAttribute("regions") public Map regions() { Map regions = new LinkedHashMap()..

Spring 2023.12.31

로깅

운영 시스템에서는 System.out.println() 같은 시스템 콘솔을 사용해서 필요한 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해서 로그를 출력한다. 로깅 라이브러리 스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리( spring-boot-starter-logging )가 함께 포함된다 @RestController public class LogTestController { private final Logger log = LoggerFactory.getLogger(getClass()); @RequestMapping("/log-test") public String logTest() { String name = "Spring"; log.trace("trace log={}", nam..

Spring 2023.12.24

Spring MVC-2

@Controller public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form") public ModelAndView process() { return new ModelAndView("new-form"); } } @Controller : 스프링이 자동으로 스프링 빈으로 등록한다. (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 됨), 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다(RequestMappingHandlerMapping에서 ). @RequestMapping : 요청 정보를 매핑한다. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기..

Spring 2023.12.24

MVC 프레임워크 / Spring MVC-1

FrontController 패턴 특징 ㆍ프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음 ㆍ 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출 ㆍ 입구를 하나로! ㆍ 공통 처리 가능 ㆍ 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨 => 불필요한 반복이 줄어듦 Spring MVC에서는 Front Controller가 Dispatcher Servlet임 요청 흐름 ㆍ 서블릿이 호출되면 HttpServlet 이 제공하는 serivce() 가 호출된다. ㆍ 스프링 MVC는 DispatcherServlet 의 부모인 FrameworkServlet 에서 service() 를 오버라이드 해두었다. ㆍ FrameworkServlet.service() 를 시작으로 여러 메서드가 호출..

Spring 2023.12.21
728x90