[Spring Boot 게시판] 8일차

김정현·2022년 10월 9일
0

SPRINGBOOT게시판

목록 보기
7/36

1. usr/article/doModify 권한 체크

1) UsrArticleController

        @RequestMapping("usr/article/doModify")
        @ResponseBody
        public ResultData<Article> doModify(HttpSession httpSession, int id, String title, String body) {
            boolean isLogined = false;
            int loginedMemberId = -1;
            if(httpSession.getAttribute("loginedMemberId") !=null) {
                isLogined= true;
                loginedMemberId = (int)httpSession.getAttribute("loginedMemberId");
            }

        if(isLogined==false) {
            return ResultData.from("F-A", "로그인 후 이용가능 합니다.");
        }
        Article article = articleService.getArticle(id);

        if (article == null) {
            return ResultData.from("F-1", Ut.f("%d번 게시물은 존재하지 않습니다.", id));
        }
        ResultData actorCanModifyRd = articleService.actorCanModify(loginedMemberId, article);
        if(actorCanModifyRd.isFail()){
            return actorCanModifyRd;
        }

        return articleService.modifyArticle(id, title, body);
    }
  • 로그인 여부, 게시물 존재여부는 delete와 동일하다
  • 게시물의 수정 권한을 controller가 아닌 service에서 체크
  • 수정하기전 게시물에 대한 권한을 actorCanModifyRd로 결과를 받음, isFail()시 권한 없음

2) ArticleService

        public ResultData modifyArticle(int id, String title, String body) {

            articleRepository.modifyArticle(id, title, body);
            Article article = getArticle(id);
            return ResultData.from("S-1", Ut.f("%번 게시물 수정 했습니다.", id), article);
        }

        public ResultData actorCanModify(int loginedMemberId, Article article) {

            if (loginedMemberId != article.getMemberId()) {
                return ResultData.from("F-2", "해당 게시물에 대한 수정 권한이 없습니다.");
            }
            return ResultData.from("S-1", "수정 가능 합니다.");
        }
  • actorCanModifyRd는 수정권한이 있는지를 service측에 체크
  • delete와 로직이 다르진 않으나 modify는 controller가아닌 service측에서 게시물에대한 권한을 체크

2. ResultData에 data1Name(데이터이름)추가

	public static <DT> ResultData<DT> from(String resultCode, String msg) {
		return from(resultCode, msg, null, null);
	}

	public static <DT> ResultData<DT> from(String resultCode, String msg, String data1Name, DT data1) {
		ResultData<DT> rd = new ResultData<DT>();
		rd.resultCode = resultCode;
		rd.msg = msg;
		rd.data1Name = data1Name;
		rd.data1 = data1;
		return rd;
	}

	public static <DT> ResultData<DT> newData(ResultData Rd, String data1Name, DT data1) {

		return from(Rd.getResultCode(), Rd.getMsg(), data1Name, data1);
	}
  • ResultData에 data1의 데이터이름(article,id 등)을 data1Name에 저장

  • 매개변수를 두개만 받는 from메서드는 데이터와, 데이터이름이 null

  • newData에서도 from메서드를 사용하기때문에 data1Name이 필요

3. jsp 연결

@Controller
public class UsrHomeController {

	@RequestMapping("/usr/home/main")
	public String showMain() {
		return "usr/home/main";
	}

	@RequestMapping("/")
	public String showRoot() {
		return "redirect:usr/home/main";
	}
}
  • /usr/home/main로 요청이오면

  • 이전에는 @ResponseBody 어노테이션을 통해 Json 형태로 데이터를 출력하였으나

  • jsp파일로 보여주기위해 @ResponseBody를 사용하지 않고

  • 메소드에 String을 return "JSP파일 경로" 하면 해당경로의 JSP페이지를보여주게 된다.

  • 이때 "JSP파일 경로" application.yml에 prefix,suffix를 설정해 놓았기때문에

  • string 값("JSP파일 경로") 앞에는 prefix의 경로(/WEB-INF/views/)가 붙고 뒤에는 suffix(.jsp)가 붙어서 jsp 페이지를 연결

  • 브라우저에서 /로 요청이 왔을때 redirect를 통해 상대경로인 usr/home/main로 이동

  • 리다이렉트(redirect)는 웹 브라우저(사용자)가 어떤 URL로 웹 서버를 요청했을때 다른 URL로 넘겨주는 것

  • 참고로 prefix의 상위 폴더는 src/main/webapp/ 폴더

  • prefix와 suffix설정은 앞단의 경로와 뒷단의 확장자명은 기본적으로 고정이 되어 있기 때문인데 이 부분을 설정하지 않는다면, Controller에서 페이지를 호출 할 때 모든 경로를 입력해야 되는 불편함이 생긴다

4. 게시물 리스트를 JSP로 구현

Spring Model 객체

  • Controller 에서 생성된 데이터를 담아서 View 로 전달할 때 사용하는 객체.

  • Controller의 메서드는 Model이라는 타입의 객체를 파라미터로 받을 수 있다.

  • Method 에 Model 타입이 지정된 경우 Model 타입의 객체를 만들어서 메서드에 주입

  • addAttribute("키", "값") 메소드를 사용하여 전달할 데이터 세팅

  • JSP Servlet으로 웹 어플리케이션을 만들 때 보통 request나 session 내장객체에 정보를 담아 jsp에 넘겨주곤 했는데 Spring에서는 Model을 쓴다.

  • request.setAttribute() 와 비슷한 역할을 하는 것.

  • 개발자는 직접 model을 생성할 필요는 없다. 다만 파라미터로 선언만 해주면 스프링이 알아서 만들어준다.

@ModelAttribute("파라미터명")

  • 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 때 필요한 어노테이션
  • 스프링에서 Java beans 규칙(Getter, Setter, 생성자 포함)에 맞는 객체는 파라미터 전달이 자동으로 가능.
  • 하지만 일반 변수의 경우, 자동 전달 불가능. model 객체를 통해서 전달 필요.
  • 전달될 때는 클래스명의 앞글자를 소문자로 처리하여 전달한다.
  • 그러나 기본자료형(int, double등등)은 파라미터로 선언되었더라도 화면에 자동으로 전달되지 않는다.

model.addAttribute하면 Model에 저장되는 것이 아니라 Request객체에 저정

그렇기 때문에 받을 때도 HttpServletRequest를 이용해서 받아야한다. 물론, Request영역에 저장한 것이기 때문에 View에서도 활용이 가능하다.

Model객체는 request영역만 가능하기 때문에 Session영역에 값 저장은 불가능 하다.

- Model 객체 -

- EL 태그 -

- EL 태그와 JSTL -

1) UsrArticleController

	@RequestMapping("/usr/article/getArticles")
	public String getArticles(Model model) {
		List<Article> articles = articleService.getArticles();
		model.addAttribute("articles",articles);
		return "usr/article/list";
	}
  • JSP Servlet으로 웹 어플리케이션을 만들 때 보통 request나 session 내장객체에 정보를 담아 jsp에 넘겨주곤 했는데 Spring에서는 Model을 쓴다.
  • model을 직접 생성하지 않아도파라미터로 선언만 해주면 스프링이 알아서 만들어준다.
  • addAttribute("키", "값") 메소드를 사용하여 전달할 데이터 세팅

2) ArticleService

	public List<Article> getArticles() {
		return articleRepository.getArticles();
	}
  • resultData로 결과 반환했던것을 List타입으로 변경

3) list.jsp

		<table border="2">
				<thead>
					<tr>
						<th>번호</th>
						<th>날짜</th>
						<th>제목</th>
					</tr>
				</thead>
				<tbody>
					<c:forEach var="article" items="${articles}">
						<tr>
							<td>${article.id } </td>
							<td>${article.regDate.substring(0,10)}</td>
							<td>${article.title}</td>
						</tr>
					</c:forEach>
				</tbody>
		</table>
  • JSTL을 사용하여 table로 게시물 리스트를 구현
  • var의 값은 배열 요소를 저장할 임시변수 이름
  • items의 값은 ${배열이름}

0개의 댓글