패스 배리어블로 한개의 값을 넘겼지만 이번에는 여러개의 값을 넘겨보자
@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의 {}안에 변수를 넣어준어야한다. 변수를 하나 더 주어진 거 빼고는 바뀐것은 없다.
<%@ 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에서 변수명을 없애주면된다.
지금까지 jsp의 view와 연결을 해서 화면을 출력했다. 그런데 vue나 react같은 srping에서 지원하지 않는 view는 controller어노테이션으로 연결이 어렵기 때문에 RestController 컨트롤러를 사용해야한다.
이 컨트롤러는 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은 html + css + js를 완성시키는 위치가 spring(벡엔드)인것을 말한다. 풀네임은 Server Side Rendering 기술이다.
예) JSP
CSR은 html + css + js를 완성시키는 위치가 vue/react(프론트)인 것을 말한다. 풀네임은 Client Side Rendering 기술이다.
예) vue/react 등
model에는 어떤 어노테이션을 사용하고 어떻게 컨트롤러와 상호작용하는지를 알아보자.
선생님이 실습에 제공하는 데이터를 받았다. 여기에는 모델(속성들)파일과, 잘 되는지 테스트에 사용할 testdate, 시스템에 데이터를 저장할 repository파일을 받아왔다. 전에 스프링 강의에서 했던 방식과 거의 유사하다.
spring 코딩 : MVC 디자인 패턴에 의해 코딩함
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의 값을 다 조회하고 이것을 리턴한다.
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";
}
}
<%@ 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를 해주지 않으면 new를 통해 객체를 가져와야한다. 하지만 인터페이스를 제대로 활용하려면 객체를 가져오지 않고 인터페이스만 가져와서 이 자식들을 자유롭게 사용해야 객체지향코딩이 가능하다. 스프링에서는 자식 객체를 정의하지 않고 부모객체만 가져와서 사용을 할 수 있게 하고 이것이 Di이다.
id를 하는 방법에는 필드, 생성자, setter 이렇게 3가지 방법이 있다. 필드에 하는 방법은 팔드 값을 바꿀 방법이 없다는 단점이 있고, setter로 하면 public함수이기에 노출이 되어 아무나 값을 바꿀수 있다는 단점이 있다.
이 두개의 방법의 단점때문에 최근에는 생성자로 id를 하는것을 권장한다.
생성하는 시점에 값을 주고, 바꾸지 못하게 하고 또 바꿔야할 때는 private 인 필드보다는 쉽게 값을 바꿀수 있기 때문이다.
<%@ 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를 사용하도록하자.