D+53-컨트롤러.RestController다른 view에 연결하기,ssr과csr,컨트롤 어노테이션정리,스프링으로 홈페이지 만들기.연관관계,DI,jsp파일에 jsp파일 삽입

Bku·2024년 3월 13일

학원 일기

목록 보기
51/67
post-thumbnail

Controller

MultiPathVariableController

패스 배리어블로 한개의 값을 넘겼지만 이번에는 여러개의 값을 넘겨보자

getMultiVar 컨트롤러 함수

@Controller
@RequestMapping("/exam06")
public class MultiPathVariableController {

    @GetMapping ("/multi-path/id/{id}/name/{name}")
    public String getMultiVar (Model model, @PathVariable String id, @PathVariable String name){
        model.addAttribute("id", id);
        model.addAttribute("name", name);
        return "/exam06/multi_path.jsp";
    }
}

마찬가지로 getMapping의 {}안에 변수를 넣어준어야한다. 변수를 하나 더 주어진 거 빼고는 바뀐것은 없다.

multi_path JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%-- bootstrap css cdn   --%>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <h2>PathVariabl 전달방식</h2>
    <p>${id}</p>
    <p>${name}</p>
</div>
</body>
</html>

결과

url에 적은 변수 값들이 잘 출력 되었다.

참고로 url에 변수명을 안적고 싶으면 getMapping에서 변수명을 없애주면된다.

RestController 자바가 아닌 다른 view 시스템과 연결

지금까지 jsp의 view와 연결을 해서 화면을 출력했다. 그런데 vue나 react같은 srping에서 지원하지 않는 view는 controller어노테이션으로 연결이 어렵기 때문에 RestController 컨트롤러를 사용해야한다.

getMultiVar 레스트컨트롤러 함수

이 컨트롤러는 json파일로 결과를 return하는 컨트롤러이다. json은 객체이기에 객체를 만들어서 이것을 출력해야한다.

@RestController
@RequestMapping("/exam06")
public class MultiPthRestController {

    @GetMapping("/multi-path-rest/{id}/{name}")
    public Member getMultiVar (@PathVariable String id, @PathVariable String name){
        Member member = new Member(id, name);
        return member ;
    }
}

RestController어노테이션을 이용했다는 차이점이 있고, 이건 json파일이라서 model이 따로 필요없다. 그리고 마지막에 객체를 리턴해주면된다.

결과

다음과 같은 josn파일 결과가 나온다.

SSR 과 CSR

SSR

SSR은 html + css + js를 완성시키는 위치가 spring(벡엔드)인것을 말한다. 풀네임은 Server Side Rendering 기술이다.
예) JSP

CSR

CSR은 html + css + js를 완성시키는 위치가 vue/react(프론트)인 것을 말한다. 풀네임은 Client Side Rendering 기술이다.
예) vue/react 등

Controller 관련 어노테이션 정리

  • @Controller : 클래스에 컨트롤러 기능 부여, 클래스위에 붙임
  • @GetMapping("url") 함수(){} : 함수의 위에 붙임, url 을 부여하는 기능
  • @RequestMapping("공통url") : 클래스 위에 붙임, 공통url 의미 부여
  • @RequestParam(defaultValue="") : 웹매개변수 전달받는 기능 부여
  • @ModelAttribute : 객체를 웹매개변수로 전달받아 jsp 로 전송해주는 기능 부여
  • @PathVariable : 파라메터 방식으로 웹매개변수를 전달받는 기능 부여

Model

model에는 어떤 어노테이션을 사용하고 어떻게 컨트롤러와 상호작용하는지를 알아보자.

model데이터 다운 받기

선생님이 실습에 제공하는 데이터를 받았다. 여기에는 모델(속성들)파일과, 잘 되는지 테스트에 사용할 testdate, 시스템에 데이터를 저장할 repository파일을 받아왔다. 전에 스프링 강의에서 했던 방식과 거의 유사하다.

설계

spring 코딩 : MVC 디자인 패턴에 의해 코딩함

  1. C(Controller) : 화면 + 모델을 연결시켜주는 역할, url 이 있고
    jsp 로 결과를 보내줌
  2. M(Model) : 데이터 저장/수정/삭제/추가 하는 곳
    entity : 데이터를 저장하는곳 , DB 테이블과 똑같이 생김
    service : 데이터 조회/수정/삭제/추가 하는 함수를 정의하는 곳, 업무 로직을 담당하는 코딩이 작성됨
  3. 최종 코딩
    1) service 함수를 정의
    2) controller 에서 그 service 함수를 호출해서 결과를 jsp 로 전송함

함수구현

DeptService 구현

findAll 함수만들기

list에 있는 모든 값을 조회하는 findAll함수를 만들어보자.

@Service // 얘를 붙여주어야지 bean으로 등록이 되어 스프링이 인식이 가능하다.
public class DeptService {

    @Autowired // 얘도 스프링에 bean으로 올려준다. DI에 사용을 해야하는데 spring이 인식을 못 하면 안되니까..
    DeptDao deptDao;

    /**
     * 전체조회 함수
     * @return : 부서 객체 배열
     */
    public List<Dept> findAll() {
        List<Dept> list = deptDao.selectAll();
        return list;
    }
}

Service 어노테이션을 붙여주면 빈으로 등록이 된다. component와 같은 역할이고 controller와 같은 역할이다.

Dao로 선생님이 미리 만들어 놓은 함수중 selectAll을 이용해서 lsit의 값을 다 조회하고 이것을 리턴한다.

DeptController 구현

getDeptAll 함수 만들기

DeptService에서 구현한 findAll함수를 이용해서 getDeptAll을 만들어보자. 이 함수가 실질적으로 웹에 정보를 출력하게 될 함수이다.

@Controller
@RequestMapping("/exam01")
public class DeptController {

    @Autowired
    DeptService deptService;

    @GetMapping("/dept")
    public String getDeptAll(Model model){
        List<Dept> list = deptService.findAll();
        model.addAttribute("list", list);
        return "exam01/dept/dept_all.jsp";
    }

}
  1. autowired를 통해 서비스를 연관시킨다. 이렇게 해야 스프링의 deptService를 사용할 수 있다.
  2. GetMapping으로 url연결하고 list에 deptService의 findAll함수를 담는다.
  3. 마지막으로 이걸 model로 jsp에 보내어 화면에 출력하게 된다.

dept_all JSP만들기

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <h2>전체 조회</h2>
        <h2>${list}</h2>
    </div>
</body>
</html>

위와 같이 모든 객체의 정보가 나오게 된다.

연관 관계

model 의 정보에서 repository의 역할을 하는 DeptDao에 함수들로 저장이 되어있다. 이 함수를 이용하여 service 함수를 만들고 이 service함수를 controller함수가 이용해서 jpa를 통해 출력한다.

즉 repository -> service -> controller 이런 관계로 연관이 되어있다.

어노테이션 설명

위의 과정에서 새로 사용한 어노테이션이 있다.

  • service : 업무로직을 담당하는 클래스 위에 붙여서 사용하는 어노테이션으로 주로 DB조회 수정 추가 삭제하는 함수를 정의하는 곳으로회원들이 실제로 사용하는 기능을 구현하는 곳에 사용한다. 이걸 해놓으면 해당 클래스를 빈으로 스프링 컨테이너에 올려준다.

  • Autowired : 미리 생성해둔 객체를 받는 어노테이션이다. 이것을 이용해서 DI가 가능하게 해준다.

DI

DI를 해주지 않으면 new를 통해 객체를 가져와야한다. 하지만 인터페이스를 제대로 활용하려면 객체를 가져오지 않고 인터페이스만 가져와서 이 자식들을 자유롭게 사용해야 객체지향코딩이 가능하다. 스프링에서는 자식 객체를 정의하지 않고 부모객체만 가져와서 사용을 할 수 있게 하고 이것이 Di이다.

id를 하는 방법에는 필드, 생성자, setter 이렇게 3가지 방법이 있다. 필드에 하는 방법은 팔드 값을 바꿀 방법이 없다는 단점이 있고, setter로 하면 public함수이기에 노출이 되어 아무나 값을 바꿀수 있다는 단점이 있다.

이 두개의 방법의 단점때문에 최근에는 생성자로 id를 하는것을 권장한다.
생성하는 시점에 값을 주고, 바꾸지 못하게 하고 또 바꿔야할 때는 private 인 필드보다는 쉽게 값을 바꿀수 있기 때문이다.

jsp:include jsp파일 끼워넣기

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<jsp:include page="../../common/header.jsp"/>

    <table class="table container">
        <thead>
        <tr>

            <th scope="col">dno</th>
            <th scope="col">dname</th>
            <th scope="col">loc</th>
        </tr>
        </thead>
        <tbody>

            <c:forEach var="data" items="${list}">
            <tr>
                <td>${data.dno}</td>
                <td>${data.dname}</td>
                <td>${data.loc}</td>
            </tr>
            </c:forEach>


        </tbody>
    </table>
<jsp:include page="../../common/footer.jsp"/>
</body>
</html>

footer와 header을 만들어서 jsp를 끼워넣어 보았다.

<jsp:include page="../../common/header.jsp"/>

이런 테그를 이용하면 되는데 page 속성에 jsp파일의 경로를 적어주면 된다. header와 footer가 잘 결합된 것을 볼 수있다.

오늘은 spring을 이용해서 웹사이트 만들기를 시작했다. 설계를 어떻게 하는지를 참고하면 될거 같다. 그리고 jsp를연결하는 방법도 배웠는데 오늘 상단의 내비게이션 바를 어떤 창을 열어도 있게 하고 싶었는데 이 방법을 통해 가능하게 되었다. 마지막으로 jsp가 아닌 다른 view 시스템을 이용한다면 restcontroller를 사용하도록하자.

profile
기억보단 기록

0개의 댓글