Springあるある 썸네일형 리스트형 서블릿 필터의 사용 예시(Feat. Filter) 우선 아래의 그림을 통해 Tomcat WAS를 내장한 Spring MVC에서의 요청/응답 흐름을 이해해 놓자(참고로, 스프링의 시작(스프링 MVC의 시작)은 서블릿, 즉 Dispatcher Servlet이다라는 점을 상기하자)Filter의 특징1] javax에서 제공하는 Servlet 기반 [인터페이스]이다(개발자가 직접 구현체를 만들고 등록해줘야 한다)2] Filter 구현체는 서블릿 컨테이너(스프링 컨테이너x)에 [싱글톤]으로 저장되기에 구현체를 만들 때 stateless하게 구현을해줘야 한다. 3] Filter 인터페이스에는 3가지 메서드가 선언돼 있다( init(), doFilter(), destroy() ).제일 먼저 doFilter()가 호출이 된다. 4] 해당 필터를 적용한 요청 URL을 지.. 더보기 HttpServletRequest VS @SessionAttribute @GetMapping("/")public String homeLoginV3(HttpServletRequest request, Model model){ // 로그인 안 한 사용자(세션id가 없는 사용자)도 홈 화면에 들어 올 수가 있어야 한다 // -> 고로, request.getSession()를 false로 하여 신규 세션이 생성되지 않도록 하여야 한다. HttpSession session = request.getSession(false); if(session == null) return "home"; Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER); if(loginMe.. 더보기 Mock 객체(Feat. Cookie,Session, Mock 객체) public class SessionManager { private static final String SESSION_COOKIE_NAME = "mySessionID"; private Map sessionStore = new HashMap(); /** * 1] 세션 생성 */ public void createSession(Object value, HttpServletResponse response){ //세션 id 생성, 값을 세션에 저장 String sessionId = UUID.randomUUID().toString(); sessionStore.put(sessionId,value); //쿠키 생성 Coo.. 더보기 도메인의 진짜 의미! 도메인이 가장 중요하다.도메인 = 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말함향후 web을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 한다.이렇게 하려면 web은 domain을 알고있지만 domain은 web을 모르도록 설계해야 한다.(domain에서 web의 클래스 등을 사용 및 패키지 등록을 해서는 안 된다는 의미)이것을 web은 domain을 의존하지만, domain은 web을 의존하지 않는다고 표현한다. 예를 들어 web 패키지를 모두 삭제해도 domain에는 전 혀 영향이 없도록 의존관계를 설계하는 것이 중요하다.반대로 이야기하면 domain은 web을 참조하면 안된다. 더보기 [@RequestParam,@ModelAttribute] VS @ResponeBody(Feat.HttpMessageConverter) @RequestParam @ModelAttribute : HttpMessageConverter 작동 x@ResponseBody : HttpMessageConverter 작동 o-> HttpMessageConverter는 @RequestParam, @ModelAttribute와 같이 Http 요청 매개변수를 처리할 때 작동하는 것이아니라 Rest API와 같이 Http 요청의 Body를 객체로 변환할 때 작동한다.(주로, JSON 객체) 또한 @RequestParam,@ModelAttribute는 HTTP 요청이 들어와서 컨트롤러가 호출되기 전에 [타입 오류]가 발생해도 그 오류를 BindingResult 객체에 담아서 컨트롤러를 호출할 수가 있지만, @ResponseBody 같은 경우, 즉 HttpMe.. 더보기 BindingResult의 동작 @PostMapping("/add")public String addItemV2(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { /** * bindingFailure=false : 클라이언트에서 넘어오는 매개변수와 item의 바인딩이 실패해도 binding 실패라고 보지 않겠다. * 검증 로직에 걸렸을 떄에 FieldError를 생성하겠다는 뜻!! */ // 검증 로직 if(!StringUtils.hasText(item.getItemName())) bindingResult.addError(new FieldErr.. 더보기 input 태그 속에 th:field와 th:value가 동시에 있는 경우 public enum ItemType { Book("도서"), Food("음식"), ETC("기타"); private final String description; ItemType(String description) { this.description = description; } public String getDescription(){ return description; }}@Datapublic class Item { private Long id; private String itemName; private Integer price; private Integer quantity; private Boolean op.. 더보기 @ModelAttribute의 새로운 사용법 결론 : @Controller 클래스 안에 여러 요청 메서드가 있을 것인데, 아래와 같이 @ModelAttribute을 붙이고 그 메서드를 정의하면 그 어떤 요청 메서드가 호출이 되더라도 Model 객체에 자동으로 등록이 된다. -> 컨트롤러 클래스의 여러 요청 메서드에서 Model 객체에 등록해야 할 데이터가 중복될 때 매우 유용하다. package hello.itemservice.web.form;import hello.itemservice.domain.item.Item;import hello.itemservice.domain.item.ItemRepository;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import o.. 더보기 이전 1 2 3 4 다음