
diary 만들어서 diary

lombok 세터게터 투스트링 다 오버라이딩하는거
lombok 라이브러리가 있다고 적용되는거 아님 sts잠깐 닫고 설정
(직접 lombok 플러그인 해야함)


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";
}
}