본문 바로가기
Spring/study

Spring Framework (Legacy) spring01 프로젝트 뜯어보기

by avvin 2019. 6. 3.

Spring Framework (Legacy) spring01 프로젝트 뜯어보기



궁금한 부분 : Controller / Repository / Service bean 등록 각각 어디서? 빈으로 등록된 코드 직접 볼수는 없나


spring01 프로젝트 실행시 첫 화면은 http://localhost:8090/spring01/


메인 컨트롤러 설정

@RequestMapping (value="/") //프로젝트 실행 시 하단의 메서드가 실행되도록함

URL 맵핑 => http://localhost:8090/spring01/ ( 메인화면 URL )


public String main( Model model ) { ~   


스프링이 제공하는 Model 인터페이스 : 데이터를 담는 그릇 역할, map 구조로 저장됨

JSP에서 doget, dopost 메서드가 상속하는 클래스 모두 포함하고 있다. request와 같은 기능을 함 

스프링이 제공하는 Model 인터페이스, add/merge/contains Attribute 메서드 제공



//스프링이 제공하는 인터페이스 객체(내장객체)는 따로 @inject / @Autowired  안달아줘도 된다.

(request도 직접 객체 생성한 적 없는것처럼)


return "main" //출력페이지인 /WEB-INF/views/main.jsp로 넘어감


return "~" => ~로 포워딩


URL : (href가 가리키는 링크) =( @RequestMapping value  + href에 추가된 파라미터 ) OR return redirect value

view : return value  


// 반환 페이지가 없다면 매핑된 주소에 해당하는 페이지로 이동한다. (URL과 페이지 이름이 같다면 리턴값 주지 않아도 된다는 의미)

// returen redirect일 경우에는 redirect가 가리키는 페이지가 URL로 맵핑된다.

// RequestMappig value URL로

 실행됐다가 리턴시 redirect URL로 새로 맵핑되어 넘어가는 것


 menu.jsp

1
2
3
4
5
6
7
8
9
10
11
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="path" value="${pageContext.request.contextPath}" />
<div style="text-align: center;">
    <a href="${path}/">main</a>
    <a href="${path}/gugu.do?dan=7">구구단</a>
    <a href="${path}/test.do">테스트</a>
    <a href="${path}/member/list.do">회원관리</a>
</div>
<hr>
cs


1
2
3
4
@RequestMapping(value = "gugu.do", method = RequestMethod.GET)
    public String gugu(@RequestParam int dan, Model model) {
 
        //int dan=9; //@RequestParam은 생략해도 되지만 명시해주는것이 보기 편하다

cs


// URL에 파라미터가 함께 담겨서 넘어올때, request로 받아서 사용할 필요없이 

    맵핑한 메서드 파라미터 변수 자리에 순서 상관없이 위치시켜주면 된다.



컨트롤러에 대한 설정은 servlet- context 에


1
2
3
4
5
6
7
<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
        in the /WEB-INF/views directory -->
    <beans:bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
c s

InternalResourceViewResolver 클래스는 스프링이 제공하는 view 해석기


servlet-context에서 컴포넌트 스캔

1
2
3
4
5
    </beans:bean>
    <!-- 스프링 빈을 태그로 등록하지 않고 자동으로 검색(auto scan) -->  
    <context:component-scan base-package="com.example.spring01" />
 
</beans:beans>
cs

등록된 어노테이션 없이 직접 bean으로 등록하고싶은 경우 
프로젝트에서 Spring Bean Configuration File인 applicationContext.xml (next > beans 체크)을 만들어준다.


Controller에서 Model 변수에 담은 정보는 return 된 페이지( 반환 페이지가 없다면 매핑된 주소에 해당하는 페이지로 ) 



1
2
3
4
5
6
    @RequestMapping("test/doC")
    public ModelAndView doC() {
        Map<String,Object> map=new HashMap<>();
        map.put("product"new ProductDTO("샤프",1000));
        return new ModelAndView("test/doC","map",map);
    }
cs

ModelAndView 


: 출력할 페이지, 전달할 객체의 변수, 오브젝트 모두 담아 리턴할 수 있다.

 스프링 내장객체, Model의 기능도 포함하고 있어 매개변수에 Model 따로 쓰지 않아도된다. (?)




Controller에서 view가 아닌 데이터를 넘길때는


( @Controller +  클래스 블럭 안에 @ResponseBody  ) OR  @RestController 사용


데이터를 넘겼으므로  Controller로 넘어오기 전 view로 다시 돌아가서 javascript 함수를 실행한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="include/header.jsp" %>
<script>
function doF(){
    $.ajax({
        type: "post",
        url: "${path}/test/doF",
        success: function(result){ //익명함수 실행
            $("#result").html(
                    "상품명:"+result.name+",가격:"+result.price);
        }
    });
}
</script>
</head>
<body>
<%@ include file="include/menu.jsp" %>
<h2>링크 테스트</h2>
<a href="${path}/test/doA">doA</a><br>
<a href="${path}/test/doB">doB</a><br>
<a href="${path}/test/doC">doC</a><br>
<a href="${path}/test/doD">doD</a><br>
<a href="javascript:doF()">doF</a><br>
<div id="result"></div>
</body>
</html>
 
cs


view페이지로 가기 전에 맵핑된 Controller 부터 실행 > javascript:doF() 함수 호출되기 전에 매핑된 컨트롤러부터 실행


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.example.spring01.controller;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
 
import com.example.spring01.model.dto.ProductDTO;
 
@RestController // 스프링 4.0부터 사용 가능 
public class SampleRestController {
 
    @ResponseBody //데이터 리턴 // json 형식으로 리턴
    @RequestMapping("test/doF") // url mapping
    public ProductDTO doF() {
        //호출한 곳으로 데이터가 넘어감(json 형식) 
        return new ProductDTO("냉장고",500000);
    }
}
cs


( jackson-databind 라이브러리 pom에 추가 )


json형식의 String타입으로 변환하지 않고 DTO타입으로 넘겨서 EL문으로 표현하는건 안되나?

(ajax랑 자바스크립트 공부해봐야 알듯)




5강 )