Spring session

주가희·2023년 11월 29일

diary 만들어서 diary

lombok 세터게터 투스트링 다 오버라이딩하는거

lombok 라이브러리가 있다고 적용되는거 아님 sts잠깐 닫고 설정
(직접 lombok 플러그인 해야함)

https://projectlombok.org/



sts만 체크


자동으로 sts폴더 안에 lombok.jar파일이 들어와있는걸 확인

pom.xml확인

자동으로 만들어진것 확인
필드수정되어도 자동으로 추가된다

나머지 설정도 해준다

원래웹에서 사용하던 애노테이션을 사용할 수 있도록
(스프링에서는 못씀)
필터,리스너, 웹서블릿 등등

자바의 인터페이스 확장에대해서..

셋팅 파일 -> 자동으로 만들어진 클래스


@ServletComponentScan
애노테이션 추가하면 필터,리스너, 웹서블릿 기능을 감지할 수 있다

스프링안에도 필터,리스너, 웹서블릿가 다 구현이 되어있지만 강사님은 안써서 이렇게 구현하고 수업

package com.example.diary;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ServletComponentScan
@ComponentScan(basePackages = "com.example.a")
public class DiaryApplication {

	public static void main(String[] args) {
		SpringApplication.run(DiaryApplication.class, args);
	}

}

package com.example.diary; 이패키지 하위에만 패키지를 만들어야 이 설정이 적용됨
안그러고 싶으면
@ComponentScan(basePackages = "com.example.a")
이거 추가

근데 딱히 그럴일 없음

필터생성

package com.example.diary.filter;

import java.io.IOException;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;

@WebFilter("/*")
public class EncodingFilter implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//요청전
		request.setCharacterEncoding("utf-8");
		chain.doFilter(request, response);
		//요청후
	}
	
}

순서는 매퍼-> 매퍼호출 레이어-> 컨트롤러 -> 뷰 이런식으로 만든다
마이바티스에서는 mapper이름 더 많이 씀
스프링 부팅 -> 애노테이션 스캔 -> mapper를 찾음 -> mapper를 구현 (new객체까지 만들어 줌)(흔히 만들던 dao처럼)
-> 부모이름으로 호출
class 생성하고 implements Filter 추가 해서 필터생성
리스너도 spring 전에 만든 리스너랑 동일하게 생성

controller : 요청처리 알고리즘 코드 X -> Dao : 디비처리 알고리즘 코드X
중간 계층 필요 service계층 필요 알고리즘을 처리할 다른무언가가 필요 이게 서비스계층
무조건 지나감(아무런 코드가 없어도 룰처럼! ex)대표는 일반사원한테 보고받지 않는다) / 서비스에서 다른 서비스 호출 불가 (중간에 개입하면 되긴함)
트랜젝션 처리를 서비스에서 해야함! 그전에는 db트랜젝션을 사용했으므로 dao에서 처리
알고리즘, 파일저장, 페이징 등등

컨트롤러 - 서비스 - dao

1번 방식 하나의 서비스 하나의 dao
2번 방식 하나의 컨트롤러 몇개의 서비스

1번 방식을 쓰면 컨트롤러에서 트랜잭션처리해야함!

매핑이 겹치면 부팅안됨!
이렇게 하면 안됨 GetMapping 이 중복

	@GetMapping("/login")
	public String login() {
		return "login";
	}
	
	@GetMapping("/lgoin")
	public String login(Member paramMember) {
		return "redirect:home";
	}

컴포넌트 애노테이션
Mapper는 컴포넌트 애노
디펜더씨 인젝션
ioc기법

service 추가 전 homeController

package com.example.diary.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.diary.mapper.NoticeMapper;
import com.example.diary.vo.Notice;

import jakarta.servlet.http.HttpSession;

@Controller
public class HomeController {
	@Autowired private NoticeMapper noticeMapper;
	@Autowired private Map<String, Object> paramMap;

	@GetMapping("/member/home")
	public String noticeList(Model model,HttpSession session,
								@RequestParam(defaultValue = "1") int currentPage) {
		//로그인 후에만 접속가능
		if(session.getAttribute("loginMember") == null) {
			return "member/login";
		}
		
		// 페이징에 필요한 변수
		int rowPerPage = 2; //한페이지에 표시할 공지사항 수 
		int beginRow = (currentPage - 1) * rowPerPage;
		
		// Map에 beginRow, rowPerPage 값 추가
		paramMap.put("beginRow", beginRow);
		paramMap.put("rowPerPage", rowPerPage);
		
		// mapper 호출
		List<Notice> noticeList = noticeMapper.selectNoticeList(paramMap);
		System.out.println(noticeList);
		
		// model에 공지사항 목록 추가
		model.addAttribute("noticeList", noticeList);
		
		// model에 현재페이지 추가
		model.addAttribute("currentPage", currentPage);
		
		// 포워딩
		return "member/home";
	}
}
profile
주웅

0개의 댓글