스프링 jar 주소

Spring 2014. 10. 14. 16:12 |

http://repo.spring.io/release/org/springframework

'Spring' 카테고리의 다른 글

스프링을 사용한 파일 업로드 2 (Ajax 파일 업로드)  (1) 2014.03.04
스프링을 사용한 파일 업로드 1  (1) 2014.03.04
web.xml 설정  (0) 2013.10.07
component-scan  (0) 2013.09.16
Autowired  (0) 2013.09.16
Posted by 꼬렙
:

두번째로 AJAX 를 사용해서 파일 업로드 기능을 구현하는 방법입니다


설정은 앞의 스프링 파일 업로드와 거의 유사합니다


AJAX로 업로드를 한 다음 JSON 형식으로 응답을 해주기 위해서

스프링 설정을 좀 추가/수정 해줘야 됩니다


[스프링 설정파일 servlet-context.xml]

<bean id="viewResolver" 

      class="org.springframework.web.servlet.view.InternalResourceViewResolver"

      p:prefix="/WEB-INF/view/" p:suffix=".jsp" p:order="2" />

<bean id="beanNameViewResolver

class="org.springframework.web.servlet.view.BeanNameViewResolver">

<property name="order">

<value>1</value>

</property>

</bean>

<bean name="JSON" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />


스프링에는 @ResponseBody 라는 기능도 있지만 저는 MappingJacksonJsonView 객체를 사용했습니다

Controller에서 리턴해줄 View 를 JSP 대신에 MappingJacksonJsonView 를 사용하는거죠


JSP 페이지로 뿌려준 다음 그 값을 받아도 상관은 없지만.. 

매우 번거로워 지기 때문에 MappingJacksonJsonView를 많이 사용합니다


요놈을 사용하면 매우 편리하게 JSON 형태의 문자열로 변환한 다음 AJAX CallBack 함수로 전달해줄 수 있습니다

JSON 형태의 문자열을 만들기 위해서 JSONObject / JSONArray 등을 따로 사용하지 않아도 됩니다


JSON 이라는 이름을 가진 Bean 객체를 View로 사용해야 하기 때문에 BeanNameViewResolver를 선언해줍니다

처리하는 우선순위는 InternalResourceViewResolver 보다 낮게 지정해야 하구요

그래서 위쪽의 viewResolver는 order를 2로 beanNameViewResolver는 order를 1로 지정했습니다


Service 부분은 앞의 예제를 그대로 사용하시면 됩니다


Controller와 JSP도 살짝 수정해줍니다


[Controller]

@RequestMapping(value="fileUploadAjax.do", method=RequestMethod.POST)

public ModelAndView fileUploadAjax(MultipartHttpServletRequest mRequest) {

ModelAndView mav = new ModelAndView();

if(boardService.fileUpload(mRequest)) {

mav.addObject("result", "SUCCESS");

} else {

mav.addObject("result", "FAIL");

}

mav.setViewName("JSON");

return mav;

}

소스를 보면 앞에서 만든 Controller와 거의 같습니다

View만 JSON 이라고 변경했습니다


[JSP]

<script src="/js/jquery-1.10.2.min.js"></script>

<script src="/js/jquery.form.js"></script>

<script>

$(document).ready(function() {

$("input[type=submit]").bind("click", function() {

$("form").ajaxSubmit({

success : function(data) {

alert(data.result);

},

error : function(error) {

alert("요청 처리 중 오류가 발생하였습니다.");

}

});

return false;

});

});

</script>

jquery.form.js 플러그인을 사용합니다


jquery의 플러그인이므로 임포트 하기 전에 

<script src="/js/jquery-1.10.2.min.js"></script> 이 구문을 반드시 먼저 써줘야 합니다

jquery.form.js 플러그인의 사용방법은 일반 jquery 의 ajax 구문과 거의 같습니다


form 자체에 action 주소가 입력되어 있기 때문에 따로 url을 지정하지 않았지만 

혹시 변경을 하고 싶다면 url : "주소" 이런식으로 추가해주시면 됩니다


가장 아래쪽에 return false; 이 구문을 반드시 추가해주셔야 원래 submit 버튼의 기능을 막아줍니다

추가하지 않으면 ajax로 결과를 받는것이 아니라 다음 페이지로 넘어가서 JSON 문자열을 출력해버립니다


[파일 업로드 페이지]



[파일 업로드 결과]



완성된 프로젝트 파일입니다

FileUploadDownload2.zip







'Spring' 카테고리의 다른 글

스프링 jar 주소  (0) 2014.10.14
스프링을 사용한 파일 업로드 1  (1) 2014.03.04
web.xml 설정  (0) 2013.10.07
component-scan  (0) 2013.09.16
Autowired  (0) 2013.09.16
Posted by 꼬렙
:

스프링을 사용해서 파일 업로드 기능을 구현하는 방법입니다


JSP에서 넘어온 파일 데이터를 Controller에서 직접 처리해도 되겠지만 Service를 거쳐서 처리하도록 하겠습니다


먼저 스프링 설정 파일에 multipartResolver 를 선언해야 합니다

<bean id="multipartResolver

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- maximum file size in bytes 50MB -->

<property name="maxUploadSize" value="52428800" />

</bean>

JSP에서 넘어오는 파일 데이터를 받아주는 역할을 합니다


<property>로 사용할수 있는 옵션입니다

maxUploadSize(최대업로드 가능한 바이트크기)

maxInMemorySize(디스크에 임시 파일을 생성하기 전에 메모리에 보관할수있는 최대 바이트 크기)

defaultEncoding(요청을 파싱할 때 사용할 캐릭터 인코딩. 기본값 ISO-8859-1)

특별한 상황이 아니라면 maxUploadSize만 사용해도 무방합니다 (사용하지 않으면 기본값으로 처리)


[Controller]

@Autowired

private BoardService boardService; // 서비스 자동 주입


@RequestMapping(value="fileUpload.do", method=RequestMethod.POST)

public ModelAndView fileUpload(MultipartHttpServletRequest mRequest) {

ModelAndView mav = new ModelAndView();

if(boardService.fileUpload(mRequest)) {

mav.addObject("result", "SUCCESS");

} else {

mav.addObject("result", "FAIL");

}

mav.setViewName("board/fileUpload_result");

return mav;

}

Controller의 메소드의 인자로 MultipartHttpServletRequest 를 사용하였습니다

MultipartHttpServletRequest 이외에도 

Bean 객체, @RequestParam 을 사용하는 방법 등 여러가지가 있습니다


[Service]

public boolean fileUpload(MultipartHttpServletRequest mRequest) {

boolean isSuccess = false;

String uploadPath = "/file/";

File dir = new File(uploadPath);

if (!dir.isDirectory()) {

dir.mkdirs();

}

Iterator<String> iter = mRequest.getFileNames();

while(iter.hasNext()) {

String uploadFileName = iter.next();

MultipartFile mFile = mRequest.getFile(uploadFileName);

String originalFileName = mFile.getOriginalFilename();

String saveFileName = originalFileName;

if(saveFileName != null && !saveFileName.equals("")) {

if(new File(uploadPath + saveFileName).exists()) {

saveFileName = saveFileName + "_" + System.currentTimeMillis();

}

try {

mFile.transferTo(new File(uploadPath + saveFileName));

isSuccess = true;

} catch (IllegalStateException e) {

e.printStackTrace();

isSuccess = false;

} catch (IOException e) {

e.printStackTrace();

isSuccess = false;

}

} // if end

} // while end

return isSuccess;

} // fileUpload end

Controller 에서 받았던 MultipartHttpServletRequest 를 Service로 넘겨줬고

이제 원하는 내용을 꺼내쓰면 됩니다


JSP에서 넘어온 <input> 태그의 name을 확실히 알고 있다면 getFile()확실히 알수 없다면 getFileNames() 를 사용합니다

파일 업로드를 할때 파일을 한개만 올릴수도 있지만.. 여러개를 올리는 경우도 있으므로 getFileNames()를 많이 사용하는 편입니다


Service의 내용은 어떤 name으로 넘어올지 몇개가 넘어올지 모르는 경우라 가정하고 작성했습니다


mRequest.getFileNames()를 사용해서 몇개가 넘어왔든 Iterator 형태로 name을 다 받아주고

그 name으로 mRequest.getFile()을 사용해서 실제 파일 객체를 뽑습니다


그럼 MultipartFile 객체가 나오구요

MultipartFile 객체에서는 업로드한 파일명과 파일사이즈를 뽑아내고 DB에 저장해주면 됩니다

업로드한 파일명은 mFile.getOriginalFilename(), 파일 사이즈는 mFile.getSize()를 쓰면 되구요


이런 과정을 반복해주면 업로드가 끝납니다

물론 처리하는 중에 예상치못한 오류가 발생할 수도 있으니 예외처리는 필수이구요


이렇게 필요한 데이터들을 다 얻어낸 다음에는 업로드된 파일을 실제 물리경로에 저장을 해줘야 됩니다

현재 JSP -> Controller -> Service 이런 과정을 거치긴 했지만 WAS의 임시경로에 저장이 된 상태입니다

만약 여기서 별도 저장하는 작업을 하지 않는다면 임시경로에 잠시 저장되었다가 사라지게 됩니다


그래서 MultipartFile 의 transferTo() 라는 메소드를 사용해서 원하는 위치에 저장해줍니다

InputStream을 얻은 다음에 직접 처리를 해줘도 되지만 성능 좋고 편하니까 transferTo()를 그냥 사용하는 것도 좋습니다


Service 내용 중에서 

if(new File(uploadPath + saveFileName).exists()) {

saveFileName = saveFileName + "_" + System.currentTimeMillis();

}

이런 조건문을 넣었는데요

이런 행위를 하는 이유는 이미 A.txt 라는 파일이 업로드 되어 있는데 또 A.txt를 업로드하면 파일이 덮어져 버리기 때문에

같은 파일명이 존재한다면.. 파일명 맨끝에 현재 시각을 추가하기 위해서 입니다


파일을 실제 저장할때는 현재 시각을 추가했지만 다운로드할때는 원래 업로드 했을때 파일명을 그대로 보여주기 위해서

업로드시 원래 파일명 getOriginalFilename(), 저장된 파일명 saveFileName 이렇게 두가지를 따로 저장해줘야 됩니다


try {

mFile.transferTo(new File(uploadPath + saveFileName));

isSuccess = true;

} catch (IllegalStateException e) {

e.printStackTrace();

isSuccess = false;

} catch (IOException e) {

e.printStackTrace();

isSuccess = false;

}

예외 상황이 발생하지 않는다면 isSuccess가 true, 예외가 발생한다면 false가 저장되어서 Controller로 리턴됩니다


Controller는 그 결과에 따라서 result라는 키로 request에 저장시키고 보여주고자 하는 View(fileUpload_result.jsp)로 넘겨줍니다


View(fileUpload_result.jsp)

<body>

<h1>${result}</h1>

</body>


위 내용들을 실제로 확인해보면..


[파일 업로드 페이지]


[파일 업로드 결과 페이지]

[실제 물리경로 저장]


만약.. 같은 파일들을 또 올린다면..




이렇게 파일명 맨뒤에 현재 시각(유닉스 타임)을 붙여주게 됩니다



최종 프로젝트 파일입니다

FileUploadDownload1.zip









'Spring' 카테고리의 다른 글

스프링 jar 주소  (0) 2014.10.14
스프링을 사용한 파일 업로드 2 (Ajax 파일 업로드)  (1) 2014.03.04
web.xml 설정  (0) 2013.10.07
component-scan  (0) 2013.09.16
Autowired  (0) 2013.09.16
Posted by 꼬렙
:

web.xml 설정

Spring 2013. 10. 7. 11:52 |

ㅇ 웹 프로젝트에 스프링을 적용하기 위해서는 스프링에서 제공하는 DispatcherServlet 설정 필요


ㅇ Root Context 사용시

<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>classpath:root-context.xml</param-value>

</context-param>

<listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

※ Root Context를 사용하는 이유 : 서블릿이 여러개인 경우 각 서블릿 간에 자원을 공유하기 위해서..

 <param-value>의 classpath: 는 Source Folder, 즉 src 폴더를 가리키며, 별도의 Source Folder를 만들어서 사용 가능

    classpath 또는 /WEB-INF 로 작성


ㅇ Dispatcher Servlet 등록

<servlet>

    <servlet-name>dispatcher</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:dispatcher-servlet.xml</param-value>

    </init-param>

</servlet>

<servlet-mapping>

    <servlet-name>dispatcher</servlet-name>

    <url-pattern>*.do</url-pattern>

</servlet-mapping>

- dispatcher : 서블릿의 이름

- contextConfigLocation

  ㆍ서블릿 설정 파일의 위치 및 이름

  init-param 을 사용하지 않아도 상관없음

  ㆍinit-param 을 사용하지 않는 경우 [/WEB-INF/서블릿명-servlet.xml] 기본값으로 지정











'Spring' 카테고리의 다른 글

스프링을 사용한 파일 업로드 2 (Ajax 파일 업로드)  (1) 2014.03.04
스프링을 사용한 파일 업로드 1  (1) 2014.03.04
component-scan  (0) 2013.09.16
Autowired  (0) 2013.09.16
기본 데이터 / Bean 객체 주입 방법  (0) 2013.09.16
Posted by 꼬렙
:

component-scan

Spring 2013. 9. 16. 12:46 |

ㅇ <bean> 형태로 Bean 객체를 선언하지 않고 조건에 맞는 클래스를 자동으로 읽어들이는 (Bean 객체 선언) 방법


ㅇ 사용방법

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

       

    <context:component-scan base-package="com.spring.autowired.exam3">

    <context:include-filter type="assignable" expression="com.spring.autowired.exam3.First"/>

    <context:include-filter type="assignable" expression="com.spring.autowired.exam3.Second"/>

    </context:component-scan>

    

</beans>

스프링 MVC의 @Controller, @Service, @Repository, @Component 등 기본 지원 애노테이션은 자동으로 등록하지만

개발자가 별도로 만든 클래스를 자동으로 등록되지 않음

위의 경우는 assignable 이라는 옵션을 사용하여 해당 클래스를 직접 등록

보통은 위처럼 사용하지 않고 <context:component-scan base-package="패키지 경로" /> 까지만 적용해도 상관없음

<context:component-scan> 을 적용하는 경우는 <context:annotation-config /> 태그를 사용하지 않아도 됨


예제 파일


AutowiredExam3.zip













'Spring' 카테고리의 다른 글

스프링을 사용한 파일 업로드 1  (1) 2014.03.04
web.xml 설정  (0) 2013.10.07
Autowired  (0) 2013.09.16
기본 데이터 / Bean 객체 주입 방법  (0) 2013.09.16
스프링 개념(?)  (0) 2013.09.16
Posted by 꼬렙
:

Autowired

Spring 2013. 9. 16. 12:35 |

ㅇ 스프링에서 Bean 객체 간에 서로 주입을 시켜줄때는 생성자 또는 Setter 형태로 선언을 해야 하지만

    @Autowired 라는 애노테이션을 사용함으로써 선언 생략 가능


ㅇ 사용방법

public class First {

    @Autowired

    private Second second;

}


ㅇ Bean 객체 형태로 선언만 되어 있다면 어디서든 @Autowired를 통해 객체 주입 가능


ㅇ 설정

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xmlns:context="http://www.springframework.org/schema/context"

           xsi:schemaLocation="http://www.springframework.org/schema/beans

                 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

                 http://www.springframework.org/schema/context

                 http://www.springframework.org/schema/context/spring-context-3.0.xsd">

      

    <context:annotation-config />

     

    <bean id="first" class="com.spring.exam2.First" />

    <bean id="second" class="com.spring.exam2.Second">

        <property name="age">

            <value>18</value>

        </property>

    </bean>

</beans>

context 네임스페이스 & 스키마, <context:annotation-config /> 태그 반드시 추가



예제 파일

AutowiredExam.zip





'Spring' 카테고리의 다른 글

스프링을 사용한 파일 업로드 1  (1) 2014.03.04
web.xml 설정  (0) 2013.10.07
component-scan  (0) 2013.09.16
기본 데이터 / Bean 객체 주입 방법  (0) 2013.09.16
스프링 개념(?)  (0) 2013.09.16
Posted by 꼬렙
:

ㅇ 생성자를 이용한 방법

    - 기본 데이터 주입

      스프링 설정 XML 파일 ex) config.xml

<bean id="first" class="com.spring.exam.First">

    <constructor-arg>

        <value>testuser</value>

    </constructor-arg>

</bean>

<constructor-arg> 태그를 사용해서 값을 주입

First.java에는 반드시 해당 값을 받아주는 생성자가 존재해야 됨

public class First {

    private String name;

    public First(String name) {

        this.name = name;

    }

}


    - Bean 객체 주입

<bean id="first" class="com.spring.exam.First">

    <constructor-arg>

        <ref bean="second">

    </constructor-arg>

</bean>

<bean id="second" class="com.spring.exam.Second" />


public class First {

    private Second second;

    public First(Second second) {

        this.second = second;

    }

}


ㅇ Setter 메소드를 이용한 방법

    - 기본 데이터 주입

      스프링 설정 XML 파일 ex) config.xml

<bean id="first" class="com.spring.exam.First">

    <property name="first">

        <value>testuser</value>

    </property>

</bean>

<property> 태그를 사용해서 값을 주입

First.java에는 반드시 해당 값을 받아주는 Setter 메소드가 존재해야 됨

public class First {

    private String name;

    public void setFirst(String name) {

        this.name = name;

    }

}

<property name="first">의 name이 Camel Case를 적용한 메소드명이 됨 ==> setFirst


    - Bean 객체 주입

<bean id="first" class="com.spring.exam.First">

    <property name="first">

        <ref bean="second">

    </property>

</bean>

<bean id="second" class="com.spring.exam.Second" />


public class First {

    private Second second;

    public void setFirst(Second second) {

        this.second = second;

    }

}


예제 파일

SpringExam.zip













'Spring' 카테고리의 다른 글

스프링을 사용한 파일 업로드 1  (1) 2014.03.04
web.xml 설정  (0) 2013.10.07
component-scan  (0) 2013.09.16
Autowired  (0) 2013.09.16
스프링 개념(?)  (0) 2013.09.16
Posted by 꼬렙
:

스프링 개념(?)

Spring 2013. 9. 16. 12:07 |

ㅇ 스프링을 사용하는 이유

    - 개발시 테스트하기 쉬운 구조로 개발하는 것이 가능하도록 지원되어서..

    - 유지보수와 확장성에 큰 효과가 있어서..

      ㆍ인스턴스 생성과 클래스간의 의존관계에 대한 고민을 줄여줌

      ㆍ유지보수 및 확장성이 좋으려면 디자인 패턴까지 확실히 이해한 상황에서 설계 및 구현이 진행되어야 하는데

         스프링을 사용함으로써 개발자가 의도하지 않더라도 인스턴스 생성부터 의존관계를 관리하는 것이 가능하도록 지원됨

    - 등등등.....


ㅇ 스프링과 관련하여 항상 맨 처음 나오는 2가지 개념

    - IoC (Inversion of Control) / DI (Dependency Injection) : 제어의 역전 / 의존성 주입

      ㆍIoC : 클래스의 생명주기를 개발자가 제어하는 것이 아니라 스프링이 제어

      ㆍDI : 사용할 클래스를 인터페이스로 미리 받아놓음, 클래스 내에서 직접 인스턴스를 생성하지 않음

         ※ 스프링을 사용하지 않더라도 IoC의 개념은 이미 적용되어서 사용되고 있었지만 스프링은 POJO 까지 제어

         ※ POJO (Plain Old Java Object) : 오래된 방식의 자바 클래스 / 서블릿 등 특수 클래스를 제외한 모든 일반 자바 클래스


    - AOP (Aspect Oriented Programming) : 관점 지향 프로그래밍

      ㆍ기능을 핵심 비지니스 로직과 공통 모듈로 구분하고, 핵심 로직에 영향을 미치지 않게 사이사이에 공통 모듈을 효과적으로

         끼워넣는 개발 방법

      ㆍ공통 모듈(보안 인증, 로그 등)을 만든 후 작성하는 코드 밖에서 이 모듈을 비지니스 로직에 삽입하는 것






※ 참고자료 : 여러 블로그 & 스프링 서적 (Spring 3.0 프로그래밍 최범균님 저, Spring in Action 크레이그 월즈 저 / 홍영표님 역)

'Spring' 카테고리의 다른 글

스프링을 사용한 파일 업로드 1  (1) 2014.03.04
web.xml 설정  (0) 2013.10.07
component-scan  (0) 2013.09.16
Autowired  (0) 2013.09.16
기본 데이터 / Bean 객체 주입 방법  (0) 2013.09.16
Posted by 꼬렙
: