티스토리 뷰


내가 해야한 것이,

서버에 파일을 저장해놓고, DB에 그 URL을 저장시킨다.

그리고 쿼리로 그 DB에 있는 URL을 불러오도록 하고.

controller부터 시작해서 그 데이터를 가져온 뒤

a href 링크안에 그 URL을 넣어줘야한다.


그런데!!!

스프링이 뭔지 몰르는 나ㅇㅅㅇ


그래서 스프링이모냐면....

뭘 어떻게 해야할지 1도 모르겠지만, 일단 JSP 뷰 화면에서 그 영역을 클릭하면 

클릭이벤트가 되면서 파일을 가져오는것인줄 알았으나

처음 그 페이지가 시작될때 $(document).ready안에서 이미 가지고 오도록 코드를 짜야 했다.


(어차피 나만볼테니 주절주절 쓰자면)


1. Client : Client 에서 ajax를 사용하여 Controller를 부른ㄷ다

2. 컨트롤러 : 컨트롤러를 구현하고, 컨트롤러에서 Service를 호출한다.

   Service는 인터페이스고, 실제 구현은 ServiceImpl에서 한다.

3. Service : Service에서 수행을 위한 메서드를(함수를)정의하고 , 

   DAO 객체를 선언 한다.

4. DAO :  실제 DB에 접근하여 데이터를 조작하는 역할만 수행한다.

5. DAO에서 받아온 데이터를 다시 Client 로 가지고 와서 Success부분을 수행한다.


이 로직으로 코드를 짜야한다. 그러나, ajax가 몬지도 모르고 모르고 모른다..

나는 파일을 가져오니깐, GetFile이라고 하였다. GetFile과 getFile (중요하다)




저 로직대로 돌아가기 위해선 , 일단 Query가 필요하고, DB에서 가져오는 쿼리를 저장하고 선언?할 XML파일이 필요하다.

1. XML파일 생성하기

DB에 idxUserConfig랑 configCode랑 Value를 생성하고, 각각 번호랑, 코드값, url을 넣었다.

코드값이 DL로 2개 설정되어 있는데 쿼리에서 SELECT문으로 조건에 LIKE 검색을 하여 특정 문자열이 포함되어 있는 값만 가져오게 했다.

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
34
35
36
37
<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="getFile">
 
    <resultMap id="resultGetFile" type="GetFileVO">
 
        <result property="idxUserConfig" column="IDX_USER_CONFIG" />
 
        <result property="configcode" column="CONFIG_CODE" />
 
        <result property="value" column="VALUE" />
 
    </resultMap>
 
 
 
    <select id="selectGetFile" resultMap="resultGetFile">
 
        <![CDATA[
 
        SELECT idx_user_config
 
                     , config_code
 
                     , value
 
        FROM tb_user_config 
 
        WHERE config_code LIKE '%DL%'
 
        ]]>
 
    </select>
 
</mapper>
cs



그리고 XML파일을 토대로 VO를 작성한다.

VO가 뭐냐하면 Value Object 자바클래스

db레코드를 구성하는 필드들을 Value Object의 Attribute로 하고 해당 변수에 접근 할 수 있는 Getter Setter 메소드의 조합으로

클래스를 형성하는 클래스 ? 가 뭐라는거지 

그냥 XML을 바탕으로 DB컬럼들에 대한 선언과 그에따른 Getter/Setter메소드를 작성해놓은 곳이라고만 이해하겠다.


2. VO 작성하기    

아까 result property로 선언해주었던 idxUserConfig, configcode, value를 VO클래스 안에 넣고, getter/setter를 작성한다.

getter/setter 자동으로 설정하는 방법은 화면에 마우스 클릭 후 오른쪽 버튼 누르고 

Source -> Generate Getters Setters 클릭해서 만들면 된다.


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
package jdUser.vo;
public class GetFileVO {
    private int idxUserConfig;
    private String configcode;
    private String value;
 
    public int getIdxUserConfig() {
        return idxUserConfig;
    }
    public void setIdxUserConfig(int idxUserConfig) {
        this.idxUserConfig = idxUserConfig;
    }
    public String getConfigcode() {
        return configcode;
    }
    public void setConfigcode(String configcode) {
        this.configcode = configcode;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}
 
cs



3. Client 에서 ajax 사용하기 (이 jquery가 ajax 통신을 위한 jquery ajax method를 설정하는 것)

ajax가 뭐냐면 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$.ajax({ 
        type : "GET"//보내는 타입을 Post방식으로 할지,  GET방식으로 할지 결정
        url : "/jdUser/getfile/selectGetFile.do"// /내 프로젝트명/XML파일의namespace/내가불러올XML의Query이름.do 
        //dataType:"html",   //데이터를 어떻게 받을지 지정하는 부분인데, 처음에 Json으로 받으려고 했을때 안되서 
                             //찾아보니 입력하지 않으면 자동으로 알아서 지정해준다고 해서 주석처리 했더니 됨 
        // data: getFileParam, //파라미터 넘겨줄 부분? : 이게 할말이 많은데 원래 GET방식으로 하라했다가 
                               //다시 POST방식으로 하게됬는데 파라미터를 넘겨줄 값이 없어서 다시 GET으로 바꾸면서 주석 
        contentType : "application/x-www-form-urlencoded; charset=utf-8",  // 기본값이라고 하니까 건들이지 않았고 
        success : function(res) {
             //성공시에 res값을 받아와 아래를 실행 
            $(".manual_down").attr("href", res[0].value);  // .attr : jQuery함수 아래에서 설명 
            $(".client_down").attr("href", res[1].value); 
                        //DB테이블에서 내가 필요한 값은  value값이다. 
                       //.attr() 함수는 선택된 요소들 중에서 제일 처음 요소의 속성값을 가지고 오는 함수이기 때문에
                       //[0], [1] 이라고 알려주는 것 같다
        },
        error : function(request, status, error) {
            alert("에러가 발생했습니다. 관리자에게 문의하시기 바랍니다");
        }
    });
 
cs


.attr() 함수

  • attributeName 의 줄임말이라고 한다(ㅋㅋ)
  • 인자에 따라 2가지로 사용 가능 : 하나의 인자일때 속성값을 받아오고, 두개의 인자일때 속성값을 요소에 부여한다.
  • 속성값을 가져오지 못하면 undefinded를 반환한다 ->그래서 그렇게 성공은 하는데 자꾸 definded 뜬거였구만

-> 근데 웃긴건 난 이ㅓ렇게 설명해준거 이해가 안간다.(절레절레)

$(".manual_down").attr("href", res[0].value);

: 그냥 .manual_down 클래스에 attr함수를 적용하여, href에 res[0].value의 값을 넣어주라 이소리아닌가



4. 컨트롤러 구현

컨트롤러의 역할은 Dispatcher역할로 Client 요청을 해당 비즈니스 로직을 호출하여, 수행결과와 함께 응답하ㅓ는것이다.

@+ㅁ -> 어노테이션이라고 선언해주는 것인데

  • @Controller : Annotation을 이용하여  controller 객체임을 선언한다.
  • @Resource : Service영역 접근을 위한 선언 
  • @RequestMapping : 요청하는 url
      value 부분의 주소를 호출하면, 주소랑 @RequestMapping 어노테이션이랑 매핑되어 해당 메서드가 실행된다.

  • @ResponseBody / @RequestBody : ajax 처리를 하기 위한 어노테이션? 인데 json 데이타 포맷을 이용할 때...
    mappingJacksonHttpMessageConverter를 사용하여 JSON String을 javaClass(get, set)에 자동으로 맵핑이 되도록 변환해준다. 

    @ResponseBody : 클라이언트 요청을 서버에서 처리 후 메소드가 리턴하는 오브젝트를 massageConverters를 통해 json형태로 변환하여 리턴해주는 역할
    @RequestBody : 클라이언트에서 jsonObject로 전송되는 파라미터를 자동으로 javaClass 형식으로 변환 

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
import java.util.List;
import javax.annotatio.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import jdUser.service.GetFileService;
import jdUser.vo.GetFileVO;
// 자동 import 되게 해주는 단축키 : ctrl+shift+o 
 
    @Controller
    public class GetFileController { //컨트롤러 이름
    Logger log = Logger.getLogger(this.getClass());
 
    @Resource(name="getFileService"// name 은 jdUser.service 부분 
    private GetFileService getFileService;
 
    @ResponseBody // ajax를 불르기 위한 어노테이션
    @RequestMapping(value="/getfile/selectGetFile.do", method = RequestMethod.GET)
        public List<GetFileVO> selectGetFile() throws Throwable{
        return getFileService.selectGetFile();
        }
 
    }
 
 
 
cs


컨트롤러까지 만들었으면 이제 Service/ServiceImpl 을 선언하여 메서드를 정의하고, DAO/DAOImpl 을 선언하여 DB에 접근할 수 있도록

해야한다. 나머지 과정은 다음 포스팅에서 해야지




참고 : http://addio3305.tistory.com/




댓글